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