p2p、分布式,区块链笔记: IPFS库Helia的文件系统Unix File System (UnixFS)

news2024/11/15 17:35:23

Unix File System (UnixFS)

  • Helia中定义一个UnixFS类用于文件处理。The Unix File System (UnixFS) is the data format used to represent files and all their links and metadata in IPFS.。UnixFS中的方法封装了常见的文件系统操作,使得在去中心化文件系统中处理文件和目录变得更加简单和直观。其主要操作由importer和exporter执行。

在这里插入图片描述

importer:导入文件并创建DAG

  • Importer从文件和目录构建有向无环图DAG,意味着文件被分解成块,然后使用“链接节点”以树状结构排列,连接在一起,给定文件的“散列”实际上是DAG中根节点的散列。
/**
 * The importer creates UnixFS DAGs and stores the blocks that make
 * them up in the passed blockstore.
 *
 * @example
 *
 * ```typescript
 * import { importer } from 'ipfs-unixfs-importer'
 * import { MemoryBlockstore } from 'blockstore-core'
 *
 * // store blocks in memory, other blockstores are available
 * const blockstore = new MemoryBlockstore()
 *
 * const input = [{
 *   path: './foo.txt',
 *   content: Uint8Array.from([0, 1, 2, 3, 4])
 * }, {
 *   path: './bar.txt',
 *   content: Uint8Array.from([0, 1, 2, 3, 4])
 * }]
 *
 * for await (const entry of importer(input, blockstore)) {
 *   console.info(entry)
 *   // { cid: CID(), ... }
 * }
 * ```
 */
export async function* importer(source, blockstore, options = {}) {
    let candidates;
    if (Symbol.asyncIterator in source || Symbol.iterator in source) {
        candidates = source;
    }
    else {
        candidates = [source];
    }
    const wrapWithDirectory = options.wrapWithDirectory ?? false;
    const shardSplitThresholdBytes = options.shardSplitThresholdBytes ?? 262144;
    const shardFanoutBits = options.shardFanoutBits ?? 8;
    const cidVersion = options.cidVersion ?? 1;
    const rawLeaves = options.rawLeaves ?? true;
    const leafType = options.leafType ?? 'file';
    const fileImportConcurrency = options.fileImportConcurrency ?? 50;
    const blockWriteConcurrency = options.blockWriteConcurrency ?? 10;
    const reduceSingleLeafToSelf = options.reduceSingleLeafToSelf ?? true;
    const chunker = options.chunker ?? fixedSize();
    const chunkValidator = options.chunkValidator ?? defaultChunkValidator();
    const buildDag = options.dagBuilder ?? defaultDagBuilder({
        chunker,
        chunkValidator,
        wrapWithDirectory,
        layout: options.layout ?? balanced(),
        bufferImporter: options.bufferImporter ?? defaultBufferImporter({
            cidVersion,
            rawLeaves,
            leafType,
            onProgress: options.onProgress
        }),
        blockWriteConcurrency,
        reduceSingleLeafToSelf,
        cidVersion,
        onProgress: options.onProgress
    });
    const buildTree = options.treeBuilder ?? defaultTreeBuilder({
        wrapWithDirectory,
        shardSplitThresholdBytes,
        shardFanoutBits,
        cidVersion,
        onProgress: options.onProgress
    });
    for await (const entry of buildTree(parallelBatch(buildDag(candidates, blockstore), fileImportConcurrency), blockstore)) {
        yield {
            cid: entry.cid,
            path: entry.path,
            unixfs: entry.unixfs,
            size: entry.size
        };
    }
}
  • 构建树的函数buildTree会返回根节点的内容标识符 (CID)

在这里插入图片描述

在这里插入图片描述

exporter :导出 DAG

  • exporter 从 UnixFS 图中导出或读取文件数据,需要进行顺序遍历,逐一提取每个叶子节点中包含的数据。
/**
 * Uses the given blockstore instance to fetch an IPFS node by a CID or path.
 *
 * Returns a {@link Promise} which resolves to a {@link UnixFSEntry}.
 *
 * @example
 *
 * ```typescript
 * import { exporter } from 'ipfs-unixfs-exporter'
 * import { CID } from 'multiformats/cid'
 *
 * const cid = CID.parse('QmFoo')
 *
 * const entry = await exporter(cid, blockstore, {
 *   signal: AbortSignal.timeout(50000)
 * })
 *
 * if (entry.type === 'file') {
 *   for await (const chunk of entry.content()) {
 *     // chunk is a Uint8Array
 *   }
 * }
 * ```
 */
export async function exporter (path: string | CID, blockstore: ReadableStorage, options: ExporterOptions = {}): Promise<UnixFSEntry> {
  const result = await last(walkPath(path, blockstore, options))

  if (result == null) {
    throw errCode(new Error(`Could not resolve ${path}`), 'ERR_NOT_FOUND')
  }

  return result
}

