當你想開發一個去中心化的應用程式時,你可能會想到像以太坊這樣的區塊鏈。
區塊鏈在管理狀態、透過智慧合約自動化流程以及交換經濟價值等方面非常有用。透過這篇教程可以瞭解去中心化儲存背後的工作原理,學習有關區塊鏈的更多知識。
但是,您將應用程式的內容儲存在哪裡呢?這些資料包括了影象、檔案,以及由 HTML、CSS 和 JS 檔案構成的應用網站前端服務。
您的應用程式和使用者內容是否從中心化的亞馬遜雲伺服器載入?
在區塊鏈上儲存內容將是昂貴和低效的。您的區塊鏈應用程式需要去中心化儲存方案!
在本教程中,我將向你介紹 IPFS。你將瞭解到:
如何透過去中心化儲存來儲存資料
如何執行自己的 IPFS 節點
關於 IPFS 協議的底層內部構造
我們將讀取儲存在 IPFS 上的維基百科網站。
準備好了嗎?那開始吧。
目錄
什麼是 IPFS?
如何設定 IPFS 節點
如何使用 CLI 和 HTTP 協議儲存和檢索 IPFS 內容
什麼是 CID--IPFS 基於內容的識別符號
如何對 IPFS 資料儲存區進行反向工程
如何將 IPFS 節點連線到去中心化網路
如何使用 Bitswap 協議在點對點網路上交換資料
如何在點對點網路上儲存內容
星際檔案系統的縮寫是 IPFS,它是一個點對點的超媒體協議,旨在讓網路變得更快、更安全和更開放。
IPFS是用於儲存和共享內容的協議。就像在區塊鏈世界中一樣,每個使用者都在執行自己的節點(伺服器)。節點之間可以互相通訊並交換檔案。
IPFS 有什麼獨特之處?
首先,IPFS 是去中心化的,因為它從數千個節點中載入內容,而不是從一箇中心化伺服器載入內容。
資料的每一個片段都是用密碼學雜湊運算處理的,從而產生安全、唯一的內容識別符號:CID。
將您的網站儲存在 IPFS 中,以避免審查和單點故障。您的個人 IPFS 節點是否掉線?別擔心,該網站仍會從全球其他提供服務的節點載入服務。
例如,假設維基百科服務難以使用,就可以從 IPFS 的點對點網路上獲取在 4 月 17 日進行索引並持久化儲存的去中心化版維基百科。具體是透過 CID:
QmT5NvUtoM5nWFfrQdVrFtvGfKFmG7AHE8P34isapyhCxX
其次,IPFS 內容的完整性可以進行加密驗證。
最後,IPFS 內容是有重複內容處理機制的。如果你嘗試在同一 IPFS 節點中儲存兩個相同的 1 MB 檔案,則它們將只儲存一次,從而消除重複,因為它們的雜湊值會生成同樣的CID標識。
安裝 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.git
cd go-ipfs
git checkout v0.8.0-rc2
make install
或者下載並安裝預編譯版本的 IPFS:
sudo snap install ipfs
驗證安裝
Go 很棒,自己編譯程式碼也是很酷的,而且是去中心化的。生成的二進位制檔案將在$GOPATH 中建立。
whichipfs
> /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
現在你的節點現在已完全初始化,等待你上傳內容。
新增內容
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 功能,你現在已經瞭解了。
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 binary
dag-pb | ipld | 0x70 | MerkleDAG protobuf
dag-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 | code
base32 | b
base58btc | z
base64 | 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 to
ipfs 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 編碼器使用的情形。
你的內容將會被使用 Chunker 分割器來打散成塊 ,然後使用連結節點'link nodes'將其連線在一起並整理成樹狀結構。返回的 CID 標識號則是 DAG 裡的根節點的雜湊值。
讓我們先回到一些基礎問題。
探索節點的資料目錄
在本教程開始時,使用 ipfs init 命令初始化 IPFS 節點時,生成了以下目錄:
export IPFS_PATH=/home/web3coach/.ipfs_tutorial
cd $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 DAGs
hello IPFS world by Web3Coach. Testing DAGs
hello 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 DAGs
hello IPFS world by Web3Coach. Testing DAGs
hello 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的基本知識,非常好的進步!
還有一個關鍵因素:網路。
每個節點在執行 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/4001
Swarm listening on /ip4/127.0.0.1/udp/4001/quic
Swarm listening on /ip4/172.17.0.1/tcp/4001
Swarm listening on /ip4/172.17.0.1/udp/4001/quic
Swarm listening on /ip4/192.168.0.142/tcp/4001
Swarm listening on /ip4/192.168.0.142/udp/4001/quic
Swarm listening on /ip6/::1/tcp/4001
Swarm listening on /ip6/::1/udp/4001/quic
Swarm listening on /p2p-circuit
Swarm announcing /ip4/127.0.0.1/tcp/4001
Swarm announcing /ip4/127.0.0.1/udp/4001/quic
Swarm announcing /ip4/192.168.0.142/tcp/4001
Swarm announcing /ip4/192.168.0.142/udp/4001/quic
Swarm announcing /ip4/88.212.40.160/udp/4001/quic
Swarm announcing /ip6/::1/tcp/4001
Swarm announcing /ip6/::1/udp/4001/quic
API server listening on /ip4/127.0.0.1/tcp/5001
WebUI: http://127.0.0.1:5001/webui
Gateway (readonly) server listening on /ip4/127.0.0.1/tcp/8080
Daemon 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 DAGs
hello IPFS world by Web3Coach. Testing DAGs
hello 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 上。
到目前為止,您只與本地內容互動。現在來介紹一下如何訪問遠端的內容。
現在維基百科已經被新增到 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 priorities
type Wantlist struct {
set map[cid.Cid]Entry
}
// Entry is an entry in a want list, consisting of a cid and its priority
type 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 在本地節點上載入維基百科
這就是不受限制的去中心化儲存。
你必須知道 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。
ipfsobjectstatQmRNXpMRzsTHdRrKvwmWisgaojGKLPqHxzQfrXdfNkettC
NumLinks: 256
BlockSize: 12075
LinksSize: 12034
DataSize: 41
CumulativeSize:12295304394
每一個存放了 pin 住的文章、影片、紀錄片或貓咪搞笑圖片的節點都會讓網路變得更可用,更能抵抗脆弱性,更去中心化和穩健。
ipfs pin add QmT5NvUtoM5nWFfrQdVrFtvGfKFmG7AHE8P34isapyhCxX
pinning 過程會迴圈遍歷整個 DAG 節點,從 Bitswap 協議獲取所有的連結,然後在你的本地儲存中 pin 住每一個資料塊。
恭喜!你在這篇文章裡學到了去中心化儲存背後的工作原理。
作者:,來源:IPFSUnion星際聯盟