1. 首页
  2. 技术分享

猫片的正确打开方式:将文件添加到IPFS……

原始数据到Merkle Dags都经历了些什么

猫片的正确打开方式:将文件添加到IPFS……当你问某人他们最喜欢的猫片时,他们可能不会说“哦,哈哈,这台服务器上的那个,在这个文件路径下,搞笑的dash cat dot mp4”。相反,他们可能会描述视频的内容:“哦,哈哈,就是猫把玻璃从柜台上摔下来的地方,恶棍风格……经典”。这显然是人类的一种直观的思考方式,但这种方式在访问网络上的内容时却不那么有效了,因为像IPFS这样的分散协议实际上使用内容寻址在分散的Web上查找内容。在本文中,我们将探讨一下整个过程是如何工作的,以及将文件添加到IPFS时到底会发生什么。

指纹图谱

首先,为了支持内容寻址,我们需要想出一些方法来创建一个“指纹”或内容摘要,我们可用它来引用所说的内容。类似于想要找到一本书,我们便会使用ISBN号。实际上,Web上的内容寻址系统(如IPFS)使用加密散列函数来创建指纹。我们要获取原始内容(在本例中是一张猫咪照片),并通过一个哈希函数运行这些数据,以生成一个摘要,此摘要在密码学上保证对文件(或图像或其他内容)和该文件的内容是唯一的。如果我将该文件更改一位,哈希值将变得完全不同。

猫片的正确打开方式:将文件添加到IPFS……

从原始图像到加密摘要再到内容ID(multihash)

分解图像后(创建了一个摘要),现在呢?我们需要的是一个内容地址/标识符。所以我们现在需要把这个摘要转换成IPFS和其他可以用来定位它的系统……但事情并不那么简单。如果事情发生了变化,我们想改变我们处理内容的方式,怎么办?如果有人发明了更好的哈希函数呢?即使是我们现在拥有的IP系统也必须进行升级。

多重散列

你有没有注意到ipfs散列似乎都是从qm开始的?这是因为这些散列实际上是称为多重散列的东西。这是非常酷炫的,因为散列本身指定了其使用的散列函数,以及在多重散列的前两个字节中合成的散列的长度。在大多数示例中,十六进制的第一部分是12,其中12表示这是sha256散列函数,输出长度是20,十六进制(或32字节)…这是我们从58进制编码整件事情时得到qm的地方。那么你可能会问,为什么base58会编码整件事?因为省略了相似的字母:0(零)、O(大写O)、I(大写I)和L(小写L)以及非字母数字字符+(加号)和/(斜线),使其更易于阅读。所有这些都是因为我们想要一个未来的证明系统,允许多种不同的指纹机制共存。所以,如果这个新散列函数真的出现了,我们只简单地改变multihash的前几个字节,瞧……ipfs散列不再从qm开始……但是因为我们使用了multihash,旧的散列仍然可以工作,与新的散列一起……酷!

Merkle DAG ➞ IPLD

有了文件后,对此文件进行散列和编码,我们可能以为我们操作的看到的就是整个过程了,但事实并非如此…

猫片的正确打开方式:将文件添加到IPFS……

大文件被分块、散列并组织成一个IPLD(Merkle DAG对象)。

内容则分为更小的部分(每个部分约256K),散列每个部分,为每个块创建一个CID,然后这些块组合成一个层次数据结构,计算一个基本的CID。

这种数据结构本质上是一种称为Merkle DAG或有向无环图的结构。

以下是协议实验室的Juan Benet的精彩视频,解释了IPFS如何使用Merkle Dags作为其核心数据结构……对于所谓的星际链接数据(IPLD)结构:

https://www.youtube.com/watch?v=Bqs_LzBjQyk&feature=youtu.be

链接数据

分散式Web社区中的人们讨论链接数据已有很长一段时间。蒂姆•伯纳斯•李多年来也一直致力于链接数据,而且,他的新公司Solid正围绕这一点开展业务。

从本质上讲,我们所说的是一个结构,这个结构把所有东西都建模为一系列链接的对象。在IPLD世界中存在着对象,每个对象都有数据和链接字段(其中数据可以是一小团非结构化的任意二进制数据,而链接是一组链接结构,这些结构只是到其他IPFS对象的链接)。说到链接,每个链接都有一个名称、链接对象的散列(或cid)和一个表示链接对象大小的大小。另外,最后一点信息实际上只是为了在没有预先获取太多的数据的情况下,估计对象/文件的大小。

