IPFS:常规文件API(一)

​引入文件API

IPFS星际文件系统

IPFS 是一种点对点(P2P)网络协议,用于共享分布式 Web 上的数据。您可以将其视为具有某些独特特征的文件系统,使其成为安全,分散式共享的理想选择。

如果您还没有这样做,我们鼓励您阅读我们的《分散数据结构》文章,以了解有关分散网络的所有知识以及如何将其与您习惯的网络进行比较。在这里,您将学到有关内容寻址,加密哈希,内容标识符(CID)以及与对等方共享的所有知识,以充分利用本教程,您需要了解所有这些内容。

文件 API 与 DAG API 

您可以使用 IPFS 存储多种类型的数据。如果您在去中心化 Web 教程中浏览了带有内容寻址或博客的 P2P 数据链接,您已经了解了如何使用 DAG API 在网络上存储基元,对象和数组。

DAG API 允许您使用 IPFS 中 IPLD(行星间链接数据)提供的独特而通用的原始数据结构。您可以在 js-ipfs(IPFS的JavaScript实现)中识别其方法,因为它们采用以下格式:ipfs.dag.someMethod()

DAG API 是向 IPFS 节点添加数据的最通用,最灵活的方法,但是对于共享文件这一非常常见的用例而言,它并不是最有效的。如果您想分享小猫的图片,或者分享喜欢的名人狗的搞笑视频等更大的文件怎么办?您如何将这些文件添加到网络,并为您的朋友提供一种查看它们的方式?每个文件应如何以单个块或有块的形式放置在有向非循环图(DAG)中?这些是优化细节,超出了 DAG API 的范围。尽管可以使用 DAG API 将文件添加到 IPFS 节点,但这将是一项劳动密集型任务。

另一方面,Files API 是针对特定用例定制的。Files API 准备将文件放置在网络中,并确保IPFS 知道如何访问它们并有效地处理它们。Files API 由两部分组成:我们将在后续章节中介绍的 Regular Files API 和可变文件系统(MFS)。

常规文件 API 与 MFS 文件 API 

如果您阅读了我们的可变文件系统文章,您可能会想:“我已经学习了如何使用 IPFS 上的文件。这会有什么不同?”

易变的文件系统(MFS)提供旨在重现熟悉的文件系统操作,如 API mkdir,ls,cp,和其他人,模仿你组织的计算机上的文件和目录的方式。但是,IPFS 中内容的寻址方式使其成为不可变的文件系统。文件或目录的地址取决于其内容,因此对文件或目录的任何更改都将导致一个全新的地址。MFS 文件 API /some/stuff 在本地 IPFS 节点中具有规则路径(例如)的熟悉外观的文件系统上工作,这隐藏了不变内容寻址的复杂性。

尽管 MFS 非常有用,但它提供的抽象隐藏了 IPFS 的某些内部功能。我们将在这里讨论的常规文件 API 是在 IPFS 中管理文件的基本方法。它用强大的 MFS 抽象交换了一个方案,该方案可以帮助您了解文件系统中实际发生的情况。在常规文件 API,你会发现类似的方法 add,cat,get 和 ls。

与 MFS API(可以通过 js-ipfs 识别该格式)不同 ipfs.files.someMethod(),常规文件 API使用采用该格式的顶级方法 ipfs.someMethod()。

目前,这两个版本的 Files API 之间的区别有点令人困惑,但是 IPFS 团队目前正在对其进行修改,以使整个 Files API 更加用户友好。事情发生变化时,我们一定会更新我们的文章!

2
如何处理文件

为了安全起见,网络浏览器不允许我们直接更改计算机文件系统中的文件。因此,您需要将一个或多个文件上传到浏览器中,以便在本文章中使用。

在每个练习中,您都会看到可以从计算机上载文件,方法是拖放或从文件浏览器中选择文件。如果仔细查看 run 代码编辑器中的函数,您会发现它现在带有一个参数 files。当您从计算机上载文件时,我们将确保将它们作为 files 数组传递到函数中。只要您不刷新浏览器,这些文件就可以在本教程的下文中访问,但是您还可以选择上载不同的文件。

该 files 数组中的每个元素都将是一个 File 对象,该对象由浏览器的 File API 定义(不要与IPFS Files API 混淆)。除了上载文件的内容外,File对象还包含以下属性:

  • 名称(上传文件的名称)
  • lastModified(上次修改上传文件的日期)
  • 大小(上传文件的大小)
  • 类型(上传文件的类型)

为了练习,让我们从您的计算机上载一个或多个文件,并查看浏览器作为 files 数组接收到的内容。

我们已帮助您找到官方给出的文件,您可以进行操作体验,网址:

https://proto.school/#/regular-files-api/02

IPFS:常规文件API(一)

3

新增档案

处理文件

在我们的如何处理文件中,每次您单击中的“提交”按钮时,我们都会在浏览器中为您创建一个新的 IPFS 节点。每当您 ipfs.someMethod()在我们的课程中看到 ipfs 该变量时,它都是一个变量,它引用您的 IPFS 实例,也称为节点。该 IPFS 节点没有从一方面转移到另一方面,这就是为什么您会看到我们经常在练习中预先填充一些代码,以使您的新 IPFS 节点达到在上一课中获得另一个 IPFS 节点的状态。

我们在幕后创建这些 IPFS 节点,以便您可以专注于文章的内容。您可以自己在浏览器中初始化 JS IPFS,也可以通过在终端中安装 IPFS 并运行守护程序在本地托管自己的节点。准备好进行实验时,可以访问 IPFS 文档站点,以了解如何安装 IPFS 和初始化节点。

