可变文件系统:如何在IPFS中处理文件?
IPFS或星际文件系统是,用于共享分布式Web上的数据。顾名思义,您可以将IPFS视为文件系统,它具有一些独特的特性,使其成为安全、分散式共享的理想选择。
在这里您可以了解所有有关去中心化网络以及如何与您习惯的网络进行比较的信息。在这里,您将学到有关内容寻址、加密哈希、内容标识符(CID)以及与对等方共享的所有知识,以充分利用本教程有关IPFS的所有知识。
在IPFS中存储和共享数据
将内容添加到IPFS网络后,它会存放在哪里?
作为对等数据存储系统,IPFS(对等节点)在本地托管他们想要的任何数据。首次向IPFS添加新内容时,实际上只是在您自己的计算机上以适合于通过IPFS协议共享的格式对其进行设置。通常,您会在自己的计算机上安装IPFS,然后在该计算机上创建IPFS的新实例(也称为节点)。这就是您的数据在本地存储的地方,由内容地址(CID)引用。IPFS中存储的数据可以,但是最常见的用例之一是传统文件的共享,我们将在本教程中详细了解。
您可以选择在建立网络连接后与对等方共享数据或文件,但是如果您是的人,则当您的计算机脱机时,对等方将无法使用它。使多个同位体托管相同的文件可以使它们更容易使用,而使用CID(通过加密哈希算法创建的唯一内容标识符)则可以确保该系统的安全。在以后的教程中,我们将讨论更多有关共享的内容,但现在,我们将重点介绍如何在自己的IPFS实例中使用文件。
可变文件系统
由于IPFS中的文件是,因此您无法编辑文件。相反,每次更改都会创建一个新文件。该可变的文件系统(MFS)是内置到IPFS一个工具,可以让你把文件,就像你通常会在一个基于名称的文件系统-你可以添加、删除、移动和编辑MFS文件,并有更新链接的一切工作,哈希为您照顾。它是一种抽象,可让您像处理可变数据一样处理它们。
通过Files IPFS CLI(命令行界面)和API中的命令访问MFS 。在本教程中,我们将探索Files API。
如果您以前从命令行使用过文件和目录,那么许多MFS方法将看起来非常熟悉!
让我们开始探索如何在IPFS中处理文件!
01
检查目录状态
在我们的ProtoSchool教程中,每次您单击课程中的“提交”按钮时,我们都会在浏览器中为您创建一个新的IPFS节点。每当您ipfs.someMethod()在我们的课程中看到ipfs该变量时,它都是一个变量,它引用您的IPFS实例,也称为节点。您执行的操作,而不影响属于对等节点的节点。
我们正在幕后创建IPFS节点,因此您可以专注于本课的内容,但是最终,您需要通过在终端中安装IPFS和运行守护程序来学习在本地托管自己的节点。准备进行实验时,可以在我们的文档中找到有关安装IPFS和初始化节点的说明。
如前所述,与Mutable File System相关联的方法是Files API的一部分,因此它们将采用的格式ipfs.files.someMethod()。让我们看一个甚至可以在将任何文件添加到IPFS节点之前就可以开始使用的简单方法。
02
探索您的IPFS节点
在使用IPFS节点时,您通常需要检查文件或目录的状态。您可以使用进行此操作ipfs.files.stat,并传递您要检查的路径。
例如,要检查stuff位于我们的根目录(/)中的目录的状态,我们可以像这样调用方法:
await ipfs.files.stat('/stuff')
此方法返回一个对象,其中包含有关文件或目录的一些基本数据:
cid(CID对象)
大小(一个整数,以字节为单位的文件或目录大小)
累积大小(一个整数,该整数与组成文件的DAGNodes的大小(以字节为单位))
类型(可以是directory的字符串file)
块(如果type为directory,则为目录中的文件数;如果type为file,则为构成文件的块数)
withLocality(一个布尔值,指示是否存在位置信息)
本地(布尔值,表示所查询的dag是否在本地完全存在)
sizeLocal(一个整数,指示本地存在的数据的累积大小)
知道了!该size目录始终是0,不管有多少条目中包含的,因为目录其实只是一组链接到其他文件和目录。目录的cumulativeSize,相反,改变为目录中的内容变化。它不仅代表该目录中所有条目的文件大小,还代表描述这些条目的元数据:类型、块大小等。
重要的是要注意,stat即使您还没有任何IPFS节点,也可以。即使是。
03
在ProtoSchool中处理文件
为了安全起见,网络浏览器不允许我们直接更改计算机文件系统中的文件。因此,您需要将一个或多个文件上传到浏览器中,以便在本教程中使用。
在每个挑战中,您都会看到可以通过拖放或从文件资源管理器中选择文件来从计算机上载文件。如果仔细查看run代码编辑器中的函数,您会发现它现在。当您从计算机上载文件时,我们将确保将它们作为files数组传递到函数中。只要您不刷新浏览器,这些文件就可以在本教程的下一课中访问,但是您还可以选择上载不同的文件以用于每节课。
为了练习,让我们从您的计算机上载一个或多个文件,并查看浏览器作为files数组接收到的内容。
04
将文件添加到MFS
现在我们有了在浏览器中可访问的文件,让我们看看如何将它们添加到IPFS。
要将文件添加到IPFS,我们可以使用MFS files.write方法,如下所示:
await ipfs.files.write(path, content, [options])
MFS files.write方法可以接受的文件content在一个形式缓冲器,ReadableStream,PullStream,斑点(仅在浏览器中),或串路径到一个文件(仅在Node.js的)。由于浏览器中的文件对象是一种Blob,因此我们很高兴!
尽管浏览器中的文件对象碰巧知道自己的文件名,但Blob通常并不知道,因此IPFS无法直接确定现有文件名。我们必须在其中。
该path是你在你的IPFS实例中创建,包括所需的文件名的新路径。(请注意,这是我们正在描述的目标路径,而不是文件已在您的计算机上驻留的路径。)
MFS files.write方法,就像您可能在自己的计算机上使用过的类似方法一样,实际上是为编辑现有文件的内容而构建的。但是,我们还可以通过提供boolean选项{ create: true }来使用它来创建一个全新的文件,以指示如果文件在给定路径中不存在,则应在该文件中创建该文件。
因此,如果我们在浏览器中有一个文件对象,可以,并且我们想将其添加到IPFS的根目录中并命名为cat.jpg,我们可以这样做:
await ipfs.files.write('/cat.jpg', catPic, { create: true })
如果需要,可以使用串联(字符串的连接)来创建相同的路径。如果文件名是文件对象的属性,这将很方便,就像在浏览器中一样。
await ipfs.files.write('/' + catPic.name, catPic, { create: true })
,该files.write方法不提供返回值。
稍后,我们将研究如何将文件添加到根目录以外的目录。
05
查看目录的内容
当我们使用将文件添加到MFS时files.write,该方法没有返回任何值,但是我们仍然可以进行检查以确保一切都按预期进行。
在可变文件系统中,我们可以。如果您曾经使用命令行列出计算机上目录的内容,应该会感到非常熟悉。
该files.ls方法如下所示:
ipfs.files.ls([path], [options])
该方法默认将列出根目录(/)的内容,或者您可以选择指定path要检查的特定目录(例如)/catPics,
files.ls 产生一个对象数组,该对象数组针对您要检查的目录中包含的每个文件或目录,具有以下属性:
name:文件名
type:对象的类型(0-文件或1-目录)
size:文件大小(以字节为单位)
cid:内容标识符(CID),用于在IPFS中标识您的文件
mode:作为数字的UnixFS模式
mtime:具有数字secs和nsecs属性的对象
如果我们想检查/catPics 目录的内容,可以这样做:
ipfs.files.ls('/catPics')
由于该files.ls方法返回一个Async Iterable,因此只能一个一个地迭代这些值。如果需要返回所有值,则可以将每个值保存到一个数组中,然后返回该数组。
要遍历所有值,我们可以使用for await...of循环:
const result = []for await (const resultPart of ipfs.files.ls('/catPics')) {
result.push(resultPart)
}return result
为了使事情变得简单,我们可以使用it-all自动执行此操作的软件包:
// the all function comes from the it-all package// and is made globally available (just like ipfs) in our code challengesconst result = await all(ipfs.files.ls('/catPics'))
本次内容就到此结束了,如若想要了解更多有关IPFS的内容请关注我们的公众号,我们将持续更新关于IPFS的内容。
微信掃描關注公眾號,及時掌握新動向
2.本文版權歸屬原作所有,僅代表作者本人觀點,不代表比特範的觀點或立場
2.本文版權歸屬原作所有,僅代表作者本人觀點,不代表比特範的觀點或立場