1. IPFSER首页
  2. IPFS

IPFS: Merkle DAG 数据结构

Merkle DAG是IPFS系统的核心概念之一,当然Merkle DAG并不是IPFS团队发明的,它来自于Git数据结构,ipfs团队进行了改造。

IPFS: Merkle DAG 数据结构

今天带大家来深入探索一下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不需要进行树的平衡操作,非叶子节点允许包含数据等。

IPFS: Merkle DAG 数据结构

Merkle DAG

Merkle DAG拥有如下的功能:

  • 内容寻址:使用多重哈希来唯一识别一个数据块的内容
  • 防篡改:可以方便的检查哈希值来确认数据是否被篡改
  • 去重:由于内容相同的数据块哈希是相同的,可以很容去掉重复的数据,节省存储空间

IPFS的数据对象格式如下:

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

IPFS让应用可以完全控制对象的数据字段,也就是说应用可以随意定义自己的data类型和结构,甚至可以是一些IPFS系统无法理解的数据结构,灵活度非常的大。

下面以例子的方式带大家来看看IPFS的数据对象如何工作

第一步:准备数据

一张图片,这张图片是小编在一个叫做 First 的地方拍摄的,好漂亮有没有。

IPFS: Merkle DAG 数据结构

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

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

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

localhost:ipfs_pic tt$ ipfs add first.JPGaddedQmSnqm7y5SZ8tBV4c5Qjsu7qTZQQ3vHgPH4sCjJnh5cRSL first.JPG

第三步:使用命令 ipfs -ls -v 来查看文件的分片

如下所示,可以看到文件被分成了15个block。每个block大小时256k(除了最后一个)。

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

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

IPFS: Merkle DAG 数据结构

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

相关的查询命令如下:

  • ipfs block stat: 查询block的数据大小,不包含子块。
  • ipfs refs:列出来数据快的子块信息
  • ipfs ls or ipfs object links:显示所有的子块和块的大小

例如:

localhost:ipfs_pic tt$ ipfs block statQmPtKCEs6L6LgFECxuAh9VGxaxRKzGzwC8hsWKUS3wiFi3Key: QmPtKCEs6L6LgFECxuAh9VGxaxRKzGzwC8hsWKUS3wiFi3Size: 262158

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

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

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

直接操作Merkle DAG

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

localhost:ipfs_pic tt$ echo "hello world" | ipfs block putQmZjTnYw2TFhn9Nn7tjmPSoTBoY7YRkwPzwSrSbabY24Kplocalhost:ipfs_pic tt$ ipfs block getQmZjTnYw2TFhn9Nn7tjmPSoTBoY7YRkwPzwSrSbabY24Kphello 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给我们提供了几乎无限的想象空间。这是一扇通往未来的大门,有想法的读者,抓住机会啊。

原创文章,作者:Ironyecho,如若转载,请注明出处:https://ipfser.org/2018/01/25/merkledagshujujiegou/

发表评论

登录后才能评论

评论列表(2条)

  • xfengltl
    xfengltl 2018年1月29日 下午12:10

    get,操作一波

  • qiuuvijw
    qiuuvijw 2018年3月13日 下午5:41

    看不明白如何上传一张图片,add命令怎么执行?需要下载什么吗

联系我们

在线咨询:点击这里给我发消息

邮件:ipfsforce@qq.com

工作时间:周一至周五,9:30-18:30,节假日休息

QR code