IPFS技术指南:Web3时代的分布式存储

​当你想开发一个去中心化的应用程序时,你可能会想到像以太坊这样的区块链。

区块链在管理状态、通过智能合约自动化流程以及交换经济价值等方面非常有用。你可以根据这篇教程搭建一个区块链从而了解有关区块链的更多知识。

但是,您将应用程序的内容存储在哪里呢?这些数据包括了图像、文件,以及由 HTML、CSS 和 JS 文件构成的应用网站前端服务。

您的应用程序和用户内容是否从中心化的亚马逊云服务器加载?

在区块链上存储内容将是昂贵和低效的。您的区块链应用程序需要去中心化存储方案!

在本教程中,我将向你介绍 IPFS。你将了解到:

  1. 如何通过去中心化存储来存储数据

  2. 如何运行自己的 IPFS 节点

  3. 关于 IPFS 协议的底层内部构造

  4. 我们将读取存储在 IPFS 上的维基百科网站。

准备好了吗?那开始吧。

目录

  • 什么是 IPFS?

  • 如何设置 IPFS 节点

  • 如何使用 CLI 和 HTTP 协议存储和检索 IPFS 内容

  • 什么是 CID--IPFS 基于内容的标识符

  • 如何对 IPFS 数据存储区进行反向工程

  • 如何将 IPFS 节点连接到去中心化网络

  • 如何使用 Bitswap 协议在点对点网络上交换数据

  • 如何在点对点网络上保存内容

01

什么是 IPFS?

星际文件系统的缩写是 IPFS,它是一个点对点的超媒体协议,旨在让网络变得更快、更安全和更开放。

IPFS是用于存储和共享内容的协议。就像在区块链世界中一样,每个用户都在运行自己的节点(服务器)。节点之间可以互相通讯并交换文件。

IPFS 有什么独特之处?

首先,IPFS 是去中心化的,因为它从数千个节点中载入内容,而不是从一个中心化服务器加载内容。

数据的每一个片段都是用密码学哈希运算处理的,从而产生安全、唯一的内容标识符:CID。

将您的网站存储在 IPFS 中,以避免审查和单点故障。您的个人 IPFS 节点是否掉线?别担心,该网站仍会从全球其他提供服务的节点加载服务。

例如,假设维基百科服务难以使用,就可以从 IPFS 的点对点网络上获取在 4 月 17 日进行索引并持久化存储的去中心化版维基百科。具体是通过 CID:

QmT5NvUtoM5nWFfrQdVrFtvGfKFmG7AHE8P34isapyhCxX

其次,IPFS 内容的完整性可以进行加密验证。

最后,IPFS 内容是有重复内容处理机制的。如果你尝试在同一 IPFS 节点中存储两个相同的 1 MB 文件,则它们将只存储一次,从而消除重复,因为它们的哈希值会生成同样的CID标识。

02

如何设置 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/ipfsipfs 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

现在你的节点现在已完全初始化,等待你上传内容。

03

如何使用 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 功能,你现在已经了解了。

04

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 编码器使用的情形。

05

IPFS 如何在文件系统上存储内容

你的内容将会被使用 Chunker 分割器来打散成块 ,然后使用链接节点将其连接在一起并整理成树状结构。返回的 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 DAGsls -la hello_world.txt> 131 bytes hello_world.txtipfs add hello_world.txt> added QmNtQtxeavDXTjCiWAAaxnhKK3LBYfFfpXUXjdMDYXwKtH

对go-ipfs代码进行反向工程,这是它背后的机制:

IPFS UnixFS 添加新文件并转换到数据块里

通过检查数据块目录来验证持久性进程。您会发现内容是使用 DAG Protobuf 编码(131字节+Protobuf额外编码)写在 Multihash Datastor Key 下的。

ls -la blocks/PV/> 142 CIQAQIXXW2OAQSKZ6AQ2SDEYRZXWPDZNJUAFR3YORYN75I5CQ3LHPVQ.datavim 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的基本知识,非常好的进步!

还有一个关键因素:网络。

06

将 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/quicAPI server listening on /ip4/127.0.0.1/tcp/5001WebUI: http://127.0.0.1:5001/webuiGateway (readonly) server listening on /ip4/127.0.0.1/tcp/8080Daemon is ready!

注意,通过运行 IPFS Daemon 进程:

  1. 您的节点连接到点对点网络,并且可以与其他节点交换数据块

  2. 其他节点可以访问您节点上的内容--只要它们知道对应的 CID 标识号

  3. 其他节点会通过 TCP 和 UDP 协议在端口 4001 上与你的节点通讯

  4. 如果您有一个应用程序,可以通过在端口 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 上。

07

节点使用 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 在本地节点上加载维基百科

这就是不受限制的去中心化存储。

08

如何在点对点网络上固定内容

你必须知道 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 QmRNXpMRzsTHdRrKvwmWisgaojGKLPqHxzQfrXdfNkettCNumLinks:       256BlockSize:      12075LinksSize:      12034DataSize:       41CumulativeSize: 12295304394

每一个存放了 pin 住的文章、视频、纪录片或猫咪搞笑图片的节点都会让网络变得更可用,更能抵抗脆弱性,更去中心化和稳健。

ipfs pin add QmT5NvUtoM5nWFfrQdVrFtvGfKFmG7AHE8P34isapyhCxX

pinning 过程会循环遍历整个 DAG 节点,从 Bitswap 协议获取所有的链接,然后在你的本地存储中 pin 住每一个数据块。

恭喜!你在这篇文章里学到了去中心化存储背后的工作原理。

本文来源:陀螺财经 文章作者:FilCloud
收藏
举报
FilCloud
累计发布内容247篇 累计总热度10万+

免责声明:
1、本文版权归原作者所有,仅代表作者本人观点,不代表陀螺财经观点或立场。
2、如发现文章、图片等侵权行为,侵权责任将由作者本人承担。

相关文章