8BTCCI: 14018.02 8BTCVI: 9726.21 24H成交额: ¥5551.04亿 总市值: ¥17568.30亿
深入理解IPFS(一):初级到高级全指南

深入理解IPFS(一):初级到高级全指南

IPFS星际大陆 发布在 技术指南 117331

这篇文章是“深入理解IPFS”系列文章的第一篇,该系列文章将帮助各位理解IPFS的基本概念,我们会尽量让这个系列尽可能的不枯燥。

系列分为六个部分:

 

● 深入理解IPFS(1/6):初级到高级指南:在这一部分中,我们将尝试去解释什么是IPFS,为什么需要它以及我们可以用它来做什么。我们将简要介绍IPFS的所有的底层组件(后面的部分将对此进行深入分析),了解它们是如何协同工作的。如果你想要的是一个简短的总结,而不想了解“引擎盖下面”有什么,那么这一部分就是为你准备的。

● 深入了解IPFS(2/6):什么是InterPlanetary Linked Data(IPLD)?:在本部分中,我们将更加深入研究基于内容可寻址网络的数据模型。我们将探索IPLD的细节和规格,逐渐熟悉IPLD并使用它。

● 深入了解IPFS(3/6): 什么是星际命名系统(IPNS)?:在这一部分中,我们将深入研究分布式网络的命名系统。我们将研究它的使用规格以及工作原理,还将把它与今天的命名系统(即DNS)进行比较,列出IPNS与DNS的优缺点列表。

● 深入理解IPFS(4/6):什么是MultiFormats? 在这一部分中,我们将讨论为什么我们需要MultiFormats,它是如何工作的,以及您作为用户/开发人员可以用它做什么?

● 深入理解IPFS(5/6):什么是Libp2p? 在这一部分中,我们将研究IPFS的网络层,以及它对IPFS的巨大贡献。我们将通过它的工作,规格和使用方法来解释,以方便大家更清楚的了解它。

● 深入理解IPFS(6/6):什么是Filecoin? 在这一部分中,我们将讨论IPFS的激励层,Filecoin。我们研究了Filecoin的白皮书和实施规范,包括DSN Distributed Storage Network(分布式存储网络)、复制证明、存储证明、数据存储市场和检索市场以及基于Filecoin协议的智能合约的实现。我们还讨论了在白皮书中没有提到的Filecoin协议中的一些缺陷,并提出了对Filecoin协议的一些改进。

希望您可以从本系列中学到很多关于IPFS的知识。让我们开始吧!

 

当你问某人关于最新的“复仇者联盟”电影时,他们可能不会说“在这个服务器上的这个子域里,然后在这个文件路径下,斜杠“漫威” 斜杠 “复仇者联盟”点 mp4”之类的话。相反,他们会描述视频的内容:“宇宙的一半被灭霸摧毁……”对于人类来说,这显然是一种最直观的思考方式,但这并不是我们今天在网络上访问内容的方式。尽管如此,诸如IPFS之类的分布式协议还是使用了基于内容寻址(使用文件的内容标记和查找内容)来查找分布式网络上存储的内容。在本文中,我们将探讨一下整个IPFS是如何工作的,涉及到哪些不同的组件,以及它们是如何协同工作的。为此,我们将向IPFS添加一个文件,然后研究向IPFS添加文件时会发生些什么。

 

让我们首先向IPFS添加一张照片。我们添加这个......

https://unsplash.com/photos/rW-I87aPY5Y

 

顺便提一下,您必须在您的电脑系统上安装IPFS才能与我一起使用。可以从这里安装。安装IPFS之后,必须启动IPFS守护进程(该软件与IPFS网络通信,以便从网络中添加和检索数据)。您可以通过以下方式启动守护进程 ipfs daemon  

 

当您将照片添加到IPFS时,会发生以下情况:

 

 

在终端我得到了这个:

 

 

你可以在这里看到最后的哈希值:

 

但是我们没有看到与中间2个步骤(Raw和Digest)相关的任何内容。这一切都是发生在“引擎盖下”的。

 

当我们添加图像时,我们将图像转换为计算机可以理解的Raw(原始)数据。现在,它具有内容寻址性(我们在上面讨论过),我们要想出一个方法,通过这个方法,我们可以将这个图像数据转换成一个标签,这个标签则需要具有标识它的内容的唯一性。

 

这就是哈希函数发挥作用的地方了。

 