IPLD(对象)

  • 数据-blob非结构化二进制数据,大小小于256 kb。
  • 链接-链接结构数组。这些是到其他IPFS对象的链接。

链接结构有三个数据字段

  • 名称-链接的名称
  • 链接IPFS对象的哈希-哈希
  • 大小-链接的IPFS对象的累计大小,包括其链接

实践学习

我们实际上可以使用ipfs命令行工具来探索ipld对象。因此,您要安装IPFS,并且能够轻松地使用IPFS命令。如果您需要一个入门教程,请查看我们的textile构建系列的第1部分。准备好后,我们将快速查看对象结构以获得不同的猫咪图像(使用方便的dandy jq工具)。从下面的命令开始,将获取ipfs对象的结果传递给jq命令。

id="bd4d" class="graf graf--pre graf-after--p">ipfs object get QmW2WQi7j6c7UgJTarActp7tDNikE4B2qXtFCfLPdsgaTQ | jq

接下来的输出

id="60c7" class="graf graf--pre graf-after--p">{
  "Links": [
    {
      "Name": "cat.jpg",
      "Hash": "Qmd286K6pohQcTKYqnS1YhWrCiS4gz7Xi34sdwMe9USZ7u",
      "Size": 443362
    }
  ],
  "Data": "\b\u0001"
}

请注意,此对象包含一个Link,我们可以使用相同的命令进一步研究该链接:

id="b088" class="graf graf--pre graf-after--p">ipfs object get Qmd286K6pohQcTKYqnS1YhWrCiS4gz7Xi34sdwMe9USZ7u | jq

从而产生以下输出。注意: 这两个Links的大小都小于256K:

id="e13c" class="graf graf--pre graf-after--p">{
  "Links": [
    {
      "Name": "",
      "Hash": "QmPEKipMh6LsXzvtLxunSPP7ZsBM8y9xQ2SQQwBXy5UY6e",
      "Size": 262158
    },
    {
      "Name": "",
      "Hash": "QmT8onRUfPgvkoPMdMvCHPYxh98iKCfFkBYM1ufYpnkHJn",
      "Size": 181100
    }
  ],
  "Data": "\b\u0002\u0018ކ\u001b ��\u0010 ކ\u000b"
}

由于DAGS(简单的基于链接的图)的灵活特性,我们可以使用IPLD来表示我们想要的任何数据结构。例如,假设您具有以下目录结构,并且希望将其添加到IPFS中。第一,操作简单(见下文),第二,使用DAG来表示IPFS中的数据的优势变得很明显,我们稍后将看到。

id="398c" class="graf graf--pre graf-after--p">test_dir/
├── bigfile.js
├── *hello.txt
└── my_dir
    ├── *my_file.txt
    └── *testing.txt

在本例中,假设所有带有星号(*)-hello.txt、my_file.txt和testing.txx的三个文件都包含相同的文本:“hello world!/n”。现在让我们将它们添加到IPFS中:

id="5532" class="graf graf--pre graf-after--p">ipfs add -r test_dir/

当你这样做的时候,你最终会得到一个像这样的DAG:

猫片的正确打开方式:将文件添加到IPFS……
目录结构图,最初来自Consensys博客

其中(取决于目录中文件的实际内容),您最终得到一系列通过CID链接的对象。在顶层,有实际的文件夹,没有名称,但是有一个cid。从那里我们可以直接链接到bigfile.js、底层的my_dir和hello.txt。从my_dir(中间)有指向my_file.txt和testing.txt的链接,这两个链接实际上引用了相同的cid!这很酷。因为我们引用了内容(而不是文件本身),所以我们“免费”得到了重复数据消除!最后,在左下角,我们有bigfile.js,它分为三个较小的部分,每个部分都有自己的cid,这些cid一起构成较大的文件。如果您在tree跟踪所有这些CID,就会得到一个描述其下内容的CID。这很关键…

事实上,我们有数据和链接,这给了我们的IPFS对象集合一个类似于图的结构(或树)。同样,dag的意思是有向无环图,而merkle来自发明家拉尔夫merkle的名字,他在1979年获得了哈希树的专利。无论如何,Merkle Dags让我们得到的是内容寻址,所有内容都由其加密散列进行唯一标识,包括指向其引用内容的链接。这使结构不受篡改,因为所有内容都通过其哈希-右哈希、右内容进行验证。同样,由于对文件的内容进行散列,所以没有重复,因为在Merkle DAG世界中,所有包含相同内容的对象都被认为是相等的(即,它们的散列值是相同的),因此我们只存储一次。(通过设计消除重复)

