探索星際 使用者必讀 |【第20期】Web3時代的分散式儲存——IPFS技術指引(教程)

買賣虛擬貨幣

當你想開發一個去中心化的應用程式時,你可能會想到像以太坊這樣的區塊鏈。

區塊鏈在管理狀態、透過智慧合約自動化流程以及交換經濟價值等方面非常有用。透過這篇教程可以瞭解去中心化儲存背後的工作原理,學習有關區塊鏈的更多知識。

但是,您將應用程式的內容儲存在哪裡呢?這些資料包括了影象、檔案,以及由 HTML、CSS 和 JS 檔案構成的應用網站前端服務。

您的應用程式和使用者內容是否從中心化的亞馬遜雲伺服器載入?

在區塊鏈上儲存內容將是昂貴和低效的。您的區塊鏈應用程式需要去中心化儲存方案!

在本教程中,我將向你介紹 IPFS。你將瞭解到:

  1. 如何透過去中心化儲存來儲存資料

  2. 如何執行自己的 IPFS 節點

  3. 關於 IPFS 協議的底層內部構造

  4. 我們將讀取儲存在 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 中建立。

whichipfs> /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

現在你的節點現在已完全初始化,等待你上傳內容。

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 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 命令:

ipfsobjectgetQmNtQtxeavDXTjCiWAAaxnhKK3LBYfFfpXUXjdMDYXwKtH|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/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 上。

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。

ipfsobjectstatQmRNXpMRzsTHdRrKvwmWisgaojGKLPqHxzQfrXdfNkettCNumLinks:    256BlockSize:   12075LinksSize:   12034DataSize:    41CumulativeSize:12295304394

每一個存放了 pin 住的文章、影片、紀錄片或貓咪搞笑圖片的節點都會讓網路變得更可用,更能抵抗脆弱性,更去中心化和穩健。

ipfs pin add QmT5NvUtoM5nWFfrQdVrFtvGfKFmG7AHE8P34isapyhCxX

pinning 過程會迴圈遍歷整個 DAG 節點,從 Bitswap 協議獲取所有的連結,然後在你的本地儲存中 pin 住每一個資料塊。

恭喜!你在這篇文章裡學到了去中心化儲存背後的工作原理。

作者:,來源:IPFSUnion星際聯盟

免責聲明:

  1. 本文版權歸原作者所有,僅代表作者本人觀點,不代表鏈報觀點或立場。
  2. 如發現文章、圖片等侵權行爲,侵權責任將由作者本人承擔。
  3. 鏈報僅提供相關項目信息,不構成任何投資建議

推荐阅读

;