UnixFS相关函数

  1. addAll(source: ImportCandidateStream, options?: Partial<AddOptions>): AsyncIterable<ImportResult>

    • 功能: 从提供的流中导入多个文件和目录。
    • 用法: 你传入一个包含文件及其内容的流,返回一个异步可迭代对象,用于获取每个导入文件的结果。
  2. addBytes(bytes: Uint8Array, options?: Partial<AddOptions>): Promise<CID>

    • 功能: 将单个 Uint8Array(二进制数据)作为文件添加到文件系统中。
    • 用法: 你提供一个 Uint8Array 的文件数据,返回一个 Promise,该 Promise 解析为新添加文件的 CID(内容标识符)。
  3. addByteStream(bytes: ByteStream, options?: Partial<AddOptions>): Promise<CID>

    • 功能: 将一系列 Uint8Array 数据流作为文件添加到文件系统中。
    • 用法: 你提供一个字节流(如文件的读取流),返回一个 Promise,该 Promise 解析为文件的 CID。
  4. addFile(file: FileCandidate, options?: Partial<AddOptions>): Promise<CID>

    • 功能: 添加一个文件,并可以附带可选的元数据(如路径、内容、权限和修改时间)。
    • 用法: 你提供一个包含文件元数据和内容的对象,返回一个 Promise,该 Promise 解析为文件的 CID。
  5. addDirectory(dir?: Partial<DirectoryCandidate>, options?: Partial<AddOptions>): Promise<CID>

    • 功能: 创建一个新目录。
    • 用法: 你可以选择性地传递目录的元数据,返回一个 Promise,该 Promise 解析为新目录的 CID。
  6. cat(cid: CID, options?: Partial<CatOptions>): AsyncIterable<Uint8Array>

    • 功能: 检索文件的内容。
    • 用法: 你提供一个 CID,返回一个异步可迭代对象,用于获取文件的数据。
  7. chmod(cid: CID, mode: number, options?: Partial<ChmodOptions>): Promise<CID>

    • 功能: 更改文件或目录的权限。
    • 用法: 你提供 CID 和新的权限模式,返回一个 Promise,该 Promise 解析为更新后的 CID。
  8. cp(source: CID, target: CID, name: string, options?: Partial<CpOptions>): Promise<CID>

    • 功能: 将文件或目录复制到目标目录中,并指定新名称。
    • 用法: 你提供源 CID、目标目录 CID 和新名称,返回一个 Promise,该 Promise 解析为更新后的目录 CID。
  9. ls(cid: CID, options?: Partial<LsOptions>): AsyncIterable<UnixFSEntry>

    • 功能: 列出目录的内容。
    • 用法: 你提供一个目录的 CID,返回一个异步可迭代对象,用于获取目录条目。
  10. mkdir(cid: CID, dirname: string, options?: Partial<MkdirOptions>): Promise<CID>

    • 功能: 在现有目录下创建一个新目录。
    • 用法: 你提供父目录的 CID 和新目录的名称,返回一个 Promise,该 Promise 解析为更新后的 CID。
  11. rm(cid: CID, path: string, options?: Partial<RmOptions>): Promise<CID>

    • 功能: 从现有目录中删除文件或目录。
    • 用法: 你提供目录 CID 和要删除的路径,返回一个 Promise,该 Promise 解析为更新后的 CID。
  12. stat(cid: CID, options?: Partial<StatOptions>): Promise<UnixFSStats>

    • 功能: 返回文件或目录的统计信息(如大小和权限)。
    • 用法: 你提供一个 CID,返回一个 Promise,该 Promise 解析为包含统计信息的对象。
  13. touch(cid: CID, options?: Partial<TouchOptions>): Promise<CID>

    • 功能: 更新文件或目录的修改时间。
    • 用法: 你提供一个 CID,返回一个 Promise,该 Promise 解析为更新后的 CID,包含新的修改时间。

代码

101-basics.js

// https://github.com/ipfs-examples/helia-examples/tree/main/examples/helia-101
/* eslint-disable no-console */

import { unixfs } from '@helia/unixfs'
import { createHelia } from 'helia'


const helia = await createHelia() // 顶层 await 创建一个 Helia 节点。这个节点是与分布式存储系统交互的基础。
const fs = unixfs(helia)// 创建文件系统

/* 存储文件 */
const encoder = new TextEncoder()// 用于将strings 编码为Uint8Arrays

const cid = await fs.addBytes(encoder.encode('Hello World 101'), { // add the bytes to your node and receive a unique content identifier
  onProgress: (evt) => {
    console.info('add event', evt.type, evt.detail)
  }
})

console.log('Added file:', cid.toString())

/* 读取文件 */
const decoder = new TextDecoder()// this decoder will turn Uint8Arrays into strings
let text = ''

for await (const chunk of fs.cat(cid, {
  onProgress: (evt) => {
    console.info('cat event', evt.type, evt.detail)
  }
})) {
  text += decoder.decode(chunk, {
    stream: true
  })
}

console.log('Added file contents:', text)

运行输出

PS C:\Users\kingchuxing\Documents\IPFS\helia\helia-examples-main\examples\helia-101> npm run 101-basics

> helia-101@1.0.0 101-basics
> node 101-basics.js

add event unixfs:importer:progress:file:read { bytesRead: 15n, chunkSize: 15n, path: undefined }
add event blocks:put:providers:notify CID(bafkreife2klsil6kaxqhvmhgldpsvk5yutzm4i5bgjoq6fydefwtihnesa)
add event blocks:put:blockstore:put CID(bafkreife2klsil6kaxqhvmhgldpsvk5yutzm4i5bgjoq6fydefwtihnesa)
add event unixfs:importer:progress:file:write {
  bytesWritten: 15n,
  cid: CID(bafkreife2klsil6kaxqhvmhgldpsvk5yutzm4i5bgjoq6fydefwtihnesa),
  path: undefined
}
add event unixfs:importer:progress:file:layout {
  cid: CID(bafkreife2klsil6kaxqhvmhgldpsvk5yutzm4i5bgjoq6fydefwtihnesa),
  path: undefined
}

Added file: bafkreife2klsil6kaxqhvmhgldpsvk5yutzm4i5bgjoq6fydefwtihnesa

cat event blocks:get:blockstore:get CID(bafkreife2klsil6kaxqhvmhgldpsvk5yutzm4i5bgjoq6fydefwtihnesa)
cat event unixfs:exporter:progress:raw { bytesRead: 15n, totalBytes: 15n, fileSize: 15n }
Added file contents: Hello World 101
(node:10028) MaxListenersExceededWarning: Possible EventTarget memory leak detected. 11 abort listeners added to [AbortSignal]. MaxListeners is 10. 
Use events.setMaxListeners() to increase limit
(Use `node --trace-warnings ...` to show where the warning was created)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2067622.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

跨越时代的Zynq PL编程:从xdevcfg到FPGA Manager的进化

引言 在嵌入式系统设计与开发的广阔领域中&#xff0c;Xilinx Zynq平台以其独特的ARM处理器与FPGA可编程逻辑&#xff08;PL&#xff09;的结合&#xff0c;成为了众多创新项目的首选。然而&#xff0c;随着技术的不断进步&#xff0c;Zynq PL的编程方式也经历了从经典到现代的…

【UCB CS61C】Lecture 2 3 - C Basics

目录 C 语言的编译&#xff08;Compilation&#xff09;变量类型&#xff08;Variable Types&#xff09;字符&#xff08;Characters&#xff09; C 语言的类型转换&#xff08;Typecasting&#xff09;类型函数&#xff08;Typed Functions&#xff09; 结构体&#xff08;St…

【C++ Primer Plus习题】3.6

问题: 解答: #include <iostream> using namespace std;int main() {float miles 0;float gallons 0;float gallon 0;cout << "请输入驱车里程(单位为英里):";cin >> miles;cout << "请输入使用的汽油量(单位为加仑):";cin &g…

【数据结构】一篇讲清楚什么是堆? 带图食用超详细~

目录 一、堆的概念 1.堆是一个完全二叉树 2.堆分为大根堆和小根堆。 3.堆与优先级队列的关系 二、堆操作 1.向下调整 2.删除堆顶元素 3.添加新元素 4.构建堆 A&#xff1a;自底向上构建 B&#xff1a;自顶向下构建 C&#xff1a;两种方式对比 三、尝试自己编程实现堆…

redis实战——go-redis的使用与redis基础数据类型的使用场景(二)

一.go-redis操作hash 常用命令&#xff1a; redisClient.HSet("map", "name", "jack") // 批量设置 redisClient.HMSet("map", map[string]interface{}{"a": "b", "c": "d", "e"…

基于springmvc实现文件上传

1.导入jar包 2.修改配置类 在springmvc.xml添加bean <!-- 配置文件上传处理器 --><bean id"multipartResolver" class"org.springframework.web.multipart.commons.CommonsMultipartResolver"><!-- 设置在内存中允许的最大文件大小&#x…

趣味算法------柠檬水摊

目录 题目概述&#xff1a; 解题思路&#xff1a; 具体代码&#xff1a; 总结&#xff1a; 题目概述&#xff1a; 在柠檬水摊上&#xff0c;每个柠檬水售价 5 元。客户正在排队向您购买&#xff0c;并且一次订购一份柠檬水。 每位顾客只会购买一份柠檬水&#xff0c;并支付 5…

