IPFS:區塊鏈存儲方案技術深度解析

IPFS:區塊鏈存儲方案技術深度解析

結合上面的部分, 我們重點介紹一下CID。

CID 是IPFS分佈式文件系統中標準的文件尋址格式,它集合了內容尋址、加密散列算法和自我描述的格式, 是IPLD 內部核心的識別符。目前有2個版本,CIDv0 和CIDv1。

CIDv0是一個向後兼容的版本,其中:

  • multibase 一直為 base58btc

  • multicodec 一直為 protobuf-mdag

  • version 一直為 CIDv0

  • multihash 表示為cidv0 ::=

為了更靈活的表述ID數據, 支持更多的格式, IPLD 定義了CIDv1,CIDv1由4個部分組成:

IPFS:區塊鏈存儲方案技術深度解析

  • multibase

  • version

  • multicodec

  • multihash

IPLD 是IPFS 的數據描述格式, 解決了如何定義數據的問題, 下面這張圖是結合源代碼整理的一份邏輯圖,我們可以看到上面是一些高級的接口, 比如file, mfs, fuse 等。 下面是數據結構的持久化部分,節點之間交換的內容是以block 為基礎的, 最下面就是物理存儲了。比如block 存儲在blocks 目錄, 其他節點之間的信息存儲在leveldb, 還有keystore, config 等。

IPFS:區塊鏈存儲方案技術深度解析

3.2 數據如何傳輸呢?

接下來我們介紹libP2P, 看看數據是如何傳輸的。libP2P 是個模塊化的網絡協議棧。

IPFS:區塊鏈存儲方案技術深度解析

做過socket編程的小夥伴應該都知道, 使用raw socket 編程傳輸數據的過程,無非就是以下幾個步驟:

  1. 獲取目標服務器地址

  2. 和目標服務器建立連接

  3. 握手協議

  4. 傳輸數據

  5. 關閉連接

libP2P 也是這樣,不過區別在於它把各個部分都模塊化了, 定義了通用的接口, 可以很方便的進行擴展

3.2.1 架構圖

IPFS:區塊鏈存儲方案技術深度解析

由以下幾個部分組成,分別是:

  • Peer Routing

  • Swarm (傳輸和連接)

  • Distributed Record Store

  • Discovery

下面我們對它們做分別介紹, 我們先看關鍵的路由部分。

3.2.2 Peer Routing

libP2P定義了routing 接口,目前有2個實現,分別是KAD routing 和 MDNS routing, 擴展很容易, 只要按照接口實現相應的方法即可。

ipfs 中的節點路由表是通過維護多個K-BUCKET來實現的, 每次新增節點, 會計算節點ID 和自身節點ID 之間的common prefix, 根據這個公共前綴把節點加到對應的KBUCKET 中, KBUCKET 最大值為20, 當超出時,再進行拆分。

IPFS:區塊鏈存儲方案技術深度解析

更新路由表的流程如下:

IPFS:區塊鏈存儲方案技術深度解析

除了KAD routing 之外, IPFS 也實現了MDNS routing, 主要用來在局域網內發現節點, 這個功能相對比較獨立, 由於用到了多播地址, 在一些公有云部署環境中可能無法工作。

3.2.3 Swarm(傳輸和連接)

swarm 定義了以下接口:

  • transport 網絡傳輸層的接口

  • connection 處理網絡連接的接口

  • stream multiplex 同一connection 複用多個stream的接口

下面我們重點看下是如何動態協商stream protocol 的,整個流程如下:

IPFS:區塊鏈存儲方案技術深度解析

  1. 默認先通過multistream-select 完成握手

  2. 發起方嘗試使用某個協議, 接收方如果不接受, 再嘗試其他協議, 直到找到雙方都支持的協議或者協商失敗。

另外為了提高協商效率, 也提供了一個ls 消息, 用來查詢目標節點支持的全部協議。

3.2.4 Distributed Record Store

record 表示一個記錄, 可以用來存儲一個鍵值對,比如ipns name publish 就是發佈一個objectId 綁定指定 node id 的record 到ipfs 網絡中, 這樣通過ipns 尋址時就會查找對應的record, 再解析到objectId, 實現尋址的功能。

3.2.5 Discovery

目前系統支持3種發現方式, 分別是:

  • bootstrap 通過配置的啟動節點發現其他的節點

  • random walk 通過查詢隨機生成的peerID, 從而發現新的節點

  • mdns 通過multicast 發現局域網內的節點

最後總結一下源代碼中的邏輯模塊:

IPFS:區塊鏈存儲方案技術深度解析

從下到上分為5個層次:

  • 最底層為傳輸層, 主要封裝各種協議, 比如TCP,SCTP, BLE, TOR 等網絡協議

  • 傳輸層上面封裝了連接層,實現連接管理和通知等功能

  • 連接層上面是stream 層, 實現了stream的多路複用

  • stream層上面是路由層

  • 最上層是discovery, messaging以及record store 等

四、總結

本文從定義數據和傳輸數據的角度分別介紹了IPFS的2個主要模塊IPLD 和 libP2P:

  • IPLD 主要用來定義數據, 給數據建模

  • libP2P 解決數據傳輸問題

這兩部分相輔相成, 雖然都源自於IPFS項目,但是也可以獨立使用在其他項目中。

IPFS的遠景目標就是替換現在瀏覽器使用的 HTTP 協議, 目前項目還在迭代開發中, 一些功能也在不斷完善。為了解決數據的持久化問題, 引入了filecoin 激勵機制, 通過token激勵,讓更多的節點加入到網絡中來,從而提供更穩定的服務。


分享到:


相關文章: