Skip to main content

学习 IPFS -- 去中心化的文件系统

IPFS 是 InterPlanetary File System 的缩写。它是一个分布式的、点对点的网络,用于存储和共享文件、网站、应用程序等。它最初于 2015 年发布,由协议实验室开发。

为了理解 IPFS 的作用,以及为什么它如此重要,我们需要围绕今天互联网上的文件如何存储和检索上一点历史课。

数据识别和检索

想象一下,你想买一本关于以太坊的书。你问你的朋友,Alice 和 Bob,他们已经在这个领域工作了几年,你在哪里可以找到一本关于以太坊的好书。

他们给你的答案如下。

爱丽丝。去滑铁卢大学附近的滑铁卢大学大道上的小书店,上到三楼,去科技区,在第四层书架上找到第三本书。

鲍勃:看看《掌握以太坊》。它的 ISBN 号是 9784873118963

如果你的目标是得到这本书的副本,你有多大信心觉得你按照这里的每个指示得到了你想要的东西?

感谢 ProtoSchool 提供的这个例子的灵感。

位置与内容寻址

对于我们如何识别数据,有两种方法。第一种是基于位置的寻址,第二种是基于内容的寻址。

位置寻址

在上面的例子中,Alice 对你的问题的回答是一个基于位置寻址的例子。它将我们指向数据被某个实体(物理或数字)存储的位置。爱丽丝知道书店在那个特定的位置有那本书,并希望他们不要把它拿下来或移到另一个地方。

基于位置的寻址是我们在 Web2 中识别集中式网络上的数据的方式。例如,我知道过去比特币的白皮书是存放在https://bitcoin.org/bitcoin.pdf。如果我把你指向那个位置,那是基于一种信念,即他们没有把那份白皮书转移到其他地方,并继续在同一位置提供。虽然,它很可能将以太坊白皮书存放在那个位置,尽管托管它的机构是bitcoin.org,而且文件名bitcoin.pdf暗示了与比特币有关的东西。

归根结底,托管在集中式网络上的文件内容与它们基于位置的地址没有关系。给定某个数据,我们没有办法猜测它在互联网上的存储位置。我们无法知道它被托管在哪个域名上,谁在托管它,或者它被存储为哪个文件名。

内容寻址

在上面的例子中,Bob 对你问题的回答是一个基于内容寻址的例子。它为我们提供了一个独特的、基于内容的数据标识符,我们可以用它来从各种来源获取数据。鉴于 ISBN 号码,你可以在书店,在亚马逊上,以电子书的形式,或任何你想要的地方找到它。

IPFS 正在内容解决数据上建立一个去中心化的网络。让我们更深入地挖掘一下这意味着什么。

位置寻址的缺点

在中心化的网络中,由于我们无法验证什么内容生活在什么位置,所以我们依赖于中央机构来标记和存储信息的真实情况。正是由于这一点,我们很容易被不良分子欺骗。你有没有下载过一个视频或游戏,结果发现是一个病毒?

此外,位置寻址意味着相同的数据可以用不同的文件名存储在不同的位置,成千上万次或数百万次,这大多是无用的。

你有没有在你的电脑上保存过 download.pdf 和 download(1).pdf?

由于内容不直接与位置挂钩,集中的网络是一个混乱的数据,这些数据在不同的 URL 上以不同的名字被重复保存多次,而且没有办法分辨哪些项目是相同的。

内容寻址 -- 深入浅出

在去中心化的网络上,我们可以不再依赖中央机关来标记信息,希望我们所下载的数据不是恶意的。

事实上,我们都可以托管对方的数据,采用不同的寻址方式(特别是内容寻址),比基于位置的寻址更安全。

哈希

内容寻址所需的最重要的技术是加密哈希。我们将略微介绍一下哈希函数的特性,但如果你想深入了解它们的工作原理和背后的数学原理,你可以阅读上述链接。

散列是一个过程,其中一个被称为散列函数的函数接受一个任意的输入,并产生一个单一的、固定大小的 "散列",唯一地代表输入。

我们可以用数学方法表示如下。

H(a) = b

其中 H 是哈希函数,a 是输入,b 是输出哈希值。

有几个重要的属性使哈希函数变得超级重要。

  • 对于一个给定的哈希函数,无论输入 a 有多小或多大,b 的输出大小总是相同的。
  • 输出哈希值总是唯一的。如果输入有一个比特的变化,输出哈希值将完全改变。为了检查两个输入是否相同,你可以比较它们的哈希值。如果哈希值匹配,则输入一定匹配。

