本文翻译自 IPFS 社区教程 ProtoSchool。ProtoSchool 是一个可以交互式学习 IPFS 编程的网站,涉及代码的部分大家可到该网站上直接运行测试!
去中心化的(Decentralized) Web 依赖于其独特的数据结构以及链接策略。让我们来一起学习一下哈希(hashing)、内容寻址(content addressing)、有向无环图(DAG) 以及默克尔树(Merkle Trees)!
LESSION 1 - 数据结构
在进入具体代码之前,让我们先花点时间看看去中心化 Web 的概念。课程 1 暂时不会涉及代码,让你可以可以更快熟悉一些关键术语和概念。
让我们开始吧!
数据结构
无论你是否是程序员,你每天都被数据结构所包围。列表、词典和目录都有助于我们组织信息并考虑各种数据之间的关系。
在计算机科学中,数据结构是一种数据组织,管理和存储格式,可以实现高效的访问和修改。 更确切地说,数据结构是数据值的集合,描述它们之间的关系,以及可以应用于数据的功能或操作。
在编程中,数据结构无处不在。将数据组织成变量以便在程序中使用它们的方式涉及数十到数百万个数据结构。如果你是开发人员,你可能熟悉常见的数据结构,如数组、对象,图等。
去中心化的数据结构
在去中心化的的 Web 上,我们是从对等节点(Peers)而不是某个中央节点访问数据,所以我们需要专门的一些数据结构,来让我们验证和链接各种各样的数据。
去中心化系统中的数据结构必须是可验证的。在单一系统上,你会比较信任你机器内存或磁盘上使用的数据结构。但在去中心化的系统中,对等节点的信任度较低,甚至可能为零。
此外,大型数据结构需要能够在对等节点之间传播并链接在一起以便实现去中心化。与任何网页可以链接到不同位置的另一个网页的形式类似,去中心化的数据结构实现了可互连的数据网络。
LESSION 2 - 寻址和中心化的 Web
在我们深入研究去中心化 Web 的共享工作方式之前,让我们先花点时间来研究一下传统方式是如何访问数据的。
通过 URL 寻址
URLs (统一资源定位符,Uniform Resource Locators) 是我们在中心化 Web 上分享数据的主要方式(这种方式我们都习惯)。URL 使我们能够在网络上创建链接和连接数据,因此它们有助于实现有价值的目的。(没有链接的话网络会非常糟糕!)但是,URL 基于存储数据的位置 ,而不是基于存储在那里的资源内容。我们称这种方式为位置寻址(location addressing),它会带来一些问题。
大多数人都有使用 URL 的体验,我们根据经验对它做了一些假设。例如当我们看到 https://www.puppies.com/beagle.jpg
时,我们可能会从文件名和扩展名猜测存储在该位置的数据是小猎犬的照片(JPEG 格式), 但是我们无法仅通过 URL 验证这一点。很可能有一张藏在 beagle.jpg
的吉娃娃的照片,甚至更糟糕的是它居然是一只可爱的小猫!
通过域名、URL 描述了表示我们所请求数据的中央机构。即使网络是去中心化的,任何人都可以连接到其他任何人,但基于位置的引用要求了数据本身必须是中心化的,以便我们可以从中央机构获取到。除了上面提到的文件名假设,我们也会对这些权威或域名做出假设。例如我们假设在 puppies.com
上托管的文件比在 evilhacker.com
上托管的文件更安全,但我们无法确定是否真的如此。
所有这些不确定性也反之亦然。如果我们看到一张可爱的小狗的照片并被告知它被存储在网络上,但我们是无法猜出该图片 URL 的。我们不能确定域名,不能确定由谁伺服,不能确定文件名。
中心化 Web 上的信任和效率
正如你所看到的,由于我们无法验证 URL 上的特定内容 并且依赖于中心化机构(和人们的善良)来标记事物的真实情况,因此我们很容易被欺骗。
42000 人很可能存储完全相同的可爱小猎犬的照片,它们使用了不同的域名和不同的文件名。让我们面对现实吧,即使在我们自己的笔记本电脑上,大多数人都保存了与 download.pdf
相同的文档 download(01).pdf
,或者使用 v1
或 2018-12-18
来命名相同的文档。Web 非常令人困惑,不同的 URL 上多次保存了非常混乱的数据,而且没有简单的方法来判断哪些数据项彼此相同。
肯定有更好的办法!
下一节:IPFS 去中心化数据结构(二)