如前所述,本文章中讨论的方法是 IPFS Files AP I的一部分。请查看文档以获取更多特定详细信息,例如每种 API 方法的选项。

新增档案

为了使文件在 IPFS 网络上可用,首先需要将其添加到特定的 IPFS 节点。重要的是要记住,由于 IPFS 是点对点的分散式系统,因此添加文件并不意味着将其上传到某个地方的远程服务器。假设您正在使用自己的计算机上的节点,则该过程更像是从计算机中选择一个文件,然后在文件上添加一个标签,上面写着:“我在 IPFS 上共享!我的名字是__。快来找我!” 该标签包括一个从文件内容派生的内容标识符(CID),它是一种地址类型,其他同级可以使用该地址查找特定文件,而不管托管在哪个计算机上。

将文件添加到 IPFS 时,仅将其放在自己的节点中,但使网络上的对等方可以访问。只要拥有它的人连接到网络,它就会有效。如果没有其他人找到并共享您的文件,并且您关闭了计算机或停止了 IPFS 守护程序的运行,则该内容将不再可供任何人发现。通过称为固定的过程,共享您的内容的人越多,则随时都有可能获得该内容。

让我们看一下如何在 IPFS 节点上添加文件。我们将通过执行以下 add 方法来做到这一点:

await ipfs.add(data, [options])

因此,如果我们 File 在浏览器中有一个可爱的小猫照片对象,可以通过变量访问该对象catPic,并且希望将其添加到 IPFS 节点,则可以将其传递给 add 方法,data 如下所示:

await ipfs.add(catPic)

请注意,如果您要在节点上添加多个可爱的动物照片,则该 add 方法可以接受单个 File 或数组:

await ipfs.add([catPic, dogPic, giraffePic])

由于该 add 方法返回 a Promise,因此您需要 await 在该方法调用之前放置一个,以挂起执行,直到可以使用 promise 的返回值为止。

结果 Promise 是对象数组,每个对象添加到 IPFS 的文件格式如下:

{
    path: string,
    hash: string,
    size: number

}

散列的值 hash 是 CID(内容标识符),即从节点内容生成的唯一地址。(要更深入地了解CID 的生成方式以及为什么它们很重要,请查看我们的分散数据结构文章。)

该 add 方法 data 除了 File 对象之外还接受其他格式,并提供许多高级功能,options 用于设置块大小和哈希算法,在添加文件时固定文件等等。我们将在本文章中重点介绍基础知识,但是您可以查看完整的文档以了解更多信息。

我们已帮助您找到官方给出的文件,您可以进行操作体验,网址:

https://proto.school/#/regular-files-api/03

IPFS:常规文件API(一)

4

读取文件内容

在上文中,您看到添加到 IPFS 的每个文件都有其自己的唯一 hash 内容。这 hash 也称为CID(内容标识符),可以像访问文件的地址一样使用。如果知道文件的 CID,则可以使用catRegular IPFS Files API 提供的方法(类似于您以前在 Unix 风格的系统中可能看到的方法)来检索其内容,如下所示:

await ipfs.cat(ipfsPath, [options])

IPFS path 可以采用多种形式(您可以在 Files API 文档中阅读有关它们的信息)。在本文章中,我们将使用最简单 hash 的 ipfs.add 方法:调用方法时,接收到的对象中文件的字符串(CID)。您可能还记得上一课,该 add 方法为您添加到 IPFS 的每个文件返回了 path 和hash 值。稍后,我们将详细了解这两个值之间的差异。

该 cat 方法首先在您自己的节点中搜索所请求的文件,如果在该节点中找不到该文件,它将尝试在更广泛的 IPFS 网络上找到该文件。由于加密散列的工作方式,无论您托管的是哪个对等方,都可以确保您要搜索的内容与找到的文件匹配。

该 cat 方法返回的数据以的形式出现 Buffer。A Buffer 只是字节的原始集合,因此不会对编码或其包含的数据类型做任何假设。但是,如果我们知道要检索的文件是诸如 a 之类的纯文本文件.txt,则可以通过调用 JavaScript 方法将其缓冲的内容转换为 UTF-8 字符串(这些原始字节的解释).toString()。

因此,如果您在 IPFS 节点中具有文本文件的 CID,则可以将文件的内容作为可读字符串检索,如下所示:

let bufferedContents = await ipfs.cat('QmWCscor6qWPdx53zEQmZvQvuWQYxx1ARRCXwYVE4s9wzJ') // returns a Buffer

let stringContents = bufferedContents.toString() // returns a string

请注意,上面的示例 cat 在将值转换为字符串之前如何等待方法的结果。要在一行代码中完成此操作,您需要将await语句包装在括号中,如下所示:

let stringContents = (await ipfs.cat(cid)).toString() // returns a string

当您准备好在现实世界中尝试此操作时,应注意,此 cat 方法可能会导致占用大量内存,具体取决于所读取文件的内容。如果发现是这种情况,则可能需要改用 catReadableStream 或catPullStream 方法。

我们已帮助您找到官方给出的文件,您可以进行操作体验,网址:

https://proto.school/#/regular-files-api/04

IPFS:常规文件API(一)

该内容来自于互联网公开内容,非FilCloud原创内容,如若转载,请注明出处:https://htzkw.com/archives/16472

联系我们

aliyinhang@gmail.com