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

本文主要是介绍p2p、分布式,区块链笔记: IPFS库Helia的文件系统Unix File System (UnixFS),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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 编码为Uint8Arraysconst cid = await fs.addBytes(encoder.encode('Hello World 101'), { // add the bytes to your node and receive a unique content identifieronProgress: (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.jsadd 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: bafkreife2klsil6kaxqhvmhgldpsvk5yutzm4i5bgjoq6fydefwtihnesacat 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)

这篇关于p2p、分布式,区块链笔记: IPFS库Helia的文件系统Unix File System (UnixFS)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1101353

相关文章

【区块链 + 人才服务】可信教育区块链治理系统 | FISCO BCOS应用案例

伴随着区块链技术的不断完善,其在教育信息化中的应用也在持续发展。利用区块链数据共识、不可篡改的特性, 将与教育相关的数据要素在区块链上进行存证确权,在确保数据可信的前提下,促进教育的公平、透明、开放,为教育教学质量提升赋能,实现教育数据的安全共享、高等教育体系的智慧治理。 可信教育区块链治理系统的顶层治理架构由教育部、高校、企业、学生等多方角色共同参与建设、维护,支撑教育资源共享、教学质量评估、

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

【区块链 + 人才服务】区块链集成开发平台 | FISCO BCOS应用案例

随着区块链技术的快速发展,越来越多的企业开始将其应用于实际业务中。然而,区块链技术的专业性使得其集成开发成为一项挑战。针对此,广东中创智慧科技有限公司基于国产开源联盟链 FISCO BCOS 推出了区块链集成开发平台。该平台基于区块链技术,提供一套全面的区块链开发工具和开发环境,支持开发者快速开发和部署区块链应用。此外,该平台还可以提供一套全面的区块链开发教程和文档,帮助开发者快速上手区块链开发。

论文阅读笔记: Segment Anything

文章目录 Segment Anything摘要引言任务模型数据引擎数据集负责任的人工智能 Segment Anything Model图像编码器提示编码器mask解码器解决歧义损失和训练 Segment Anything 论文地址: https://arxiv.org/abs/2304.02643 代码地址:https://github.com/facebookresear

数学建模笔记—— 非线性规划

数学建模笔记—— 非线性规划 非线性规划1. 模型原理1.1 非线性规划的标准型1.2 非线性规划求解的Matlab函数 2. 典型例题3. matlab代码求解3.1 例1 一个简单示例3.2 例2 选址问题1. 第一问 线性规划2. 第二问 非线性规划 非线性规划 非线性规划是一种求解目标函数或约束条件中有一个或几个非线性函数的最优化问题的方法。运筹学的一个重要分支。2

【C++学习笔记 20】C++中的智能指针

智能指针的功能 在上一篇笔记提到了在栈和堆上创建变量的区别,使用new关键字创建变量时,需要搭配delete关键字销毁变量。而智能指针的作用就是调用new分配内存时,不必自己去调用delete,甚至不用调用new。 智能指针实际上就是对原始指针的包装。 unique_ptr 最简单的智能指针,是一种作用域指针,意思是当指针超出该作用域时,会自动调用delete。它名为unique的原因是这个

查看提交历史 —— Git 学习笔记 11

查看提交历史 查看提交历史 不带任何选项的git log-p选项--stat 选项--pretty=oneline选项--pretty=format选项git log常用选项列表参考资料 在提交了若干更新,又或者克隆了某个项目之后,你也许想回顾下提交历史。 完成这个任务最简单而又有效的 工具是 git log 命令。 接下来的例子会用一个用于演示的 simplegit

记录每次更新到仓库 —— Git 学习笔记 10

记录每次更新到仓库 文章目录 文件的状态三个区域检查当前文件状态跟踪新文件取消跟踪(un-tracking)文件重新跟踪(re-tracking)文件暂存已修改文件忽略某些文件查看已暂存和未暂存的修改提交更新跳过暂存区删除文件移动文件参考资料 咱们接着很多天以前的 取得Git仓库 这篇文章继续说。 文件的状态 不管是通过哪种方法,现在我们已经有了一个仓库,并从这个仓

忽略某些文件 —— Git 学习笔记 05

忽略某些文件 忽略某些文件 通过.gitignore文件其他规则源如何选择规则源参考资料 对于某些文件,我们不希望把它们纳入 Git 的管理,也不希望它们总出现在未跟踪文件列表。通常它们都是些自动生成的文件,比如日志文件、编译过程中创建的临时文件等。 通过.gitignore文件 假设我们要忽略 lib.a 文件,那我们可以在 lib.a 所在目录下创建一个名为 .gi