區塊鏈
挖礦,比特幣,EOS,以太坊

IPFS: Merkle DAG數據結構

64

微信圖片_20180621155141.jpg
今天帶大家來深入探索一下IPFS的核心數據結構Merkle DAG

什么是 Merkle DAG?
Merkle DAG是IPFS系統的核心概念之一,當然Merkle DAG并不是IPFS團隊發明的,它來來自于Git數據結構,ipfs團隊進行了改造(這一點ipfs團隊一直是一個很努力的團隊,并不是直接拿來使用,而是在此基礎上修改更適合項目的使用)。
Merkle DAG的全稱是 Merkle directed acyclic graph(默克有向無環圖)。它是在Merkle tree基礎上構建的,Merkle tree是由美國計算機學家merkle于1979年申請的專利。Merkle DAG跟Merkle tree很相似,但不完全一樣,比如:Merkle DAG不需要進行樹的平衡操作,非葉子節點允許包含數據等。
微信圖片_20180621155144.jpg
Merkle DAG
Merkle DAG擁有如下的功能:1.內容尋址:使用多重哈希來唯一識別一個數據塊的內容2.防篡改:可以方便的檢查哈希值來確認數據是否被篡改3.去重:由于內容相同的數據塊哈希是相同的,可以很容去掉重復的數據,節省存儲空間
IPFS的數據對象格式如下:

type IPFSLink struct {????Name string?????????????// link 的名字????Hash Multihash????????// 數據的加密哈希????Size int????????????????????// 數據大小}Type IPFSObject struct {????links []IPFSLink????????// link數組????data []byte???????????????// 數據內容}I

PFS讓應用可以完全控制對象的數據字段,也就是說應用可以隨意定義自己的data類型和結構,甚至可以是一些IPFS系統無法理解的數據結構,靈活度非常的大。
下面以?的方式帶大家來看看IPFS的數據對象如何工作
第一步:準備數據一張圖片,這張圖片是小編在一個叫做 First 的地方拍攝的,好漂亮有沒有。
微信圖片_20180621155147.jpg
文件名:first.JPG? 文件大小:3646K
(如果你要測試的話,使用一個超過256k的數據文件比較好,因為ipfs當前的數據分片是 256k大小一個)
第二步:執行ipfs add 命令,添加文件

localhost:ipfs_pic tt$ ipfs add first.JPGadded QmSnqm7y5SZ8tBV4c5Qjsu7qTZQQ3vHgPH4sCjJnh5cRSL first.JPG

第三步:使用命令 ipfs -ls -v 來查看文件的分片如下所示,可以看到文件被分成了15個block。每個block大小時256k(除了最后一個)。

localhost:ipfs_pic tt$ ipfs ls -v QmSnqm7y5SZ8tBV4c5Qjsu7qTZQQ3vHgPH4sCjJnh5cRSLHash? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?Size???NameQmUNquYLeK8vMTX6U6dDhwWNPG5VVywyHoAgbSoCb6JCUe 262158QmPtKCEs6L6LgFECxuAh9VGxaxRKzGzwC8hsWKUS3wiFi3 262158QmeVDmX4M7YcDVXuHL691KWhAYxxzmGkvspJJn5Ftt86XR 262158QmPJ7u77a6Ud2G4PbRoScKyVkf1aHyLrJZPYqC17H6z5ke 262158QmQrEi8D6kYXjk9UpjbpRuaGhn5fNYH6JQkK5irfpiGanc 262158QmRQ1fAFuAvREUFT5e3qp5i1FE9AX93XEjaEwrr79QWBCD 262158Qmaixh1bG2GiDVZ4U4HBDJ27B6Sxzch1hsDEC3na88uzpE 262158QmRkDshArwx4wai6vAgATNv4ETPSbh8Ahz7hRDkNsw9LCD 262158QmXoNXfH3SnVYqk9xugyh5Zj4E4U826CfN4exWXwFrh1id 262158Qma24pVnzvtKqnNE2aexEwgCYq4YqsAFRpxL5MX5ueFpgL 262158QmTSVtNETAhugLDEpNTbRE2aKK2WrhunVNsbb6Z7htYZET 262158QmdQy6wQNMyrbZfVarHMSktgJTZrbsaUkAEZY7ACZWmDVa 262158QmatUyTZRYEj2Wi61RZ2EUqy78LJTAmz18vZYzpN2AZaES 262158QmRK9tCe4Q8xHyS1vC9qX3BDYMSscFtydaNwVYDx1PXYFA 262158QmUs5kkcutfbHzCKczAXcXri9cmfCXSincN5WTp8ard1fR 64097

當執行 ipfs add 的時候,文件first.JPG的數據被分成了一個個大小均等的block并且構造一個Merkle DAG把文件數據片組織起來。
微信圖片_20180621155151.jpg
可以使用IPFS提供的命令來查看數據塊(block)的信息,數據塊block下面還允許鏈接子數據塊(sub-block,本文的例子中沒有涉及)。
相關的查詢命令如下:ipfs block stat: 查詢block的數據大小,不包含子塊。ipfs refs:列出來數據快的子塊信息ipfs ls or ipfs object links:顯示所有的子塊和塊的大小
例如:

localhost:ipfs_pic tt$ ipfs block stat QmPtKCEs6L6LgFECxuAh9VGxaxRKzGzwC8hsWKUS3wiFi3Key: QmPtKCEs6L6LgFECxuAh9VGxaxRKzGzwC8hsWKUS3wiFi3Size: 262158

既然每一個數據塊我們都能查詢獲取到,那么我們可以手工來把數據拼起來。比如剛才小編的那張圖片,可以使用命令:

ipfs cat hash1 hash2 hash2 …… , hashn > first.JPG

這樣就可以手工得到上的那張照片,有興趣的讀者可以自己動手試試。

直接操作Merkle DAG
IPFS可以讓我們直接操作Merkle DAG的數據,舉個例子:

localhost:ipfs_pic tt$ echo “hello world” | ipfs block putQmZjTnYw2TFhn9Nn7tjmPSoTBoY7YRkwPzwSrSbabY24Kplocalhost:ipfs_pic tt$ ipfs block get QmZjTnYw2TFhn9Nn7tjmPSoTBoY7YRkwPzwSrSbabY24Kphello world

怎們樣?
很魔性吧,我們完全控制了block里面的數據內容和結構,IPFS把Merkle DAG操作權限幾乎全部下放給了開發者,開發者可以很容易構造出來自己的數據結構。
IPFS在論文里面提出了可以自己一些潛在的數據結構:鍵值對存儲(key-value stores)關系型數據庫(traditional relatioinal databases)三元組存儲(Linked Data triple stores)文檔發布系統(Linked document publishing systems)通信平臺(Linked communications platforms)加密貨幣區塊鏈(cryptocurrency blockchains)
在此基礎上開發者還可以完全自定義自己的數據結構。看到最后一條了吧,IPFS為所有的區塊鏈準備好了數據存儲結構,IPFS將作為區塊鏈的基礎設施存在。
當然,想要實現這些東西,還需要開發者的共同努力,IPFS+filecoin僅僅是為我們建造了基礎設施,上面千千萬萬的應用還需要廣大開發者來實現。IPFS+filecoin給我們提供了幾乎無限的想象空間。這是一扇通往未來的大門,有想法的讀者,抓住機會啊。

 

贊(0)

評論 搶沙發

  • 昵稱 (必填)
  • 郵箱 (必填)
  • 網址
p3试机号99