当你想开发一个去中心化的应用程序时,你可能会想到像以太坊这样的区块链。 区块链在管理状态、通过智能合约自动化流程以及交换经济价值等方面非常有用。通过这篇教程可以了解去中心化存储背后的工作原理,学习有关区块链的更多知识。 但是,您将应用程序的内容存储在哪里呢?这些数据包括了图像、文件,以及由 HTML、CSS 和 JS 文件构成的应用网站前端服务。 您的应用程序和用户内容是否从中心化的亚马逊云服务器加载? 在区块链上存储内容将是昂贵和低效的。您的区块链应用程序需要去中心化存储方案! 在本教程中,我将向你介绍 IPFS。你将了解到: 如何通过去中心化存储来存储数据 如何运行自己的 IPFS 节点 关于 IPFS 协议的底层内部构造 我们将读取存储在 IPFS 上的维基百科网站。 准备好了吗?那开始吧。 目录 什么是 IPFS? 如何设置 IPFS 节点 如何使用 CLI 和 HTTP 协议存储和检索 IPFS 内容 什么是 CID--IPFS 基于内容的标识符 如何对 IPFS 数据存储区进行反向工程 如何将 IPFS 节点连接到去中心化网络 如何使用 Bitswap 协议在点对点网络上交换数据 如何在点对点网络上保存内容 1 什么是 IPFS? 星际文件系统的缩写是 IPFS,它是一个点对点的超媒体协议,旨在让网络变得更快、更安全和更开放。 IPFS是用于存储和共享内容的协议。就像在区块链世界中一样,每个用户都在运行自己的节点(服务器)。节点之间可以互相通讯并交换文件。 IPFS 有什么独特之处? 首先,IPFS 是去中心化的,因为它从数千个节点中载入内容,而不是从一个中心化服务器加载内容。 数据的每一个片段都是用密码学哈希运算处理的,从而产生安全、唯一的内容标识符:CID。 将您的网站存储在 IPFS 中,以避免审查和单点故障。您的个人 IPFS 节点是否掉线?别担心,该网站仍会从全球其他提供服务的节点加载服务。 例如,假设维基百科服务难以使用,就可以从 IPFS 的点对点网络上获取在 4 月 17 日进行索引并持久化存储的去中心化版维基百科。具体是通过 CID:
其次,IPFS 内容的完整性可以进行加密验证。 最后,IPFS 内容是有重复内容处理机制的。如果你尝试在同一 IPFS 节点中存储两个相同的 1 MB 文件,则它们将只存储一次,从而消除重复,因为它们的哈希值会生成同样的CID标识。 2 如何设置 IPFS 节点 安装 IPFS 打开 IPFS 官方文档安装页面,根据您的操作系统(Windows、MacOS、Linux)按照说明操作。我会在下面记录 Ubuntu 环境下的安装过程。 IPFS安装文档: https://docs.ipfs.io/install/command-line/#system-requirements 我倾向于从头开始编译 ipfs/go-ipfs 代码库并按需查错。毕竟,Go 语言真的很棒。 在 Go 环境里编译代码 克隆存储库并运行 Makefile 中的安装脚本。 git?clone?https://github.com/ipfs/go-ipfs.gitcd?go-ipfsgit?checkout?v0.8.0-rc2make?install 或者下载并安装预编译版本的 IPFS: sudo?snap?install?ipfs 验证安装 Go 很棒,自己编译代码也是很酷的,而且是去中心化的。生成的二进制文件将在$GOPATH 中创建。 which?ipfs> /home/web3coach/go/bin/ipfs ipfs version> ipfs version 0.8.0-rc2 新节点初始化 运行 ipfs init 创建新节点。默认情况下,它将创建一个文件夹并将所有数据存储在~/.ipfs 中。您可以通过配置 IPFS_PATH 环境变量进行调整。 IPFS_PATH=/home/web3coach/.ipfs_tutorial ipfs init > generating ED25519 keypair...done> peer identity: 12D3Koo...dNs> initializing IPFS node at /home/web3coach/.ipfs_tutorial 现在你的节点现在已完全初始化,等待你上传内容。 3 如何使用 IPFS 添加内容 IPFS 可以处理各种不同的数据类型,从简单的文本到图像、视频和网站等。 下面先从存储这段简单的信息开始:hello IPFS world by Web3Coach: echo?"hello?IPFS?world?by?Web3Coach.?BTW:?Ethereum?FTW"?|?ipfs?add 这样,内容就存储好了,并通过密码学哈希函数建立索引,然后返回其独特的内容标识号(CID): >?added?QmRBkKi1PnthqaBaiZnXML6fH6PNqCFdpcBxGYXoUQfp6z>?49?B?/?49?B?[========]?100% IPFS 节点将在本地文件系统上生成与本教程中相同的 CID。 这是因为 IPFS 会对内容进行哈希并返回其唯一的指纹,毕竟一个安全的哈希函数总是会对指定的输入值返回固定的输出值。 Pin 内容 添加内容时,只将其添加到本地节点。内容不会在整个网络中自动复制,这也是IPFS用户和开发者之间的常见误解。 当你使用add 命令, IPFS默认情况下也会执行 pin 命令: ipfs?pin?add?QmRBkKi1PnthqaBaiZnXML6fH6PNqCFdpcBxGYXoUQfp6z 为了将内容进行全网复制,你必须将节点上线,加入点对点网络,并在其他节点上pin特定的CID标识号。 在这篇教程的后面,你会学习到操作方法,了解到背后的工作原理。 读取内容 拷贝这个 CID 标识到 IPFS 的 cat 命令行,以从磁盘中读取: ipfs?cat?QmRBkKi1PnthqaBaiZnXML6fH6PNqCFdpcBxGYXoUQfp6z>?hello?IPFS?world?by?Web3Coach.?BTW:?Ethereum?FTW add、pin 和 cat 命令是最重要的 IPFS 功能,你现在已经了解了。 4 IPFS 内容寻址是如何运作的 QmRBkKi1PnthqaBaiZnXML6fH6PNqCFdpcBxGYXoUQfp6z是什么? 它是一个基于内容的自描述标识符。 “自我描述”到底是什么意思?即根据 IPFS 的规格约定,你可以通过切割这个字符串,就可以了解其索引的数据。 这是什么 CID 版本 CID 字符串的读取方式(base32?base58?十六进制?) 数据的编码方式 数据指纹对应的哈希函数是什么 哈希函数的长度 IPFS 团队搭建了一个方便分析 CID 的网站: 网站链接:https://cid.ipfs.io/ 通过解析QmRBkKi1P…P6z?这个CID标识,您会发现: CID遵循版本v0规范,因为它以Qm开头 QmRBkKi1P…P6z字符串使用base58btc编码 "hello IPFS world by Web3Coach. BTW: Ethereum FTW" 这个数据在往磁盘上存储之前,是根据0x70编码器作为DAG Protobuf编码的。 哈希值0x12表示使用sha256哈希函数获得的数据指纹,从而生成了一个32字节长的独特摘要值 相比于一个 MySQL 数据表里的自增 INT 键值,这就“稍微复杂了点”。不过这是非常有效的,而且能够应对未来的挑战。让我展开解释一下: CID 标识号版本 目前有两个 CID 标识号版本:v0 和 v1。 CID v0 不是很灵活,而且仅限于: 以字符“QM”开头 其中,使用 base58btc 对 CID 字符串进行编码 默认情况下,数据使用 dag-pb 编码 可以转换为 CID 版本 v1,但不能反过来 CID v1 利用多个前缀实现最大互操作性: CID v1=Multibase+Multicodec+Multihash 换句话说,根据这个规格将二进制内容解析成为 CID V1 版: <base><codec><hash-function><hash-length><hash-digest> Multihash 为了满足未来需求,且支持不同的哈希算法,IPFS 设立了如下的标准: CODE : SIZE : DIGEST type?DecodedMultihash?struct?{???Code???uint64?//?0x12???Name???string?//?sha2-256???Length?int????//?32?bytes???Digest?[]byte?//?Digest?holds?the?raw?multihash?bytes} Multihash 有很多优点。当未来 5 年内计算机的性能更强大时,你可以通过配置相应的 0x13 代码作为 CID 标识前缀里的 Multihash ,就可以使用一个更强的哈希函数(如sha3-512)。到时候协议早就就绪了。 Multicodec Code 属性告诉您数据在存储到磁盘之前是如何编码的,因此当用户想要读取数据时,就可以知道如何解码。它可以是 CBOR、Protobuf、JSON 等。 IPFS 维护所有可能的编解码器的公共列表。最常见的编解码器有: raw ? ? ? | ipld ? ? ?| 0x55 | raw binarydag-pb ? ?| ipld ? ? ?| 0x70 | MerkleDAG protobufdag-cbor ?| ipld ? ? ?| 0x71 | MerkleDAG cbor // but you could also encode Ethereum blocks on IPFS!eth-block | ipld ? ? ?| 0x90 | Ethereum Block (RLP) Multibase CID v0 版和 base58btc 编码的问题在于环境之间缺乏互操作性。multibase前缀添加了对不同编码(如base32)的支持,从而实现对 DNS 友好的命名。 包含所有Multibase编码的表: encoding??|?codebase32????|?bbase58btc?|?zbase64????|?m 您可以根据第一个字符发现 Multibase 编码: QmRBkKi1PnthqaBaiZnXML6fH6PNqCFdpcBxGYXoUQfp6z 这是 CID v0 版标识 CID 字符串使用 base58btc 编码 Bafybeibkjmxftowv4lki46nad4arescoqc7kdzfnjkqux257i4jonk44w4 这是 CID v1版标识 CID 字符串使用 base32 编码 两个 CID 标识版本都可以取回同样的内容,因为在你忽略编码方式时,其实就是? Multihash 在数据存储的区块层面进行索引。 与此相反, Multibase 只用于在不同环境间(CLI、URL、DNS)正确传递 CID 标识号。 ipfs?cat?QmRBkKi1PnthqaBaiZnXML6fH6PNqCFdpcBxGYXoUQfp6z>?hello?IPFS?world?by?Web3Coach.?BTW:?Ethereum?FTW//?equivalent?toipfs?cat?bafybeibkjmxftowv4lki46nad4arescoqc7kdzfnjkqux257i4jonk44w4>?hello?IPFS?world?by?Web3Coach.?BTW:?Ethereum?FTW 现在情况很快就变得“有点复杂了”。 谈到复杂的主题,IPFS 非常强大,因为它不仅将内容视为数据,而且将其视为数据结构,InterPlanetary Linked Data Structure:IPLD。 简而言之,您可以在 IPLD 之上实现任何文件系统、数据库或结构。 例如,你可以在 IPFS 上存储所有的以太坊区块链,只要你设置 eth-block 和 eth-tx 编码器,并在操作 IPLD graph 时注册合适的解码器。 让我们研究一下默认的 IPLD 结构与 DAG Protobuf 编码器使用的情形。 5 IPFS 如何在文件系统上存储内容 你的内容将会被使用 Chunker 分割器来打散成块 ,然后使用链接节点'link nodes'将其连接在一起并整理成树状结构。返回的 CID 标识号则是 DAG 里的根节点的哈希值。 让我们先回到一些基础问题。 探索节点的数据目录 在本教程开始时,使用 ipfs init 命令初始化 IPFS 节点时,生成了以下目录: export IPFS_PATH=/home/web3coach/.ipfs_tutorialcd $IPFS_PATH~/.ipfs_tutorial ?tree .├── blocks│ ? ├── 6Y│ ? │ ? └── CIQA4XCGRCRTCCHV7XSGAZPZJOAOHLPOI6IQR3H6YQ.data├── config├── datastore│ ? ├── 000002.ldb│ ? ├── 000003.log│ ? ├── CURRENT│ ? ├── CURRENT.bak│ ? ├── LOCK│ ? ├── LOG│ ? └── MANIFEST-000004├── datastore_spec├── keystore└── version 从顶层的角度来看: blocks?—?IPFS 在这里存储了所有的数据切块,不同 go-ipfs 的灵活接口让你可以将存储方案改成不同的数据库 config?—?节点的设置(文件系统,身份,规格和网络) datastore?—索引和其他逻辑 实践是检验真理的标准。你可以使用下面的内容在本地的文件系统上创建新文件,并将其添加到 IPFS 上: hello IPFS world by Web3Coach. Testing DAGshello IPFS world by Web3Coach. Testing DAGshello IPFS world by Web3Coach. Testing DAGs ls -la hello_world.txt> 131 bytes hello_world.txt ipfs add hello_world.txt> added QmNtQtxeavDXTjCiWAAaxnhKK3LBYfFfpXUXjdMDYXwKtH 对go-ipfs代码进行反向工程,这是它背后的机制: IPFS UnixFS 添加新文件并转换到数据块里 通过检查数据块目录来验证持久性进程。您会发现内容是使用 DAG Protobuf 编码(131字节+Protobuf额外编码)写在 Multihash Datastor Key 下的。 ls -la blocks/PV/> 142 CIQAQIXXW2OAQSKZ6AQ2SDEYRZXWPDZNJUAFR3YORYN75I5CQ3LHPVQ.data vim blocks/PV/CIQA...<8b>^A^H^B^R<83>^Ahello IPFS world by Web3Coach. Testing DAGshello IPFS world by Web3Coach. Testing DAGshello IPFS world by Web3Coach. Testing DAGs^X<83>^A 为了与原始内容交互,请使用 ipfs object 命令: ipfs?object?get?QmNtQtxeavDXTjCiWAAaxnhKK3LBYfFfpXUXjdMDYXwKtH?|?jq {??"Links":?[],??"Data":?"\b\u0002\u0012?\u0001hello?IPFS?world?by?Web3Coach.?Testing?DAGs\nhello?IPFS?world?by?Web3Coach.?Testing?DAGs\nhello?IPFS?world?by?Web3Coach.?Testing?DAGs\u0018?\u0001"} 因为内容只有 131 个字节,所以它适合于一个 DAG 节点 DAG 节点作为一个数据块保存在磁盘上 DAG 节点与其他节点的链接为 0 下面是实验的时间。 再次添加相同的文件,但将 Chunker 切块器配置为 64 字节(或使用更大的文件,但一个较小的分割器配置会更好地解释这些问题)。 ipfs add --chunker=size-64 hello_world.txt > 131 bytes QmTwtTQgrTaait2qWXYjTsEZiF4sT7CD4U87VqQ27Wnsn8 你得到了一个新的 CID 标识号! IPFS 将内容分割为 4 个 DAG 节点,并向磁盘写入了以 DAG Protobuf 格式编码的 4 个数据块。 IPFS 将一个文件分割成多个 chunks(DAG Nodes + Blocks) ipfs?object?get?QmTwtTQgrTaait2qWXYjTsEZiF4sT7CD4U87VqQ27Wnsn8?|?jq {??"Links":?[????{??????"Name":?"",??????"Hash":?"QmTbsuUYzy3nT6NApb5t7VUq3iQKZXrJJJY2j1miMVgaJU",??????"Size":?72????},????{??????"Name":?"",??????"Hash":?"QmNy9iFF8uU1Cn7trxpSgqxMsjmi4zQ7xgyEgsWff5rnfH",??????"Size":?72????},????{??????"Name":?"",??????"Hash":?"QmdEitCfYgBNxLhxTNvdLaDmTypSAWkGErjw33VZxUbWK3",??????"Size":?11????}??],??"Data":?"\b\u0002\u0018?\u0001?@?@?\u0003"} 最终测试是检索每个 DAG 节点的数据,并验证该文本被分割为三块: DAG Protobuf 节点 1: ipfs?object?get?QmTbsuUYzy3nT6NApb5t7VUq3iQKZXrJJJY2j1miMVgaJU?|?jq {??"Links":?[],??"Data":?"\b\u0002\u0012@hello?IPFS?world?by?Web3Coach.?Testing?DAGs\nhello?IPFS?world?by?\u0018@"} DAG Protobuf 节点 2: ipfs?object?get?QmNy9iFF8uU1Cn7trxpSgqxMsjmi4zQ7xgyEgsWff5rnfH?|?jq {??"Links":?[],??"Data":?"\b\u0002\u0012@Web3Coach.?Testing?DAGs\nhello?IPFS?world?by?Web3Coach.?Testing?D\u0018@"} DAG Protobuf 节点 3: ipfs?object?get?QmdEitCfYgBNxLhxTNvdLaDmTypSAWkGErjw33VZxUbWK3?|?jq { ?"Links": [], ?"Data": "\b\u0002\u0012\u0003AGs\u0018\u0003"} 将内容分割成多个切块和使用内容寻址和 CID 标识的好处是什么? 重复数据删除 去中心化 下次您想要存储与另一个文件共享部分内容的文件时,IPFS 将不会存储重复的块!相反,它将链接到现有的 DAG 节点,并且只存储新的、唯一的切块。 将内容转换成带有多个节点的DAG也有助于并行载入内容。例如,一篇博客文章、图片、整个维基百科网站都可以从多个 IPFS 节点加载。 然后,你的节点会通过所获取数据块的内容数据哈希值和相应的CID标识号来验证完整性。 您现在已经了解了IPFS的基本知识,非常好的进步! 还有一个关键因素:网络。 6 将 IPFS 节点连接到点对点网络 每个节点在执行 ipfs init 执行过程中都会生成一个config文件。 打开这个文件。 vim?$IPFS_PATH/config 除了其他设置,你可以找到节点的 Identity 身份(PeerID节点标识 + Private Key私钥): "Identity":?{????"PeerID":?"12D3KooWCBmDtsvFwDHEr...",????"PrivKey":?"CAESQCj..."??}, 以及一系列的初始化启动地址: "Bootstrap":?[????"/dnsaddr/bootstrap.libp2p.io/p2p/QmcZf59b...gU1ZjYZcYW3dwt",????"/ip4/104.131.131.82/tcp/4001/p2p/QmaCpDMG...UtfsmvsqQLuvuJ",????"/ip4/104.131.131.82/udp/4001/quic/p2p/Qma...UtfsmvsqQLuvuJ",????"/dnsaddr/bootstrap.libp2p.io/p2p/QmNnooD5...BMjTezGAJN",????"/dnsaddr/bootstrap.libp2p.io/p2p/QmQCU2Ec...J16u19uLTa",????"/dnsaddr/bootstrap.libp2p.io/p2p/QmbLHAnM...Ucqanj75Nb"??], 您可以通过运行 ipfs daemon 命令连接到 IPFS 网络上的其他节点。 您的节点将首先与协议实验室引导节点建立点对点连接,然后通过这些引导节点,您将进一步发现数百个其他节点。 ipfs daemon > Initializing daemon... Swarm listening on /ip4/127.0.0.1/tcp/4001Swarm listening on /ip4/127.0.0.1/udp/4001/quicSwarm listening on /ip4/172.17.0.1/tcp/4001Swarm listening on /ip4/172.17.0.1/udp/4001/quicSwarm listening on /ip4/192.168.0.142/tcp/4001Swarm listening on /ip4/192.168.0.142/udp/4001/quicSwarm listening on /ip6/::1/tcp/4001Swarm listening on /ip6/::1/udp/4001/quicSwarm listening on /p2p-circuitSwarm announcing /ip4/127.0.0.1/tcp/4001Swarm announcing /ip4/127.0.0.1/udp/4001/quicSwarm announcing /ip4/192.168.0.142/tcp/4001Swarm announcing /ip4/192.168.0.142/udp/4001/quicSwarm announcing /ip4/88.212.40.160/udp/4001/quicSwarm announcing /ip6/::1/tcp/4001Swarm announcing /ip6/::1/udp/4001/quic API server listening on /ip4/127.0.0.1/tcp/5001WebUI: http://127.0.0.1:5001/webui Gateway (readonly) server listening on /ip4/127.0.0.1/tcp/8080Daemon is ready! 注意,通过运行 IPFS Daemon 进程: 您的节点连接到点对点网络,并且可以与其他节点交换数据块 其他节点可以访问您节点上的内容--只要它们知道对应的 CID 标识号 其他节点会通过 TCP 和 UDP 协议在端口 4001 上与你的节点通讯 如果您有一个应用程序,可以通过在端口 5001 上监听的 HTTP API 接口来存储和使用节点的内容。 对应用开发而言,我提议使用官方的 ipfs-http-client JS 库,这样可以使用所有的核心命令 add, cat, object 等。它会加快你的开发过程。 为了简单展示,我会使用 curl 命令来与这个 API 接口互动。 如何使用 IPFS HTTP API 接口: 添加内容::5001/api/v0/add curl?-X?POST?-F?file=@/home/web3coach/go/src/github.com/ipfs/go-ipfs/hello_world.txt?"http://127.0.0.1:5001/api/v0/add" {"Name":"hello_world.txt","Hash":"QmNtQtxeavDXTjCiWAAaxnhKK3LBYfFfpXUXjdMDYXwKtH","Size":"142"} 读取内容::5001/api/v0/cat curl -X POST "http://127.0.0.1:5001/api/v0/cat?arg=QmNtQtxeavDXTjCiWAAaxnhKK3LBYfFfpXUXjdMDYXwKtH" hello IPFS world by Web3Coach. Testing DAGshello IPFS world by Web3Coach. Testing DAGshello IPFS world by Web3Coach. Testing DAGs 查看官方的HTTP API文档可获得完整的可用命令列表。 文档链接:https://docs.ipfs.io/reference/http/api/#getting-started 如何与其他 IPFS 节点连接 使用 ipfs sarm 命令并检查您已发现的节点数量: ipfs swarm peers > /ip4/85.70.151.37/tcp/4001/p2p/QmSuCtR...aPq6h4AczBPZaoej/ip4/91.121.168.96/udp/54001/quic/p2p/QmeC7H...8j2TQ99esS......... ipfs swarm peers | wc -l> 186 太棒了!你已经从无法阻挡的点对点网络上连接到了186个节点。 隐私性如何? 其他节点可以访问你添加到 IPFS 节点的所有内容。这个网络没有内置的隐私机制,所以千万不要将没有加密的、敏感的或个人内容添加到 IPFS 上。 7 节点使用 Bitswap 协议交换数据 到目前为止,您只与本地内容互动。现在来介绍一下如何访问远程的内容。 现在维基百科已经被添加到 IPFS 上,所以你可以运行自己的节点并从全球的节点上获取相关的内容: http://localhost:8080/ipfs/QmT5NvUtoM5nWFfrQdVrFtvGfKFmG7AHE8P34isapyhCxX/wiki/Anasayfa.html DAG Service会在你的数据存储中检查数据块,但不会找到与 QmT5NvUtoM5nWFfrQdVrFtvGfKFmG7AHE8P34isapyhCxX对应的内容。 因此,节点会通过 exchange 组件来使用 Bitswap 协议,向网络的其他节点发送网络请求: func getBlock(ctx context.Context, c cid.Cid, bs blockstore.Blockstore, fget func() exchange.Fetcher) (blocks.Block, error) { ? err := verifcid.ValidateCid(c) // hash security ? if err != nil { ? ? ?return nil, err ? } block, err := bs.Get(c) ? if err == nil { ? ? ?return block, nil ? } if err == blockstore.ErrNotFound && fget != nil { ? ? ?f := fget() // Don't load the exchange until we have to log.Debug("Blockservice: Searching bitswap") ? ? ?blk, err := f.GetBlock(ctx, c) 在内部,CID 被添加到 WantList: // Wantlist is a raw list of wanted blocks and their prioritiestype Wantlist struct { ? set map[cid.Cid]Entry} // Entry is an entry in a want list, consisting of a cid and its prioritytype Entry struct { ? Cid ? ? ?cid.Cid ? Priority int32 ? WantType pb.Message_Wantlist_WantType} PeerManager 会遍历已知的节点及其他相连的节点,找到一个能够提供所索取的数据块的在线节点: // PeerManager manages a pool of peers and sends messages to peers in the pool.type PeerManager struct { ? pqLk sync.RWMutex peerQueues map[peer.ID]PeerQueue ? pwm ? ? ? ?*peerWantManager createPeerQueue PeerQueueFactory ? ctx ? ? ? ? ? ? context.Context psLk ? ? ? ? sync.RWMutex ? sessions ? ? map[uint64]Session ? peerSessions map[peer.ID]map[uint64]struct{} self peer.ID} 结果是什么呢? 你可以直接从 localhost:8080 查看维基百科内容: IPFS 在本地节点上加载维基百科 这就是不受限制的去中心化存储。 8 如何在点对点网络上固定内容 你必须知道 IPFS 的一个关键信息:除非你进行 pin 固化操作,不然你从网络访问的内容会成为垃圾。 Pinning 和垃圾回收 在本文的开头,你了解到了使用 ipfs add 命令或其 HTTP 的等效操作是会默认进行 pin 操作的。 ipfs?pin?ls?|?grep?QmNtQtxeavDXTjCiWAAaxnhKK3LBYfFfpXUXjdMDYXwKtH>?QmNtQtxeavDXTjCiWAAaxnhKK3LBYfFfpXUXjdMDYXwKtH?recursive 垃圾回收进程开启后,被 pin 固化住的数据块就被标记为不应该被删除的内容。 为什么垃圾回收会删除一些数据块呢?这是为了控制存储体积来保持节点的健康度。 在点对点网络上阅读维基百科或访问其他内容时,IPFS 会下载其数据块。 随着节点的数据持续增长,一个定期执行的垃圾回收进程会删除没有进行 pin 操作的数据块,这样你不至于缺乏可用磁盘空间。 如果您想要在IPFS网络上全天候访问您的内容,我建议使用一个可靠的远程服务商来进行 pin 操作:Infura,这是最简单的开始方式,而且你会得到 5 GB 的免费去中心化存储空间。 请参照入门教程: https://infura.io/docs/ipfs?utm_source=web3coach&utm_medium=article 如何在本地 pin 维基百科 首先确保维基百科的根 CID(最高的DAG节点)还没有在你的节点上 pin 住: ipfs?pin?ls?|?grep?QmT5NvUtoM5nWFfrQdVrFtvGfKFmG7AHE8P34isapyhCxX>?no?output,?not?pinned IPFS 以 DAG 的形式存储特定版本的维基百科。我建议在开始 pin 操作前检查其 DAG 图: ipfs?object?get?QmT5NvUtoM5nWFfrQdVrFtvGfKFmG7AHE8P34isapyhCxX?|?jq {??"Links":?[????{??????"Name":?"0C-",??????"Hash":?"QmSEwJo8Z5bqVX3AhocyimJzPWetr7HgbWbwCg6zbp43AP",??????"Size":?1248085????},????{??????"Name":?"43I",??????"Hash":?"QmPW3kRjncDj145bP9DVNc791FowLPwYHnqbTzfe3whdyZ",??????"Size":?2611324931????},????{??????"Name":?"58wiki",??????"Hash":?"QmRNXpMRzsTHdRrKvwmWisgaojGKLPqHxzQfrXdfNkettC",??????"Size":?12295304394????},????{??????"Name":?"92M",??????"Hash":?"Qmbcvk7jpBTUKdgex139Nvv7BrKocE3pQVKhNJtTU77Qv5",??????"Size":?793????},????{??????"Name":?"A0index.html",??????"Hash":?"QmNqbYogAxH4mmt5WhuKN7NFEUDZ9V3Scxh7QbLwTKBJDk",??????"Size":?191????}??],??"Data":?"\b\u0005\u0012\u0015\u0001\u0000\u0004\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0000\b\u0000\u0000\u0000\u0000\u0000\u0000\u0010\u0000(\"0?\u0002"} 根 DAG 对象有五个链接。四个链接相对较小,但其中一个链接指向总大小为 12 GB 的 DAG 节点。 如果检查此 DAG 节点,您将看到 256 个以上的链接,总累积(循环)大小为 12 GB。 ipfs?object?stat?QmRNXpMRzsTHdRrKvwmWisgaojGKLPqHxzQfrXdfNkettC NumLinks: ? ? ? 256BlockSize: ? ? ?12075LinksSize: ? ? ?12034DataSize: ? ? ? 41CumulativeSize:?12295304394 每一个存放了 pin 住的文章、视频、纪录片或猫咪搞笑图片的节点都会让网络变得更可用,更能抵抗脆弱性,更去中心化和稳健。 ipfs?pin?add?QmT5NvUtoM5nWFfrQdVrFtvGfKFmG7AHE8P34isapyhCxX pinning 过程会循环遍历整个 DAG 节点,从 Bitswap 协议获取所有的链接,然后在你的本地存储中 pin 住每一个数据块。 恭喜!你在这篇文章里学到了去中心化存储背后的工作原理。 —- 编译者/作者:IPFS星际联盟 玩币族申明:玩币族作为开放的资讯翻译/分享平台,所提供的所有资讯仅代表作者个人观点,与玩币族平台立场无关,且不构成任何投资理财建议。文章版权归原作者所有。 |
探索星际用户必读第20期Web3时代的分布式存储——IPFS技术指引(教程)
2021-06-29 IPFS星际联盟 来源:区块链网络
LOADING...
相关阅读:
- 本周空投 10 次即可获得免费加密货币2021-06-29
- 迎接币市即将到来的共享经济时代?2021-06-29
- 对提议者/区块构建者分离友好的费用市场设计2021-06-28
- BMU全球第一家去中心化算力平台2021-06-28
- 徐明星注销OKCoin,网传OTC关闭,出海OR去中心化交易所,财新网再次发文2021-06-28