区块链
挖矿,比特币,EOS,以太坊

IPFS: Merkle DAG数据结构

64

微信图片_20180621155141.jpg
今天带大家来深入探索一下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不需要进行树的平衡操作,非叶子节点允许包含数据等。
微信图片_20180621155144.jpg
Merkle DAG
Merkle DAG拥有如下的功能:1.内容寻址:使用多重哈希来唯一识别一个数据块的内容2.防篡改:可以方便的检查哈希值来确认数据是否被篡改3.去重:由于内容相同的数据块哈希是相同的,可以很容去掉重复的数据,节省存储空间
IPFS的数据对象格式如下:

type IPFSLink struct {    Name string             // link 的名字    Hash Multihash        // 数据的加密哈希    Size int                    // 数据大小}Type IPFSObject struct {    links []IPFSLink        // link数组    data []byte               // 数据内容}I

PFS让应用可以完全控制对象的数据字段,也就是说应用可以随意定义自己的data类型和结构,甚至可以是一些IPFS系统无法理解的数据结构,灵活度非常的大。
下面以?的方式带大家来看看IPFS的数据对象如何工作
第一步:准备数据一张图片,这张图片是小编在一个叫做 First 的地方拍摄的,好漂亮有没有。
微信图片_20180621155147.jpg
文件名:first.JPG  文件大小:3646K
(如果你要测试的话,使用一个超过256k的数据文件比较好,因为ipfs当前的数据分片是 256k大小一个)
第二步:执行ipfs add 命令,添加文件

localhost:ipfs_pic tt$ ipfs add first.JPGadded QmSnqm7y5SZ8tBV4c5Qjsu7qTZQQ3vHgPH4sCjJnh5cRSL first.JPG

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

localhost:ipfs_pic tt$ ipfs ls -v QmSnqm7y5SZ8tBV4c5Qjsu7qTZQQ3vHgPH4sCjJnh5cRSLHash                                           Size   NameQmUNquYLeK8vMTX6U6dDhwWNPG5VVywyHoAgbSoCb6JCUe 262158QmPtKCEs6L6LgFECxuAh9VGxaxRKzGzwC8hsWKUS3wiFi3 262158QmeVDmX4M7YcDVXuHL691KWhAYxxzmGkvspJJn5Ftt86XR 262158QmPJ7u77a6Ud2G4PbRoScKyVkf1aHyLrJZPYqC17H6z5ke 262158QmQrEi8D6kYXjk9UpjbpRuaGhn5fNYH6JQkK5irfpiGanc 262158QmRQ1fAFuAvREUFT5e3qp5i1FE9AX93XEjaEwrr79QWBCD 262158Qmaixh1bG2GiDVZ4U4HBDJ27B6Sxzch1hsDEC3na88uzpE 262158QmRkDshArwx4wai6vAgATNv4ETPSbh8Ahz7hRDkNsw9LCD 262158QmXoNXfH3SnVYqk9xugyh5Zj4E4U826CfN4exWXwFrh1id 262158Qma24pVnzvtKqnNE2aexEwgCYq4YqsAFRpxL5MX5ueFpgL 262158QmTSVtNETAhugLDEpNTbRE2aKK2WrhunVNsbb6Z7htYZET 262158QmdQy6wQNMyrbZfVarHMSktgJTZrbsaUkAEZY7ACZWmDVa 262158QmatUyTZRYEj2Wi61RZ2EUqy78LJTAmz18vZYzpN2AZaES 262158QmRK9tCe4Q8xHyS1vC9qX3BDYMSscFtydaNwVYDx1PXYFA 262158QmUs5kkcutfbHzCKczAXcXri9cmfCXSincN5WTp8ard1fR 64097

当执行 ipfs add 的时候,文件first.JPG的数据被分成了一个个大小均等的block并且构造一个Merkle DAG把文件数据片组织起来。
微信图片_20180621155151.jpg
可以使用IPFS提供的命令来查看数据块(block)的信息,数据块block下面还允许链接子数据块(sub-block,本文的例子中没有涉及)。
相关的查询命令如下:ipfs block stat: 查询block的数据大小,不包含子块。ipfs refs:列出来数据快的子块信息ipfs ls or ipfs object links:显示所有的子块和块的大小
例如:

localhost:ipfs_pic tt$ ipfs block stat QmPtKCEs6L6LgFECxuAh9VGxaxRKzGzwC8hsWKUS3wiFi3Key: QmPtKCEs6L6LgFECxuAh9VGxaxRKzGzwC8hsWKUS3wiFi3Size: 262158

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

ipfs cat hash1 hash2 hash2 …… , hashn > first.JPG

这样就可以手工得到上的那张照片,有兴趣的读者可以自己动手试试。

直接操作Merkle DAG
IPFS可以让我们直接操作Merkle DAG的数据,举个例子:

localhost:ipfs_pic tt$ echo “hello world” | ipfs block putQmZjTnYw2TFhn9Nn7tjmPSoTBoY7YRkwPzwSrSbabY24Kplocalhost:ipfs_pic tt$ ipfs block get QmZjTnYw2TFhn9Nn7tjmPSoTBoY7YRkwPzwSrSbabY24Kphello world

怎们样?
很魔性吧,我们完全控制了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给我们提供了几乎无限的想象空间。这是一扇通往未来的大门,有想法的读者,抓住机会啊。

 

赞(0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址