星鉴网>技术干货>IPFS技术运用简介

IPFS技术运用简介

2019/1/25 16:58:55 4917人阅读

【导读】 当你拥有IPFS时 ,你可以开始以一种特定的方式查看其他所有内容,并意识到你可以全部替换它。

  “当你拥有IPFS时 ,你可以开始以一种特定的方式查看其他所有内容,并意识到你可以全部替换它” -  Juan Benet


  IPFS最初是由Juan Benet构建的一个能够快速移动版本化科学数据的系统。版本控制使您能够跟踪软件状态随时间的变化(比如Git )。IPFS从此被认为是分布式永久网络系统:IPFS是一种分布式文件系统,旨在将所有计算设备与相同的文件系统连接起来。在某些方面,这类似于Web的原始目标,但IPFS实际上更类似于交换git对象的单个bittorrent swarm。IPFS可以成为互联网的一个新的主要子系统。如果构建正确,它可以补充或替换HTTP。它可以补充或替代更多。听起来很疯狂,这确实很疯狂。


  IPFS的核心是一个版本化文件系统,它可以接收文件并对其进行管理,并将它们存储在某个地方,然后跟踪版本。IPFS还考虑了这些文件如何在网络中移动,因此它也是一个分布式文件系统。


  IPFS有关于数据和内容如何在网络上移动的规则,其性质与bittorrent相似。此文件系统层提供了非常有趣的属性,例如:


  - 完全分发的网站


  - 没有原始服务器的网站


  - 可以完全在客户端浏览器上运行的网站


  - 没有任何服务器可以与之交谈的网站


  内容寻址


  IPFS不是引用存储服务器的对象(图片、文章、视频),而是通过文件上的哈希引用所有内容。我们的想法是,如果您在浏览器中想要访问特定页面,那么IPFS会询问整个网络“是否有人拥有与此哈希对应的文件?”而IPFS上的节点可以返回允许您访问的文件它。


  IPFS在HTTP层使用内容寻址。这是一种说法,而不是创建一个按位置解决事物的标识符,我们将通过内容本身的一些表示来解决它。这意味着内容将决定地址。机制是获取一个文件,以加密方式对其进行哈希处理,这样您最终会得到一个非常小且安全的文件表示,这可以确保某人不能只提出具有相同哈希值的另一个文件并将其用作地址。IPFS中的文件地址通常以标识某个根对象的散列开始,然后是向下走的路径。您正在与特定对象进行通信,而不是服务器,然后您正在查看该对象中的路径。


  HTTP与IPFS查找和检索文件


  HTTP有一个很好的属性,其中标识符是位置,因此很容易找到托管文件的计算机并与它们通信。这很有用,通常效果很好,但在离线情况下或在希望最小化网络负载的大型分布式场景中都不行。


  在IPFS中,您将步骤分为两部分;


  识别具有内容寻址的文件


  去找到它 - 当你有哈希然后你问你连接的网络'谁有这个内容?(hash)'然后连接到相应的节点并下载它。


  结果是对等覆盖,为您提供非常快速的路由。


  IPFS对象


  IPFS 本质上是用于检索和共享IPFS对象的P2P系统。IPFS对象是具有两个字段的数据结构:


  数据  - 大小<256 kB的非结构化二进制数据。


  Links  - 一系列Link结构。这些是指向其他IPFS对象的链接。


  Link结构有三个数据字段:


  名称  - 链接的名称。


  散列  - 链接的IPFS对象的散列。


  大小  - 链接的IPFS对象的累积大小,包括其链接。


  该尺寸领域主要用于优化P2P网络和我们要在这里大多忽略它,因为在概念上它并不需要逻辑结构。


  IPFS对象通常由其Base58编码的哈希引用。例如,让我们使用IPFS命令行工具查看带有散列QmarHSr9aSNaPSR6G9KFPbuLV9aEqJfTk1y9B8pdwqK4Rq的IPFS对象(请在家中试试!):


  > ipfs object get QmarHSr9aSNaPSR6G9KFPbuLV9aEqJfTk1y9B8pdwqK4Rq

  {“Links”: [{

  “Name”: “AnotherName”,

  “Hash”: “QmVtYjNij3KeyGmcgg7yVXWskLaBtov3UYL9pgcGK3MCWu”,

  “Size”: 18},

  {“Name”: “SomeName”,

  “Hash”: “QmbUSy8HCn8J4TMDRRdxCbK2uCCtkQyZtY6XYv3y7kLgDC”,

  “Size”: 58}],

  “Data”: “Hello World!”}


  读者可能会注意到所有哈希都以“Qm”开头。这是因为哈希实际上是一个多哈,意味着哈希本身指定哈希函数和多哈的前两个字节中的哈希长度。在上面的示例中,十六进制中的前两个字节是1220,其中12表示这是SHA256散列函数,20是散列的长度(以字节为单位) - 32个字节。


  数据和命名链接为IPFS对象集合提供Merkle DAG的结构 -  DAG 意味着有向无环图,而Merkle 表示这是一个使用加密哈希来处理内容的加密认证数据结构。读者可以考虑为什么在这个图中不可能有循环。


  为了可视化图形结构,我们将通过一个图形来显示IPFS对象,该图形包含节点中的数据,而链接是指向其他IPFS对象的图形边缘,其中链接的名称是图形边缘上的标签。上面的例子可视化如下:


  我们现在将给出可以由IPFS对象表示的各种数据结构的示例。


  文件系统


  IPFS可以轻松表示由文件和目录组成的文件系统


  小文件


  一个小文件(<256 kB)由IPFS对象表示,数据是文件内容(加上一个小的页眉和页脚),没有链接,即links数组为空。请注意,文件名不是IPFS对象的一部分,因此具有不同名称和相同内容的两个文件将具有相同的IPFS对象表示,因此具有相同的哈希。


  我们可以使用命令ipfs add向IPFS添加一个小文件:


  chris@chris-VBox:~/tmp$ ipfs add test_dir/hello.txt

  added QmfM2r8seH2GiRaC4esTjeraXEachRt8ZsSeGaWTPLyMoG test_dir/hello.txt


  我们可以使用ipfs cat查看上面IPFS对象的文件内容:


  chris @ chris-VBox:〜/ tmp $ ipfs cat QmfM2r8seH2GiRaC4esTjeraXEachRt8ZsSeGaWTPLyMoG Hello World!


  使用ipfs对象查看底层结构得到产量:


  chris@chris-VBox:~/tmp$ ipfs object get QmfM2r8seH2GiRaC4esTjeraXEachRt8ZsSeGaWTPLyMoG

  {“Links”: [],

  “Data”: “\u0008\u0002\u0012\rHello World!\n\u0018\r”}


  我们将此文件可视化如下:

  大文件

  大文件(> 256 kB)由指向<256 kB的文件块的链接列表表示,并且仅指定此对象表示大文件的最小数据。指向文件块的链接具有空字符串作为名称。


  chris@chris-VBox:~/tmp$ ipfs add test_dir/bigfile.js

  added QmR45FmbVVrixReBwJkhEKde2qwHYaQzGxu4ZoDeswuF9w test_dir/bigfile.js

  chris@chris-VBox:~/tmp$ ipfs object get QmR45FmbVVrixReBwJkhEKde2qwHYaQzGxu4ZoDeswuF9w

  {“Links”: [{

  “Name”: “”,

  “Hash”: “QmYSK2JyM3RyDyB52caZCTKFR3HKniEcMnNJYdk8DQ6KKB”,

  “Size”: 262158},{“Name”: “”,

  “Hash”: “QmQeUqdjFmaxuJewStqCLUoKrR9khqb4Edw9TfRQQdfWz3”,

  “Size”: 262158},

  {“Name”: “”,

  “Hash”: “Qma98bk1hjiRZDTmYmfiUXDj8hXXt7uGA5roU5mfUb3sVG”,

  “Size”: 178947}],

  “Data”: “\u0008\u0002\u0018* \u0010 \u0010 \n”}


  目录结构


  目录由表示文件或其他目录的IPFS对象的链接列表表示。链接的名称是文件和目录的名称。例如,考虑目录test_dir的以下目录结构:


  chris@chris-VBox:~/tmp$ ls -R test_dirtest_dir:bigfile.js hello.txt my_dirtest_dir/my_dir:my_file.txt testing.txt


  文件hello.txt和my_file.txt都包含字符串Hello World!\ n。文件testing.txt包含字符串Testing 123 \ n。


  将此目录结构表示为IPFS对象时,它看起来像这样:


  请注意包含Hello World的文件的自动重复数据删除!\ n,此文件中的数据仅存储在IPFS中的一个逻辑位置(由其散列寻址)。


  IPFS命令行工具可以无缝地跟随目录链接名称来遍历文件系统:


  chris @ chris-VBox:〜/ tmp $ ipfs cat Qma3qbWDGJc6he3syLUTaRkJD3vAq1k5569tNMbUtjAZjf / my_dir / my_file.txt Hello World!


  版本化文件系统


  IPFS可以表示Git用于允许版本化文件系统的数据结构。Git提交对象在Git Book 中描述。


  Commit对象的主要属性是它有一个或多个名称为parent0、parent1等指向先前提交的链接,以及一个带有name 对象的链接(在Git中称为tree),指向由该引用引用的文件系统结构。


  我们举例说明我们以前的文件系统目录结构,以及两个提交:第一个提交是原始结构,在第二个提交中我们更新了文件my_file.txt来说另一个世界!而不是原来的Hello World!



  另请注意,我们有自动重复数据删除功能,因此第二次提交中的新对象只是主目录,新目录my_dir和更新后的文件my_file.txt。


  区块链


  这是IPFS最激动人心的用例之一。区块链具有自然DAG结构,因为过去的区块总是通过其后来的哈希链接。像以太坊区块 链这样的更高级的区块 链也有一个相关的状态数据库,它有一个Merkle-Patricia树 结构,也可以使用IPFS对象进行模拟。


  我们假设一个简单的区块链模型,其中每个区块包含以下数据:


  事务对象列表


  前一个块的链接


  状态树/数据库的哈希


  然后可以在IPFS中对此区块链进行建模,如下所示:



  我们看到将状态数据库放在IPFS上时获得的重复数据删除 - 在两个块之间只需要显式存储已更改的状态条目。


  这里一个有趣的观点是在区块链上存储数据和在区块链上存储数据哈希之间的区别。在以太坊平台上,您需要为相关状态数据库中的数据存储支付相当大的费用,以便最大限度地减少状态数据库的膨胀(“区块链膨胀”)。因此,对于较大的数据片段而言,它不是存储数据本身,而是存储状态数据库中数据的IPFS散列,这是一种常见的设计模式。


  如果区块链及其关联的状态数据库已经在IPFS中表示,则区块链上存储哈希和将数据存储在区块链之间的区别变得有些模糊,因为无论如何一切都存储在IPFS中,并且块的哈希只需要状态数据库的哈希值。在这种情况下,如果有人在区块链中存储了IPFS链接,我们可以无缝地跟随此链接访问数据,就好像数据存储在区块链本身中一样。


  但是,我们仍然可以区分链上和链外数据存储。我们通过查看矿工在创建新区块时需要处理的内容来做到这一点。在当前的以太坊网络中,矿工需要处理将更新状态数据库的事务。为此,他们需要访问完整的状态数据库,以便能够在更改它的任何地方更新它。


  因此,在IPFS中表示的区块链状态数据库中,我们仍然需要将数据标记为“在链上”或“在链外”。矿工需要“链上”数据才能保留在当地以便开采,这些数据将直接受到交易的影响。“脱链”数据必须由用户更新,不需要矿工接触。


  本文来源于Medium 作者:ConsenSys


39

参与讨论

登录后参加评论......

全部评论 0

作者

返回顶部