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

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值