美文网首页
IPFS的数据结构——Merkle DAG

IPFS的数据结构——Merkle DAG

作者: 周宇盛 | 来源:发表于2018-12-20 16:36 被阅读34次

    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

          本文链接:https://www.haomeiwen.com/subject/cnaykqtx.html