哈希函数将数据(来自文本、照片、整本圣经等的任何数据)作为输入,并给出一个输出(Digest),其输出必须是惟一的。如果我们改变这个图像中的一个像素,那么输出将会不同。这是它的防篡改特性,使IPFS成为一个自我认证的文件系统。因此,您把这张照片转印给他人,他/她则可以轻松的检查收到的照片是否被篡改过。

 

此外,您不能知道输入是什么(在本例中是猫的照片),而只能看到它的输出(Digest)。因此,这也确保了内容的安全性。

 

现在,我们将Raw Data(原始图像数据)传递到SHA256散列函数中,并得到唯一的摘要(Digest)。现在,我们需要将这个摘要转换为CID(内容标识符)。当我们试图取回图像时,IPFS将搜索这个CID(内容标识符)。为此,IPFS使用了一种称为Multihash的技术。

 

要了解Multihash的重要性,请考虑这种情况。

 

您将一个图像存储在互联网上,并且您拥有其CID,您可以将其提供给任何想要获取此图像的人。但是如果未来您发现SHA256损坏了(这意味着此过程不再具有防篡改和安全性)并且您希望使用SHA3(以确保防篡改和安全性),那该怎么办呢?这意味着要改变将照片转换为CID的整个过程,而之前的CID将毫无用处......

 

在这种情况下,上面的问题似乎可能只是一个小问题,但您应该知道的是这些哈希函数可以获得数十亿美元的资金。所有银行,国家安全机构等都使用这些哈希函数来确保其安全地运行。如果没有它,即使是浏览器上每个站点地址旁边看到的绿色锁也无法运行。

 

为了解决这个问题,IPFS使用了多哈希(Multihash)。Multihash允许我们自定义哈希散列。因此,根据使用的哈希函数不同,我们可以有多个版本的CID。我们将在本系列的第4部分中详细讨论Multihash,并深入研究Multiformat。

 

现在我们已经将照片添加到IPFS中,但这还不是全部。现在的实际情况是这样的:

 

大文件被分块,散列组织成IPLD(Merkle DAG)

 

如果文件大于256kb,我们则将它们分解为更小的部分,以便所有部分都等于或小于256kb。我们可以看到照片块使用的这个命令:

ipfs object get Qmd286K6pohQcTKYqnS1YhWrCiS4gz7Xi34sdwMe9USZ7u

 

然后这给了我们15个块,每个块小于256kb。首先将这些块中的每一个都转换为摘要(Digest),然后再转换为CID。

 

{

  "Links": [

    {

      "Name": "",

      "Hash": "QmZ5RgT3jJhRNMEgLSEsez9uz1oDnNeAysLLxRco8jz5Be",

      "Size": 262158

    },

    {

      "Name": "",

      "Hash": "QmUZvm5TertyZagJfoaw5E5DRvH6Ssu4Wsdfw69NHaNRTc",

      "Size": 262158

    },

    {

      "Name": "",

      "Hash": "QmTA3tDxTZn5DGaDshGTu9XHon3kcRt17dgyoomwbJkxvJ",

      "Size": 262158

    },

    {

      "Name": "",

      "Hash": "QmXRkS2AtimY2gujGJDXjSSkpt2Xmgog6FjtmEzt2PwcsA",

      "Size": 262158

    },

    {

      "Name": "",

      "Hash": "QmVuqvYLEo76hJVE9c5h9KP2MbQuTxSFyntV22qdz6F1Dr",

      "Size": 262158

    },

    {

      "Name": "",

      "Hash": "QmbsEhRqFwKAUoc6ivZyPa1vGUxFKBT4ciH79gVszPcFEG",

      "Size": 262158

    },

    {

      "Name": "",

      "Hash": "QmegS44oDgNU2hnD3j8r1WH8xZ2RWfe3Z5eb6aJRHXwJsw",

      "Size": 262158

    },

    {

      "Name": "",

      "Hash": "QmbC1ZyGUoxZrmTTjgmiB3KSRRXJFkhpnyKYkiVC6PUMzf",

      "Size": 262158

    },

    {

      "Name": "",

      "Hash": "QmZvpEyzP7C8BABesRvpYWPec2HGuzgnTg4VSPiTpQWGpy",

      "Size": 262158

    },

    {

      "Name": "",

      "Hash": "QmZhzU2QJF4rUpRSWZxjutWz22CpFELmcNXkGAB1GVb26H",

      "Size": 262158

    },

    {

      "Name": "",

      "Hash": "QmZeXvgS1NTxtVv9AeHMpA9oGCRrnVTa9bSCSDgAt52iyT",

      "Size": 262158

    },

    {

      "Name": "",

      "Hash": "QmPy1wpe1mACVrXRBtyxriT2T5AffZ1SUkE7xxnAHo4Dvs",

      "Size": 262158

    },

    {

      "Name": "",

      "Hash": "QmcHbhgwAVddCyFVigt2DLSg8FGaQ1GLqkyy5M3U5DvTc6",

      "Size": 262158

    },

    {

      "Name": "",

      "Hash": "QmNsx32qEiEcHRL1TFcy2bPvwqjHZGp62mbcVa9FUpY9Z5",

      "Size": 262158

    },

    {

      "Name": "",

      "Hash": "QmVx2NfXEvHaS8uaRTYaF4ExeLaCSGpTSDhhYBEAembdbk",

      "Size": 69716

    }

  ],

  "Data": "\b\u0002\u0018Ơ�\u0001 ��\u0010 ��\u0010 ��\u0010 ��\u0010 ��\u0010 ��\u0010 ��\u0010 ��\u0010 ��\u0010 ��\u0010 ��\u0010 ��\u0010 ��\u0010 ��\u0010 Ơ\u0004"

}

 

