ipld規範

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章