注意:这就是密码在数据库中的存储方式。需要登录的网络应用程序不直接在数据库中存储密码。他们存储的是数据库的哈希值。当有人试图登录时,他们的密码会用相同的哈希函数进行哈希处理,并将哈希值与存储在数据库中的密码进行匹配。

  • 不可能逆转哈希函数。这意味着,给定散列函数 H 和输出散列值 b,你无法找出 a 是什么。但是,如果你有 a,你可以很容易地检查出它输出 b。

起初,这可能看起来有点不直观。如果输出哈希值总是一个固定的大小,但输入可以是任意大的,我们怎么能保证输出的唯一性?将此作为研究散列函数安全性的一个练习,并对其进行深入挖掘。

我们暂时不会对散列进行深入研究,但我想说,散列是一种概率保证。它不能 100% 保证每个散列都是唯一的,但找到两个独立的输入输出相同的散列的概率是非常低的。

事实上,如果你能在一个现代的哈希函数(如 SHA-2)上找到两个输出相同的哈希值的输入,那么恭喜你!你已经破解了该哈希函数的安全性。你已经打破了该哈希函数的安全性。如果你能研究这些输入,并想出一个通用的公式来反复做这件事,你就会得到世界上最大的 bug 赏金! 整个比特币网络都是你的 :)

回到内容寻址和散列问题上。

由于散列给出了一个唯一的、固定大小的输出,无论输入数据的大小如何,我们实际上可以使用输出的散列作为数据本身的唯一标识符。因此,我们有一种方法可以通过一个唯一的 ID 来指代任意的数据,这个 ID 可以通过散列函数从数据本身得到。

信任的含义

如前所述,在集中式网络上,我们已经开始信任某些中央机构来托管我们大部分的数据。然而,恶意的行为者有时可以通过欺骗位置来欺骗我们关于文件的内容。

在去中心化的网络上,我们可以消除对中央机构的信任,每个人都可以托管对方的文件。由于通过散列进行的内容寻址,如果我们根据文件的散列来查找和识别文件,那么没有人可以在文件的内容上欺骗任何人。如果一个恶意的行为者改变了任何文件中的一个比特,它的哈希值就会改变,而我们就不会去寻找那个文件。

点对点

但是,我们实际上从哪里获得数据?如果你曾经使用过 Torrents,这听起来会很熟悉,但在某种意义上,你也可以把这与以太坊的数据共享方式联系起来。

比方说,你正在寻找一个特定的文件,你有它的内容哈希值。我们不是要求一个单一的权威机构提供该文件,而是要求整个网络!这就是以太坊。

你的请求将通过你直接连接的节点、他们连接的其他节点来分享,以此类推--直到你找到拥有你要找的内容的人。

你会知道这正是你要找的文件,因为它有一个匹配的哈希值。另外,如果该节点在服务请求时脱机,你仍然能够从另一个也有该内容的节点获得该文件的副本。

IPFS

现在我们了解了内容寻址,让我们再看一下 IPFS。

IPFS 是一个分散的节点网络,用于存储和共享文件。IPFS 上的文件是内容寻址的,每个文件都是根据它的内容哈希值来识别的。这个内容哈希值被称为 CID--一个内容 ID。在使用 IPFS 时,你会经常听到 "IPFS CID "这个术语。

任何人都可以运行一个 IPFS 节点并向该节点上传文件。该节点将对这些文件进行散列,并将其 CID 公开给网络的其他部分。如果其他人对这些内容感兴趣,他们可以请求获取该 CID 的内容,最终该请求将到达你的节点,然后你可以为他们的请求提供服务。

此外,对于重要的数据,任何人都可以在自己的 IPFS 节点上存储某些数据的副本,以便在一些节点离线的情况下提高复制能力。因此,IPFS 上的数据可以通过复制实现高可用性。

然而,最后要注意的一件重要事情是,IPFS 上的数据是不可改变的,这意味着它不能被更新。由于文件是由它们的 CID 代表的,这些文件在被上传后不能被修改。你可以上传一个新的、修改过的版本,但由于哈希函数的唯一性,该版本的 CID 将与原来的不同。

IPFS 供应商

运行你自己的 IPFS 节点可能看起来是一种延伸。类似于没有很多 dApp 构建者运行他们自己的以太坊节点,而是使用 Infura、Alchemy 或 Quiknode 的节点来构建他们的应用程序,你也可以使用 IPFS 的节点提供者。

PinataTextile 是一些流行的 IPFS 节点提供商。与以太坊节点提供商类似,你可以在这些平台上创建一个账户,以获得对 IPFS 节点的访问,从而存储和检索网络上存储的数据。

