LOADING...
LOADING...
LOADING...
当前位置: 玩币族首页 > 新闻观点 > IPFS:常规文件API

IPFS:常规文件API

2019-11-28 FilCloud 来源:区块链网络
yuLJeZ3UksrG5jJlzgq3WtRZdpNnJyYSg5m5vNHP.png一、引入文件APIIPFS:星际文件系统

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更加用户友好。事情发生变化时,我们一定会更新我们的教程!

二、如何处理文件

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

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

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

名称(上传文件的名称)

lastModified(上次修改上传文件的日期)

大小(上传文件的大小)

类型(上传文件的类型)

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

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

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

640?wx_fmt=png

三、新增档案

处理文件

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

我们在幕后创建这些IPFS节点,以便您可以专注于每节课的内容。但是,在ProtoSchool之外,您希望获得更一致的体验,并希望可以重复访问一个节点(或多个节点)。为此,您可以自己在浏览器中初始化JS IPFS,也可以通过在终端中安装IPFS并运行守护程序在本地托管自己的节点。准备好进行实验时,可以访问IPFS文档站点,以了解如何安装IPFS和初始化节点。

如前所述,本教程中讨论的方法是IPFS?Files API的一部分。请查看文档以获取更多特定详细信息,例如每种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

640?wx_fmt=png

四、读取文件内容

在上一课中,您看到添加到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 Bufferlet 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

640?wx_fmt=png

联系我们

官网:https://filcloud.io/

微博:FilCloud

微信公众号:FilCloud

—-

编译者/作者:FilCloud

玩币族申明:玩币族作为开放的资讯翻译/分享平台,所提供的所有资讯仅代表作者个人观点,与玩币族平台立场无关,且不构成任何投资理财建议。文章版权归原作者所有。

LOADING...
LOADING...