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

相关文章

VMWare报错“指定的文件不是虚拟磁盘“或“The file specified is not a virtual disk”问题

《VMWare报错“指定的文件不是虚拟磁盘“或“Thefilespecifiedisnotavirtualdisk”问题》文章描述了如何修复VMware虚拟机中出现的“指定的文件不是虚拟... 目录VMWare报错“指定的文件不是虚拟磁盘“或“The file specified is not a virt

java如何分布式锁实现和选型

《java如何分布式锁实现和选型》文章介绍了分布式锁的重要性以及在分布式系统中常见的问题和需求,它详细阐述了如何使用分布式锁来确保数据的一致性和系统的高可用性,文章还提供了基于数据库、Redis和Zo... 目录引言:分布式锁的重要性与分布式系统中的常见问题和需求分布式锁的重要性分布式系统中常见的问题和需求

Golang使用minio替代文件系统的实战教程

《Golang使用minio替代文件系统的实战教程》本文讨论项目开发中直接文件系统的限制或不足,接着介绍Minio对象存储的优势,同时给出Golang的实际示例代码,包括初始化客户端、读取minio对... 目录文件系统 vs Minio文件系统不足:对象存储:miniogolang连接Minio配置Min

Golang使用etcd构建分布式锁的示例分享

《Golang使用etcd构建分布式锁的示例分享》在本教程中,我们将学习如何使用Go和etcd构建分布式锁系统,分布式锁系统对于管理对分布式系统中共享资源的并发访问至关重要,它有助于维护一致性,防止竞... 目录引言环境准备新建Go项目实现加锁和解锁功能测试分布式锁重构实现失败重试总结引言我们将使用Go作

Redis分布式锁使用及说明

《Redis分布式锁使用及说明》本文总结了Redis和Zookeeper在高可用性和高一致性场景下的应用,并详细介绍了Redis的分布式锁实现方式,包括使用Lua脚本和续期机制,最后,提到了RedLo... 目录Redis分布式锁加锁方式怎么会解错锁?举个小案例吧解锁方式续期总结Redis分布式锁如果追求

提示:Decompiled.class file,bytecode version如何解决

《提示:Decompiled.classfile,bytecodeversion如何解决》在处理Decompiled.classfile和bytecodeversion问题时,通过修改Maven配... 目录问题原因总结问题1、提示:Decompiled .class file,China编程 bytecode

【区块链 + 人才服务】可信教育区块链治理系统 | 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 推出了区块链集成开发平台。该平台基于区块链技术,提供一套全面的区块链开发工具和开发环境,支持开发者快速开发和部署区块链应用。此外,该平台还可以提供一套全面的区块链开发教程和文档,帮助开发者快速上手区块链开发。