【python】火灾检测图像处理方法设计(源码+论文)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

深入探讨Java多线程

我的主页&#xff1a;2的n次方_ 1. 多线程的概念 多线程是指在同一个程序中同时执行多个线程的技术。线程是操作系统能够独立调度和执行的最小单位。在Java中&#xff0c;线程由Thread类来表示&#xff0c;所有的线程都是通过这个类或其子类来创建和控制的。通过合理的多线…

解决ERROR: No matching distribution found for imp报错问题

一、问题描述 当我们使用Python3.4及其以上版本运行Python项目时&#xff0c;提示【ModuleNotFoundError: No module named imp】&#xff0c;但是我们使用【pip install imp】命令安装imp时却提示如下错误信息&#xff1a; ERROR: Could not find a version that satisfies t…

深入理解Java代理模式:从静态到动态的实现与应用

1、引言 在Java编程中&#xff0c;代理模式是一种常见的设计模式&#xff0c;用于在不修改原始代码的情况下&#xff0c;为对象添加额外的功能。代理模式有两种主要类型&#xff1a;静态代理和动态代理。本文将全面探讨这两种代理模式&#xff0c;包括它们的基本概念、实现方式…

增材制造(3D打印):为何备受制造业瞩目?

在科技浪潮的推动下&#xff0c;增材制造——即3D打印技术&#xff0c;正逐步成为制造业领域的璀璨新星&#xff0c;吸引了航空航天、汽车、家电、电子等众多行业的目光。那么&#xff0c;是什么让3D打印技术如此引人注目并广泛应用于制造领域&#xff1f;其背后的核心优势又是…

VSCODE SSH连接失败

前提&#xff1a;以前连接得好好的 突然有一天就连接不上了 打开C盘下的known_hosts文件删除如下内容&#xff0c;重新登陆即可

天正如何保存低版本

打开天正cad的界面。左边找到文件布图这个菜单&#xff0c;点击进入找到图形导出这个子菜单&#xff0c;之后会出现下面这一界面。 第2步 可以看到保存类型&#xff0c;一进去是天正3文件的&#xff0c;这时候你要点开下拉选择天正6文件&#xff0c;其它可以不用修o改&#x…

Keepalived和Nginx一起在Centos7上实现Nginx高可用设计

方案概览 如需详细信息可点击下列链接进行视频观看 B站 7分钟弄懂啥是高可用基石-VIP从零开始实操VIP 抖音 7分钟弄懂啥是高可用基石-VIP从零开始实操VIP Centos7 yum更新 安装阿里yum源 wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Cent…

TCP/UDP的对比,粘包分包抓包,http协议

服务器端&#xff1a; 一、loop 127.0.0.1本地回环测试地址 二、tcp特点 面向连接、可靠传输、字节流 粘包问题&#xff1a;tcp流式套接字&#xff0c;数据与数据之间没有套接字&#xff0c;导致可能多次的数据粘到一起 解决方法&#xff1a;&#xff08;1&#xff09;规…

Linux数据相关第1个服务_备份服务rsync

1、备份服务概述 备份服务&#xff1a;需要使用到脚本&#xff0c;打包备份&#xff0c;定时任务 备份服务&#xff1a;rsyncd 服务&#xff0c;不同主机之间数据传输 特点: rsync是个服务也是命令使用方便&#xff0c;具有多种模式传输数据的时候是增量传输 增量与全量&am…

Nginx: 配置项之http模块connection和request的用法以及limit_conn和limit_req模块

connection和request connection 就是一个连接, TCP连接 客户端和服务器想要进行通信的话&#xff0c;有很多种方式比如说, TCP的形式或者是UDP形式的通常很多应用都是建立在这个TCP之上的所以, 客户端和服务器通信&#xff0c;使用了TCP协议的话&#xff0c;必然涉及建立TCP连…

一分钟告诉你毕业季大学都在用在线版招生简章是如何制作?

毕业季临近&#xff0c;各大高校纷纷进入招生宣传的关键时期。在数字化时代背景下&#xff0c;在线版招生简章成为了高校之间竞争的焦点。一分钟带你了解&#xff0c;这些吸引眼球的在线版招生简章是如何制作出来的。 1. 准备好制作工具&#xff1a;FLBOOK在线制作电子杂志平台…

【论文分享】Graviton: Trusted Execution Environments on GPUs 2018’OSDI

目录 AbstractIntroductioncontributions BackgroundGPUSoftware stackHardwareContext and channel managementCommand submissionProgramming modelInitializationMemory allocationHost-GPU transfersKernel dispatch Sharing Intel SGX Threat ModelOverviewGraviton Archi…