我们可以利用merkle-dags的这种想法,从命令行中将大对象分块。例如,一个大JPG,可以使用ipfs cat它,也可以直接从github下载,如果您需要:

id="6ab5" class="graf graf--pre graf-after--p">ipfs cat QmWNj1pTSjbauDHpdyg5HQ26vYcNWnubg1JehmwAE9NnU9 > cosmos.jpg

现在您可以在本地add它,如果您一开始已经cat,请确保哈希匹配(这里我们将返回的哈希分配给env变量hash):

id="0654" class="graf graf--pre graf-after--p">hash=`ipfs add -q cosmos.jpg`
echo $hash
返回一个与此完全类似的cid散列(和一些进展)
id="9c54" class="graf graf--pre graf-after--p">QmWNj1pTSjbauDHpdyg5HQ26vYcNWnubg1JehmwAE9NnU9

现在,让我们来看看这个特定图像的底层IPFS object:

id="3f60" class="graf graf--pre graf-after--p">ipfs ls -v $hash

请注意,每个链接的对象大约是256K。这些块一起构成了整个图像。因此,当从网络请求这个文件时,我们实际上可以从不同的对等端获取位,然后我们的对等端将它放在和处,以提供我们想要的文件。真正的去中心化!

id="b805" class="graf graf--pre graf-after--p">Hash                                           Size   Name
QmPHPs1P3JaWi53q5qqiNauPhiTqa3S1mbszcVPHKGNWRh 262158
QmPCuqUTNb21VDqtp5b8VsNzKEMtUsZCCVsEUBrjhERRSR 262158
QmS7zrNSHEt5GpcaKrwdbnv1nckBreUxWnLaV4qivjaNr3 262158
QmQQhY1syuqo9Sq6wLFAupHBEeqfB8jNnzYUSgZGARJrYa 76151

您还可以使用这个超级新超级有趣的工具在浏览器中探索DAG(IPLD OBEJCTS)。看看Git的例子,或者探索上面的DAG对象。 现在,为了向您展示上述四个块确实构成了单个图像,您可以使用以下代码“手动”将这些块连接在一起以创建图像文件-,这基本上是当您引用基本的cid时cat在后台所做的:

id="6d88" class="graf graf--pre graf-after--p">ipfs cat \
QmPHPs1P3JaWi53q5qqiNauPhiTqa3S1mbszcVPHKGNWRh \
QmPCuqUTNb21VDqtp5b8VsNzKEMtUsZCCVsEUBrjhERRSR \
QmS7zrNSHEt5GpcaKrwdbnv1nckBreUxWnLaV4qivjaNr3 \
QmQQhY1syuqo9Sq6wLFAupHBEeqfB8jNnzYUSgZGARJrYa \
> cat-cosmos.jpg
open cat-cosmos.jpg
或者,您可以再次使用通道简化此操作:
id="df27" class="graf graf--pre graf-after--p">ipfs refs $hash | ipfs cat > test.jpg ; open test.jpg

一路往下都是链接。此外,还有一些IPFS命令行工具来操作IPFSDAG对象,这会使我们的操作变得非常方便!

扼要重述

让我们做一个简短的回顾。Merkle DAG是IPFS的核心概念,但Merkle DAG也是许多其他技术的核心,如Git、比特币、DAT等。这些DAG基本上是由内容块组成的哈希“树”,每个都有一个独特的哈希。您可以引用该树中的任何块,这意味着您可以从任何子块组合中构建树。这给我们带来了关于DAG的另一个了不起的东西,特别是在处理大型文件时:要引用大型数据文件,所需要的只是基本的cid,并且您实际上拥有对整个对象的经过验证的引用。对于存储在网络上多个位置的大型流行文件,发送CID,然后从多个对等机请求位,这使得文件共享变得轻而易举,意味着您只需要共享几个字节而不是整个文件。

当然,您很少直接与DAG或对象交互。大多数情况下,友好的ipfs add命令只需根据指定文件中的数据创建merkle dag,创建底层的ipns对象就可以继续。所以问题的答案是“当你向ipfs添加一个文件时到底发生了什么?“是……密码学、数学、网络和一些魔法!

感谢您的阅读!

原创文章,作者:三色団子,如若转载,请注明出处:https://ipfsdrop.com/tech/bawenjiantianjiadaoipfshuifashengshenme/

发表评论

电子邮件地址不会被公开。 必填项已用*标注

联系我们

(+86)18301922335

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

邮件:haskell@freechains.cn

工作时间:7×24小时

QR code