IPFS 网关

IPFS 节点也可以选择暴露一个公共网关,这允许 web2 用户访问存储在 IPFS 上的文件。

协议实验室团队与 Cloudflare 等其他组织一起,运行公共 IPFS 网关。

协议实验室的 IPFS 网关就在 https://ipfs.io/。

这里有一些 IPFS 文档,托管在 IPFS 本身。你可以通过访问这个链接从公共网关访问它 - https://ipfs.io/ipfs/QmTkzDwWqPbnAh5YiV5VwcTLnGdwSNsNTn2aDxdXBFca7D/example

节点的运行者可以决定他们是否要公开一个公共网关。开放公共网关确实意味着用户能够使用你的节点从网络上获取和检索任意数据,这可能会增加运行你的节点的流量和带宽成本,所以如果你想,你可以选择不开放它。像 Pinata 和 Textile 这样的供应商允许你选择是否要暴露一个公共网关。

IPFS 使用案例

IPFS 有很多的使用案例。由于它是一个无信任的、去中心化的、冗余的数据存储--它有很多的含义。没有审查制度,没有人控制网络。

建立开放的无边界知识库

某些国家、组织或当局禁止或审查集中式网络的某些类型的数据。由于去中心化的网络,我们可以建立开放的、无边界的信息知识库,不能被任何中央当局审查或控制。

这对生活在高度权威的国家或地区的公民来说特别有用,因为在这些地方,信息的获取在中心化网络上并不广泛。

数据市场

像 Filecoin 这样的项目也来自于 Protocol Labs,它扩展了 IPFS 网络,包括对数据存储者的激励。你可以向 Filecoin 网络的矿工支付托管数据的费用,而这只是在 AWS 等集中式云供应商中托管数据费用的一小部分。作为对数据可用性保证的交换,你以$FIL 代币支付给他们,并以比中心化解决方案更便宜的价格获得一个去中心化的可靠数据存储网络。

NFT 元数据

最近,IPFS 上的去中心化 NFT 元数据已经成为趋势。在 NFTs 的早期,NFTs 的元数据被托管在中央服务器上。事实上,甚至在我们的大二 NFT 收集教程中,我们要求你建立一个 API 端点来服务 NFT 元数据。

这是有问题的,因为 NFT 项目的开发者可以替换这些元数据,或者他们的服务会瘫痪,基本上会把整个项目搞乱。通常用于这种情况的术语是 "地毯式拉动"--开发者从用户下面拉出一条地毯。

在这个空间发生了几次之后,人们开始使用 IPFS 作为元数据存储的替代品,因为一旦元数据存储在 IPFS 上,任何人都可以创建内容的副本,而且 IPFS 上的数据不能真正被删除,除非连一个节点都不再有该内容的副本。

托管大型数据集

很多组织都有庞大的数据集。当我说巨大时,我的意思是像 PB 级的数据。想要建立公共的公司可以依靠 IPFS 来分散这些数据的存储,并使数据在全世界范围内都能轻松访问。

离线数据共享

由于 IPFS 是一个点对点的协议,它可以被配置为在各种传输协议上工作。到目前为止,我们一直假设 IPFS 上的数据是通过 HTTP(S)协议传输的,这需要一个互联网连接。然而,你可以将 IPFS 配置为通过蓝牙、无线电信号或其他类型的信号工作。这在受灾地区或低连通性地区很有用,可以在缺乏互联网接入的社区内实现数据共享。

托管去中心化的网站

在文章的开头,我们提到 IPFS 可以托管网站。什么是网站?它们只是一些文件的组合--HTML、CSS 和 JavaScript。你可以在 IPFS 上托管所有这些文件,并最终获得一个 CID。你可以通过一个公共的 IPFS 网关访问这个 CID,并被呈现在一个完全在去中心化的互联网上运行的网站。

随机星球事实是一个例子,由 IPFS 团队创建,完全在 IPFS 网络上运行,而不是托管在谷歌或 AWS 这样的中央云供应商上。

还有很多关于 IPFS 使用情况的例子。这决不是一个详尽的清单。

在 Protocol Lab 的网站上还有很多使用案例,你可以在这里找到。

结论

随着我们从集中式机构转向分散化,IPFS 确实是分布式网络的一个基本构件。我们希望这篇文章能给你一点启发,并帮助你理解去中心化数据存储背后的动机。

随着我们的前进,我们将做一个使用 IPFS 在 Ethereum 上存储 NFT 元数据的实际例子。

x 一如既往,感谢您的阅读,如有任何问题,请随时在 Discord 上提出。