1. 概念
- IPLD是基於內容尋址的數據模型的抽象層,IPLD能夠連接起各類 以內容尋址爲主的數據結構。設計IPLD的初衷是希望這一數據結構不 僅能應用於IPFS,而且能爲其他通過哈希類型檢索的數據提供一個通用 的數據模型。
- IPLD實現跨系統和協議的引用,統一該類數據結構。
- IPLD不是單個規範,而是一組規範。IPLD中的許多規範是相互依賴的。
2. ipld層模型
┌──────────────────────────────────────────────────┐
│ │
│ Schema Layer │
│ (advanced types for multi-block data structures) │
│ │
├──────────────────────────────────────────────────┤
│ │
│ Data Model Layer │
│ (basic types for single-block data structures) │
│ │
├──────────────────────────────────────────────────┤
│ │
│ Block Layer │
│ (cid, data, codec) │
│ │
└──────────────────────────────────────────────────┘
3. 塊層 (Block Layer)
塊層包含所有內容尋址的塊格式,並指定如何尋址塊,自描述其編解碼器以進行編碼/解碼以及塊之間如何鏈接。僅這一層就足以完成各種格式(eth,btc,git,dag-pb,dag-cbor等)的基本圖形複製。
儘管許多編解碼器可能會將這些格式轉換爲本地類型,但該層並未定義數據結構或類型,但是在塊層沒有類型要求或類型保證
3.1 塊 (block)
一個ipld塊由一個cid和二進制數據值組成
短版本:
+-----+--------------------------------+
| CID | Data |
+-----+--------------------------------+
長版本:
+-----------------------------------+------------------+
| CID | Binary Data |
| +------------------------------+ | |
| |Codec | | |
| +------------------------------+ | |
| |Multihash | | |
| | +----------+---------------+ | | |
| | |Hash Type | Hash Value | | | |
| | +----------+---------------+ | | |
| | | | |
| +------------------------------+ | |
| | |
+-----------------------------------+------------------+
3.2 內容可尋址 (Content Addressability)
內容可尋址系統不是通過字符串標識符或URL來引用內容,而是通過密碼哈希來引用內容。由於標識符未指定檢索方法,因此可以完全分散內容,並且提供了一種驗證內容的安全方法。
3.3 多重hash (Multihash)
Multihash不同於特定哈希算法的格式。Multihash描述了用於哈希的算法以及哈希值。
+-----------+----------------------------+
| Hash Type | Hash Value |
+-----------+----------------------------+
SHA-256 example.
+---------+------------------------------------------------------------------+
| SHA-256 | 2413fb3709b05939f04cf2e92f7d0897fc2596f9ad0b8a9ea855c7bfebaae892 |
+---------+------------------------------------------------------------------+
3.4 序列化和格式化 (serialization-and-formats)
┌────────────────────┐ ┌────────────────────┐
│ │ │ │
│ Serializer │ │ Deserializer │
│ │ │ │
└─────────┬──────────┘ └──────────^─────────┘
│ │
│ Sent to another peer │
│ │
┌─────────v──────────┐ ┌──────────┴─────────┐
│ │ │ │
│ Format ├─────────────> Format │
│ │ │ │
└────────────────────┘ └────────────────────┘
formats可以按其希望的任何方式表示對象類型和樹結構。包括現有的表示形式(JSON,BSON,CBOR,Protobuf,msgpack等),甚至是新的自定義序列化。
“formats”是IPLD link和path的標準化表示。
它描述瞭如何在結構化數據和二進制數據之間轉換。
3.5 CID
CID是一種自描述的內容尋址標識符,它使用哈希來實現內容尋 址。其中,MultiFormats實現自我描述功能,即MultiHash實現自描述哈 希,MultiCodec自描述內容類型,MultiBase實現CID編碼。CID目前有 兩個版本,分別爲CIDv0和CIDv1。因爲歷史原因,CIDv0只適用於IPFS 默認的編碼規則和加密算法。而CIDv1適應算法和編碼規則大大增加。 目前,部分CIDv1已經兼容了CIDv0格式。
短版本:
+-------+------------------------------+
| Codec | Multihash |
+-------+------------------------------+
長版本:
+------------------------------+
|Codec |
+------------------------------+
|Multihash |
| +----------+---------------+ |
| |Hash Type | Hash Value | |
| +----------+---------------+ |
| |
+------------------------------+
CIDv1:
<multibase type><version><multicodec><multihash>
<multibase type>:Multi-Base前綴代碼,佔用1~2字節。用於描述
該CID的編碼格式,若爲二進制編碼,可以將其省略。
<version>:CID版本號。
<multicodec>:Multi-Codec內容識別符。
<multihash>:完整的Multi-Hash
CIDv0:
<multibase type><version><multicodec><multihash>
<multibase type>:在CIDv0中默認值爲Base58,其multibase二進制
映射爲Z。
<version>:在CIDv0中默認爲0。
<multicodec>:在CIDv0中默認爲protobuf格式,其二進制表示爲 0x50。
<multihash>:完整的Multi-Hash。
3.6 ipld選擇器(ipld selector)
IPLD選擇器是標識(“選擇”)IPLD dag中節點子集的表達式
3.7 graph同步(graphsync )
跨peer同步graphs的協議,graph指dag。
同步生命週期:
1.請求者需要對請求進行編碼並將其發送給響應者
2.響應者需要接收請求,並根據請求執行IPLD選擇器查詢
3.響應者需要從本地存儲中加載塊,以便IPLD可以執行選擇器查詢
4.響應者需要編碼遍歷的塊並將有關遍歷的元數據發送給請求者
5.請求者需要驗證收到的塊實際上是所請求選擇器查詢的正確塊。爲此,它在本地執行選擇器查詢,並從網絡提供響應。
6.請求者一旦驗證就需要存儲收到的塊
7.請求者需要將遍歷的節點返回給Graphsync調用者
參考go實現架構
3.8 內容可尋址地址(Content Addressable aRchives (CAR / .car))
CAR格式可用於以IPLD塊數據的形式存儲內容可尋址對象的字節序列。通常在帶有.car文件擴展名的文件中。CAR格式旨在作爲任何IPLD DAG(圖形)的序列化表示形式,作爲其塊的級聯,以及用於描述文件中圖形的標頭(通過根CID)。對CAR中的塊形成相干DAG的要求不嚴格,因此CAR格式也可以用於存儲任意IPLD塊。
CAR格式包括一系列以長度爲前綴的IPLD塊數據,其中CAR中的第一個塊是標爲CBOR的標頭,其餘塊形成CAR的數據組件,並且每個塊均附加有其CID前綴。CAR中每個塊的長度前綴被編碼爲“ varint”(無符號128位整數)。該整數指定該塊條目的剩餘字節數-不包括用於編碼整數的字節,但包括非標頭塊的CID。
|--------- Header --------| |---------------------------------- Data -----------------------------------|
[ varint | dag-cbor block ] [ varint | CID | block ] [ varint | CID | block ] [ varint | CID | block ] …
4. 數據模型層 (Data Model Layer)
數據模型層描述了一組由IPLD編解碼器的子集實現的基本必需類型。
4.1 ipld數據模型
IPLD數據模型是IPLD規範的核心部分,該模型描述了IPLD中可表示的數據。
類型:Null、Boolean、Integer、Float、String、Bytes、List、Map、Link
遞歸類型:List、Map
kind go實現
DagCBOR、DAG-JSON支持完整的ipld數據模型
4.2 ipld路徑
IPLD路徑是用於深度引用IPLD圖的字符串標識符
路徑遵循與URI路徑相似的轉義和分段規則、約束構造
5. 模式層 (Schema Layer)
IPLD架構定義了從數據模型層(第1層)到包含複雜佈局的實例化數據結構的映射
5.1 IPLD Multi-block Collections
Set、List、Queue、Stack、SortedSet、Map、ListMap、SortedMap
5.2 IPLD Schemas
struct、Unions、Enumerations
類型定義、字段的必填、可爲空等驗證
5.3 HashMap
參考
https://github.com/ipld/specs