IPFS的数据结构——Merkle DAG

Merkle DAG是IPFS核心的数据结构,IPFS整个系统都是围绕Merkle DAG进行的,而Merkle DAG本身则并不复杂。

IPFS is a stack of network protocols that organize agent networks to create, publish, distribute, serve, and download merkledags. [1]

IPFS架构

IPFS Merkle DAG的数据结构[2]

type IPFSLink struct {
      Name string
      // name or alias of this link
      Hash Multihash
      // cryptographic hash of target
      Size int
      // total size of target
}
type IPFSObject struct {
      links []IPFSLink
      // array of links
      data []byte
      // opaque content data
}

通用性

它比Merkle tree更加通用[3],Merkel Tree将文件数据都存在leaf node,而Merkel DAG每个node都可以存储数据。
对于普通存储文件,Merkel tree是完全没有问题的。
但是除了存储文件之外,IPFS意图用于更多的应用场景,采用Merkle DAG可以兼容更多的数据结构,比如区块链、Git。

区块大小限制

IPFS object包含link 和 data,data的大小限制是 2¹⁸+14 bytes(262158 bytes),
当文件小于262158 bytes,数据使用一个object存储;
但文件大于262158 bytes,则进行切割,parent object保存 child object 的hash。当我们寻找文件时,使用的是root object 的hash。

命令行

查看object的信息的常用命令:

> ipfs block stat QmSu1tBmnvugUw1Mv1ajA6jpgqtTGJnqko9ghypMrjA8jN
Key: QmSu1tBmnvugUw1Mv1ajA6jpgqtTGJnqko9ghypMrjA8jN
Size: 102
> ipfs ls QmSu1tBmnvugUw1Mv1ajA6jpgqtTGJnqko9ghypMrjA8jN
QmcqPiVqTYkMzbUEvJxHtXYoA77ebJhWt47dD9QMqrXsYa 262158
Qmbvzc3p7vnxVr6v8azL917RstXbTbyZRDA9LTBn7mTu1f 5928
> ipfs object stat QmSu1tBmnvugUw1Mv1ajA6jpgqtTGJnqko9ghypMrjA8jN
NumLinks: 2
BlockSize: 102
LinksSize: 89
DataSize: 13
CumulativeSize: 268188
> ipfs object get QmSu1tBmnvugUw1Mv1ajA6jpgqtTGJnqko9ghypMrjA8jN
{"Links":[{"Name":"","Hash":"QmcqPiVqTYkMzbUEvJxHtXYoA77ebJhWt47dD9QMqrXsYa","Size":262158},{"Name":"","Hash":"Qmbvzc3p7vnxVr6v8azL917RstXbTbyZRDA9LTBn7mTu1f","Size":5928}],"Data":"\u0008\u0002\u0018��\u0010 ��\u0010 �."}

从命令返回结果可以看出来,CID为 QmSu1tBmnvugUw1Mv1ajA6jpgqtTGJnqko9ghypMrjA8jN 的 object 的信息:

  • block size 为 102 bytes,其中link占89bytes,data占13bytes,递归获取所有child object,总共大小为 268188bytes。
  • 包含2个link,CID分别为QmcqPiVqTYkMzbUEvJxHtXYoA77ebJhWt47dD9QMqrXsYaQmbvzc3p7vnxVr6v8azL917RstXbTbyZRDA9LTBn7mTu1f,大小分别为262158,5928 bytes。

参考


  1. https://github.com/ipfs/specs/tree/master/merkledag ↩

  2. IPFS whitepaper 3.5节部分 ↩

  3. https://github.com/ipfs/go-ipfs/issues/2053 ↩

你可能感兴趣的:(IPFS的数据结构——Merkle DAG)