IPFS使用IPLD (IPLD使用Merkle DAG或称作有向无环图)去管理所有的块并将其链接到基本的CID。

 

IPLD (objects)由2个组件组成:

● Data数据 - 大小小于256 kB的非结构化二进制数据的blob (binary large object二进制大对象)。

● Links链接 - 结构的数组。指向其他IPFS对象的链接。

每一个IPLD链接(在我们的例子中是上面提到的15个链接)都有3个部分:

● Name 名称 - 链接的名称

● Hash 哈希 - 链接的IPFS对象的哈希值

● Size大小 - 链接的IPFS对象的累积大小,包括跟随其链接的大小   

 

IPLD是建立在关联数据的基础上的,这是分布式网络社区中的人们已经讨论了很长一段时间的事情了。这也是蒂姆·伯纳斯-李(Tim Berners-Lee)多年来一直在做的事情,他的新公司Solid正在围绕着它开展业务。

 

使用IPLD还有其他好处。为了解释这一点,让我们创建一个名为photos的文件夹,并在其中添加2张照片(猫的照片与相同照片的副本)。

 

 

正如您所看到的,这两张照片都具有相同的哈希值(这证明我没有更改图像副本中的任何内容)。这为IPFS 添加了删除重复数据属性。因此,即使您的朋友将相同的猫照片添加到IPFS,他也不会复制图像。这节省了大量的存储空间。

 

想象一下,如果我把这篇文章存储在IPFS上,它的每个字母都是分块的,并且有一个惟一的CID,那么这篇文章就可以由字母(大写和小写)、数字和一些特殊字符组合而成。我们将只存储每个字母、数字和字符一次,并根据数据结构中的链接重新排列就可以了。

 

IPFS也有一个命名系统,称为星际命名系统(IPNS)。为了理解它的重要性,让我们假设您创建了一个网站,并将其托管在某个域名中。对于这个例子,我们将以我的网站为例:https://vaibhavsaini.com/

 

如果我想在IPFS上托管它,简单地在IPFS上添加网站文件夹就可以。为此,我已经使用wget下载了网站。如果你使用的是基于Linux的操作系统,比如Ubuntu或MAC,那么你可以和我一起试试。

 

下载本网站(或任何网站):

wget --mirror --convert-links --adjust-extension --page-requisites --no-parent https://vaibhavsaini.com

 

现在添加名为vaibhavsaini.com 的IPFS文件夹:

 

ipfs add -r vaibhavsaini.com

 

你会得到如下内容:

 

 

 

我们可以看到,我们的网站现在托管在最后一个CID(即文件夹的CID):

QmYVd8qstdXtTd1quwv4nJen6XprykxQRLo67Jy7WyiLMB

 

我们可以使用http协议访问该站点:

https://gateway.pinata.cloud/ipfs/QmYVd8qstdXtTd1quwv4nJen6XprykxQRLo67Jy7WyiLMB/

 

假设我想在网站上更改我的个人资料的图片。正如我们上面已经了解到的,如果我们改变输入的内容,我们得到的将是一个不同的Digest,这意味着我最终的“CID”会有所不同。

 

这意味着每次更新我的网站时都必须要更新哈希,拥有我之前网站链接的人(上述网址)都无法看到我的新网站。

 

这将会导致很严重的问题。

 

为解决这类问题,IPFS使用了星际命名系统(IPNS)。使用IPNS链接指向CID。如果我想更新我的网站CID,我只需将新的CID指向相应的IPNS链接就可以了(这类似于今天的DNS)。我们将在本系列的第3部分中深入探讨IPNS。

 

