LOADING...
LOADING...
LOADING...
当前位置: 玩币族首页 > 区块链资产 > 探索星际用户必读第20期Web3时代的分布式存储——IPFS技术指引(教程)

探索星际用户必读第20期Web3时代的分布式存储——IPFS技术指引(教程)

2021-06-29 IPFS星际联盟 来源:区块链网络

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

区块链在管理状态、通过智能合约自动化流程以及交换经济价值等方面非常有用。通过这篇教程可以了解去中心化存储背后的工作原理,学习有关区块链的更多知识

但是,您将应用程序的内容存储在哪里呢?这些数据包括了图像、文件,以及由 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:

QmT5NvUtoM5nWFfrQdVrFtvGfKFmG7AHE8P34isapyhCxX

其次,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星际联盟

玩币族申明:玩币族作为开放的资讯翻译/分享平台,所提供的所有资讯仅代表作者个人观点,与玩币族平台立场无关,且不构成任何投资理财建议。文章版权归原作者所有。

LOADING...
LOADING...