在本部分中,我们将把它提升到一个新的水平,我们将创建一个目录结构并做实验,以更多地了解IPFS的工作原理和功能,但在此之前,我们必须着眼于Christian Lundkvist博士的例子。
在本部分中,我们将把它提升到一个新的水平,我们将创建一个目录结构并做实验,以更多地了解IPFS的工作原理和功能,但在此之前,我们必须着眼于Christian Lundkvist博士的例子。
IPFS (InterPlanetary文件系统)是经过充分测试的互联网技术(如DHT , Git版本控制系统和Bittorrent)的综合 。 它创建一个允许交换IPFS对象的P2P群。 IPFS对象的整体形成一个密码认证的数据结构,称为Merkle DAG ,这个数据结构可以用来模拟许多其他数据结构。 我们将在本文中介绍IPFS对象和Merkle DAG,并给出可以使用IPFS建模的结构示例。
IPFS对象
IPFS本质上是一个用于检索和共享IPFS对象的P2P系统。 IPFS对象是一个包含两个字段的数据结构:
链接结构有三个数据字段:
Size字段主要用于优化P2P网络,在这里我们将主要忽略它,因为在概念上它不需要逻辑结构。
IPFS对象通常由Base58编码的散列引用。 例如,让我们使用IPFS命令行工具(请在家中尝试此操作)来查看使用散列QmarHSr9aSNaPSR6G9KFPbuLV9aEqJfTk1y9B8pdwqK4Rq的IPFS对象:
$ ipfs对象获取QmarHSr9aSNaPSR6G9KFPbuLV9aEqJfTk1y9B8pdwqK4Rq
{ “链接”:[ { “名称”:“AnotherName”, “哈希”:“QmVtYjNij3KeyGmcgg7yVXWskLaBtov3UYL9pgcGK3MCWu”, “尺寸”:18 }, { “名称”:“SomeName”, “哈希”:“QmbUSy8HCn8J4TMDRRdxCbK2uCCtkQyZtY6XYv3y7kLgDC”, “尺寸”:58 } ] “数据”:“Hello World!” }
读者可能会注意到所有散列都以“Qm”开头。 这是因为哈希实际上是一个多哈哈,这意味着哈希本身在多哈哈的前两个字节中指定哈希函数和哈希长度。 在上面的例子中,前面两个字节的十六进制数是 1220
,其中 12
表示这是SHA256哈希函数,而 20
是哈希的长度(以字节为单位) - 32个字节。
数据和已命名的链接为IPFS对象的集合提供了一个Merkle DAG - DAG(指向无环图)的结构, Merkle表示这是一个使用加密哈希来加密内容的加密认证的数据结构。 作为练习留给读者思考为什么在这个图表中不可能有循环。
为了可视化图形结构,我们将通过节点中的Data
以图形形象化IPFS对象,并且Links
将图形边缘定向到其他IPFS对象,其中链接的Name
是图形边缘上的标签。 上面的例子可视化如下:
现在让我们做一些实际的东西来验证它。 为此,我们将继续第1部分 。 因此,在ipfsdir目录下创建一个子目录并将其命名为ipfssubdir。 在ipfssubdir下创建一个.txt文件并将其命名为 ipfsrocks.txt的内容为IPFS Rocks !!
当我们从ipfsdir外部输入以下内容时,我们可以看到目录结构。
$ ls -R ipfsdir /
hello.txt ipfssubdir
ipfsdir // ipfssubdir:
ipfsrocks.txt
现在让我们将这些文件和目录添加到IPFS
$ ipfs add ipfsdir -r
添加了QmWATWQ7fVPP2EFGu71UkfnqhYXDYH566qy47CnJDgvs8u ipfsdir / hello.txt
添加了QmdWAgBc1yjQz6G3wNSmeQk7ZFBAh7LvaL7GSiFDEvCMGT ipfsdir / ipfssubdir / ipfsrocks.txt
添加QmSC7kzH6k6W8Pf8i98NivocmT2jcYPgDhZtMWahmZUczg ipfsdir / ipfssubdir
添加了QmRuftkYACe3pCjyoZGXYyr1HdqctecmPcq8C9oFyMxgaS ipfsdir
我们可以看到,对于hello.txt文件,它已经生成了与第1部分中相同的散列。
现在,我将在ipfssubdir中添加一个与hello.txt相同内容的helloworld.txt文件, 即Hello World ,并将其添加到IPFS。
让我们看看IPFS如何添加这些文件。
$ ipfs add ipfsdir -r
添加了QmWATWQ7fVPP2EFGu71UkfnqhYXDYH566qy47CnJDgvs8u ipfsdir / hello.txt
添加了QmWATWQ7fVPP2EFGu71UkfnqhYXDYH566qy47CnJDgvs8u ipfsdir / ipfssubdir / helloworld.txt
添加了QmdWAgBc1yjQz6G3wNSmeQk7ZFBAh7LvaL7GSiFDEvCMGT ipfsdir / ipfssubdir / ipfsrocks.txt
添加了Qmd2zXenEQVBGt1wbYYDXZFBQiXCvfU7JkZb7u1Sw7ujRd ipfsdir / ipfssubdir
添加了QmNoX6nF2ccQkH3AHKy4HvphK8WwHa19eez7YqjrxEUE2z ipfsdir
如果我们观察,我们可以看到IPFS为ipfsdir / hello.txt和ipfsdir / ipfssubdir / helloworld.txt生成了相同的哈希码,因为它们都具有相同的内容。 我将在短时间内对此进行更多解释。
让我们像之前那样让这些文件被节点网络访问
$ ipfs pin add QmNoX6nF2ccQkH3AHKy4HvphK8WwHa19eez7YqjrxEUE2z
现在启动守护程序将IPFS机器连接到网络并访问文件
$ ipfs守护进程 正在初始化守护进程... 将当前ulimit调整为2048 ... ...................................
在新终端运行同行
$ ipfs swarm peers
运行下面的链接检查目录,完全加载到IPFS上: https ://ipfs.io/ipfs/QmNoX6nF2ccQkH3AHKy4HvphK8WwHa19eez7YqjrxEUE2z
上面的例子以图形方式显示如下:
为了理解版本控制,我们现在将文件helloworld.txt的内容更改为Hello World IPFS。 我们可以看到已更改文件和相应目录的哈希值的变化。
$ ipfs add ipfsdir -r
添加了QmWATWQ7fVPP2EFGu71UkfnqhYXDYH566qy47CnJDgvs8u ipfsdir / hello.txt
添加了QmamMpGqGkkf3v1iApshHoTHjx2PXJPJWvqQ8y55eeeoYn ipfsdir / ipfssubdir / helloworld.txt
添加了QmdWAgBc1yjQz6G3wNSmeQk7ZFBAh7LvaL7GSiFDEvCMGT ipfsdir / ipfssubdir / ipfsrocks.txt
添加了QmWtucfHnZhbURkUAnzJtsoj7pVi8TmLp9K1WSD1C2jJqc ipfsdir / ipfssubdir
添加了QmbzoYKQ8FvWDTQ5KX8LpeRWt4w48QXRgaFaKuLq14pJ4M ipfsdir
正如我前面提到的那样,IPFS确实像Git一样进行版本控制。 我们举例说明我们以前的文件系统目录结构以及两个提交:第一个提交是原始结构,在第二个提交中,我们已将文件helloworld.txt更新为Hello World IPFS,而不是原始Hello World。
上面的变化可以通过图形显示如下:
正如我们所看到的,IPFS有潜力取代或补充HTTP。 人们可以很容易地看到现在使用IPFS的一些主要优点,我会提到 - 数据 不可变性, 数据分布和速度数不多。
正如我们所看到的,IPFS上的文件被赋予了一个生成的散列值。 正如上面的例子 -
QmWATWQ7fVPP2EFGu71UkfnqhYXDYH566qy47CnJDgvs8u
这是非常漫长和独特的。 两个文件几乎不可能具有相同的散列。 相同文件的哈希值相同,如果文件更改,哈希值也会更改。 我们可以将这些散列值视为地址。 使用这个地址可以访问文件。 这就是系统如何实现不变性。 没有地址改变,没有人可以改变文件。 这也为我们提供了数据重复数据删除。 如果偶然两个人在IPFS上传完全相同的文件,他们将得到相同的哈希地址。 所以,这是不变的。
正如我前面提到的那样,IPFS是一种类似于BitTorrent的点对点协议。 当我下载一个文件时,其中一些数据可以与其他人共享。 因此,让我们说一下San Fransisco的一台电脑(客户端)从波士顿市的一台计算机(服务器)请求一个文件。 在传统的HTTP客户端 - 服务器模式中,由于SFO和波士顿市之间的距离,通信需要更长的时间。 此外,如果该文件很受欢迎,来自其他位置的许多客户端会询问该文件,从而在波士顿的服务器上创建负载。 如果万一服务器机器出现故障,则会出现404错误。 而在IPFS中,San Fransisco的其他人可能已经从波士顿的服务器上下载了这个文件,然后我可以从他们那里下载它。 如果该文件很受欢迎,那么附近的更多节点将拥有共享副本,从而将负载从波士顿服务器上分离下来并分发。 在这种情况下,即使在波士顿的服务器出现故障,我仍然可以从其他节点访问该文件,并且可以确信没有人会因为我们不久前讨论过的不变特性而篡改文件。
那么,我们正在走向一个分散和更永久的互联网世界。 链接永远不会返回404错误并减少对集中式服务器的依赖的世界。