IPFS:Merkle DAG 数据结构

什么是 Merkle DAG?

Merkle DAG是IPFS系统的核心概念之一,当然Merkle DAG并不是IPFS团队发明的,它来自于Git数据结构,ipfs团队进行了改造(这一点ipfs团队一直是一个很努力的团队,并不是直接拿来使用,而是在此基础上修改更适合项目的使用)。

Merkle DAG的全称是 Merkle directed acyclic graph(默克有向无环图)。它是在Merkle tree基础上构建的,Merkle tree是由美国计算机学家merkle于1979年申请的专利。Merkle DAG跟Merkle tree很相似,但不完全一样,比如:Merkle DAG不需要进行树的平衡操作,非叶子节点允许包含数据等。

Merkle DAG

Merkle DAG拥有如下的功能:

内容寻址:使用多重哈希来唯一识别一个数据块的内容

防篡改:可以方便的检查哈希值来确认数据是否被篡改

去重:由于内容相同的数据块哈希是相同的,可以很容去掉重复的数据,节省存储空间

IPFS的数据对象格式如下:

IPFS让应用可以完全控制对象的数据字段,也就是说应用可以随意定义自己的data类型和结构,甚至可以是一些IPFS系统无法理解的数据结构,灵活度非常的大。下面以例子的方式带大家来看看IPFS的数据对象如何工作第一步:准备数据一张图片,这张图片是小编在丽江的蓝月谷拍摄的,好漂亮有没有。

文件名:first.JPG 文件大小:3646K

(如果你要测试的话,使用一个超过256k的数据文件比较好,因为ipfs当前的数据分片是 256k大小一个)

第二步:执行ipfs add 命令,添加文件

第三步:使用命令 ipfs -ls -v 来查看文件的分片如下所示,可以看到文件被分成了15个block。每个block大小时256k(除了最后一个)。

当执行 ipfs add 的时候,文件first.JPG的数据被分成了一个个大小均等的block并且构造一个Merkle DAG把文件数据片组织起来。

可以使用IPFS提供的命令来查看数据块(block)的信息,数据块block下面还允许链接子数据块(sub-block,本文的例子中没有涉及)。相关的查询命令如下:

ipfs block stat: 查询block的数据大小,不包含子块。

ipfs refs:列出来数据快的子块信息

ipfs ls or ipfs object links:显示所有的子块和块的大小

例如:

既然每一个数据块我们都能查询获取到,那么我们可以手工来把数据拼起来。比如刚才小编的那张图片,可以使用命令:

这样就可以手工得到上的那张照片,有兴趣的读者可以自己动手试试。直接操作Merkle DAGIPFS可以让我们直接操作Merkle DAG的数据,举个例子:

怎们样?很魔性吧,我们完全控制了block里面的数据内容和结构,IPFS把Merkle DAG操作权限几乎全部下放给了开发者,开发者可以很容易构造出来自己的数据结构。IPFS在论文里面提出了可以自己实现一些潜在的数据结构:

键值对存储(key-value stores)

关系型数据库(traditional relatioinal databases)

三元组存储(Linked Data triple stores)

文档发布系统(Linked document publishing systems)

通信平台(Linked communications platforms)

加密货币区块链(cryptocurrency blockchains)

在此基础上开发者还可以完全自定义自己的数据结构。看到最后一条了吧,IPFS为所有的区块链准备好了数据存储结构,IPFS将作为区块链的基础设施存在。

当然,想要实现这些东西,还需要开发者的共同努力,IPFS+filecoin仅仅是为我们建造了基础设施,上面千千万万的应用还需要广大开发者来实现。IPFS+filecoin给我们提供了几乎无限的想象空间。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180906A16KBJ00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券