但是现在,让我们为我的网站生成一个IPNS链接。

 

ipfs name publish QmYVd8qstdXtTd1quwv4nJen6XprykxQRLo67Jy7WyiLMB

 

这可能需要几分钟时间,最后你会得到这样的输出:

 

Published to Qmb1VVr5xjpXHCTcVm3KF3i88GLFXSetjcxL7PQJRviXSy: /ipfs/QmYVd8qstdXtTd1quwv4nJen6XprykxQRLo67Jy7WyiLMB

 

现在,如果我想添加新的CID,我将使用相同的命令

ipfs name publish <my_new_CID>

 

使用此功能,您可以使用以下链接访问我的网站的更新版本:https://gateway.pinata.cloud/ipns/Qmb1VVr5xjpXHCTcVm3KF3i88GLFXSetjcxL7PQJRviXSy

 

但是上面的链接地址人类仍然无法方便读取。我们习惯于这样的名字:https://vaibhavsaini.com。 在本系列的第3部分中,我们将看到如何将IPNS链接到域名,这样您就可以在https://vaibhavsaini.com上看到我的IPFS托管网站。

 

IPFS也是HTTP协议的潜在替代品。但是为什么我们要替换HTTP?它似乎工作正常,对吧?我的意思是,你仍然能够阅读这篇文章并在Netflix上看电影,而所有的这些都是在使用HTTP协议。

 

即使它似乎对我们很好,它也有一些大问题。

 

假设您正坐在大教室里上课,您的教授要求您访问特定的网站。在座的每个学生都向该网站提出请求并给予回复。这意味着相同的数据被单独发送给房间中的每个学生。如果有100名学生,则有100个请求和100个回复。这显然不是最有效的做事方式。理想情况下,学生将能够互相使用得到的信息从而来更有效地检索他们需要的信息。

 

如果网络通信线路中存在某些问题并且客户端无法与服务器连接,则HTTP也会出现大问题。如果ISP发生中断,某个国家/地区阻止了某些内容,或者内容只是被删除或移动,就会发生这种情况。这些类型的断开链接几乎存在于HTTP网络任何的位置上。

 

基于位置的HTTP寻址模型鼓励集中化。将我们所有的数据托付给少数几个应用程序的确是很方便的,但正因为如此,网络上的大量数据变得肮脏不堪。这使得这些提供者对我们的信息负有巨大的责任和权力。

 

这就是Libp2p发挥作用的地方了。Libp2p用于IPFS网络上的数据通信,并发现其他节点(计算机或智能手机)。它的工作方式是,如果每台计算机和智能手机都运行IPFS软件,那么我们将成为像大型BitTorrent网络的一部分,每一个系统都可以充当客户端和服务器。因此,如果100名学生要求相同的网站,他们可以互相请求网站数据。这种系统如果大规模实施,则可以显著提高上网速度。

 

好了,我们就讲到这里。如果你能坚持到这里,那么你应该得到鼓励。做得好!

 

到目前为止,我们已经学到了很多关于IPFS的知识。让我们回顾一下:

 

● IPFS是基于内容可寻址的。IPFS上的数据则是使用CID来进行识别。

● 这些CID对于它引用的数据是具有惟一性的。

● IPFS使用哈希函数作为其防篡改的属性,这使得IPFS成为了一个自认证的文件系统。

● IPFS使用Multihash,它允许对相同的数据使用不同版本的CID(但是这并不意味CID不是唯一的)。如果我们使用相同的哈希函数,那么我们将会得到相同的CID。我们将在本系列的第4部分中对此问题进行更多的讨论。

● IPFS使用IPLD来管理和链接所有的数据块。

● IPLD使用Merkle DAG(又称有向无环图)数据结构来链接数据块。

● IPLD还向IPFS添加了重复数据删除特性。

● IPFS使用IPNS将CID链接到固定的IPNS链接上,这种技术类似于今天的集中式Internet的DNS。

● IPFS使用Libp2p在IPFS网络上做数据通信并发现其他节点(计算机和智能手机),这样可以显著的提高您的上网速度。

下面是IPFS堆栈的图解表示:

 

 

 

原文作者:vasa

原文链接:https://hackernoon.com/understanding-ipfs-in-depth-1-5-a-beginner-to-advanced-guide-e937675a8c8a

翻译:星际大陆海外团队

文章标签: IPFS 技术指南
评论(1)
登录 账号发表你的看法,还没有账号?立即免费 注册