在上一篇文章介紹了IPFS要做什麼, 本篇文章介紹下IPFS怎麼用, 按照本站的風格,我不會僅僅把一個個命令列出來,同時會說明命令在後面為我們做了什麼。
IPFS 安裝
要使用IPFS, 第一步肯定是先把IPFS安裝好,IPFS在Mac OS X 、Linux及Window平臺均有提供, 可以通過這個連結下載對應平臺可執行檔案的壓縮包。
對於Mac OS X 及 Linux 平臺,使用一下命令進行安裝:
$ tar xvfz go-ipfs.tar.gz
$ cd go-ipfs
$ ./install.sh
上面先使用tar 對壓縮包進行解壓,然後執行install.sh 進行安裝,安裝指令碼install.sh其實就是把可執行檔案ipfs
移動到$PATH
目錄下。安裝完成之後,可以在命令列終端敲入ipfs
試試看,如果顯示一堆命令說明,則說明IPFS安裝成功。
在Windows平臺也是類似,把ipfs.exe
移動到環境變數%PATH%
指定的目錄下。
IPFS 基本用法
IPFS初始化
安裝完成之後,要使用IPFS第一步是要對IPFS進行初始化,使用ipfs init
進行初始化
> ipfs init
initializing ipfs node at /Users/Emmett/.ipfs
generating 2048-bit RSA keypair...done
peer identity: QmYM36s4ut2TiufVvVUABSVWmx8VvmDU7xKUiVeswBuTva
to get started, enter:
ipfs cat /ipfs/QmS4ustL54uo8FzR9455qaxZwuMiUhyvMcX9Ba8nUH4uVv/readme
上面是執行命令即對應輸出,在執行ipfs init
進行初始化時,會有一下行為:
- 生成一個祕鑰對併產生對應的節點id, 即命令提示:
peer identity
後面的hash值。
節點的id用來標識和連線一個節點,每個節點的id是獨一無二的, 因此大家看到的提示也會和我的不一樣。
- 在當前使用者的主目錄(~ 目錄)下產生一個.ipfs 的隱藏目錄,這個目錄稱之為庫(repository)目錄,ipfs 所有相關的資料都會放在這個目錄下。
如同步檔案資料塊放在.ipfs/blocks 目錄,祕鑰在.ipfs/keystore 目錄,ipfs配置檔案為:.ipfs/config。
IPFS 配置修改
在IPFS初始化之後,可以根據需要修改配置(可選),修改方法如下:
cd ~/.ipfs
export EDITOR=/usr/bin/vim
ipfs config edit
或者直接編輯 ~/.ipfs/config 檔案。
上傳檔案到IPFS
我們先建立一個upchain.pro.txt檔案,可以使用如下方式:
> echo "登鏈學院:區塊鏈教育領先品牌" >> upchain.pro.txt
ipfs 使用add 命令來新增內容到節點中, 在命令列輸入:
> ipfs add upchain.pro.txt
added QmQgMZKqHzyEdyJja5ioF8WaXrbUDVjqhJDoaUKDymgioi upchain.pro.txt
43 B / 43 B [=====================================================] 100%
當它檔案新增到節點時,會為檔案生成唯一的hash: QmQgMZKqHzyEdyJja5ioF8WaXrbUDVjqhJDoaUKDymgioi, 可以使用ipfs cat 檢視檔案的內容:
> ipfs cat QmQgMZKqHzyEdyJja5ioF8WaXrbUDVjqhJDoaUKDymgioi
登鏈學院:區塊鏈教育領先品牌
注意,此時檔案僅僅是上傳在本地的IPFS節點中,如果需要把檔案同步到網路,就需要開啟 daemon 服務, 使用命令:
> ipfs daemon
Initializing daemon...
go-ipfs version: 0.4.18-
Repo version: 7
System version: amd64/darwin
Golang version: go1.11.1
Swarm listening on /ip4/127.0.0.1/tcp/4001
Swarm listening on /ip4/192.168.8.105/tcp/4001
Swarm listening on /ip6/2408:84f3:82e:cfcd:409:fee2:e261:4dc3/tcp/4001
Swarm listening on /ip6/2408:84f3:82e:cfcd:a9c6:116b:349f:8c2b/tcp/4001
Swarm listening on /ip6/2408:84f3:82e:cfcd:ec89:145d:cf27:4/tcp/4001
Swarm listening on /ip6/::1/tcp/4001
Swarm listening on /ip6/fd1d:43b:e89b:eb9b:c405:56af:8f52:67df/tcp/4001
Swarm listening on /p2p-circuit
Swarm announcing /ip4/127.0.0.1/tcp/4001
Swarm announcing /ip4/192.168.8.105/tcp/4001
Swarm announcing /ip6/2408:84f3:82e:cfcd:409:fee2:e261:4dc3/tcp/4001
Swarm announcing /ip6/2408:84f3:82e:cfcd:a9c6:116b:349f:8c2b/tcp/4001
Swarm announcing /ip6/2408:84f3:82e:cfcd:ec89:145d:cf27:4/tcp/4001
Swarm announcing /ip6/::1/tcp/4001
Swarm announcing /ip6/fd1d:43b:e89b:eb9b:c405:56af:8f52:67df/tcp/4001
API server listening on /ip4/127.0.0.1/tcp/5001
Gateway (readonly) server listening on /ip4/127.0.0.1/tcp/8080
Daemon is ready
開啟 daemon 之後,Swarm 就會嘗試連線其他的節點,同步資料,同時在本地還會開啟兩個服務:API服務及Web閘道器服務,下面分別介紹下:
- API服務,預設在5001埠,可以通過 http://localhost:5001/webui 進行訪問,介面如:
這也是IPFS的一個Web版的管理控制檯, 可以通過這個控制檯新增檔案,檢視節點連線情況等等。
- 閘道器服務,預設在8080埠, 由於當前瀏覽器還不支援通過IPFS協議(ipfs://)來訪問檔案,如果我們要在瀏覽器裡訪問檔案的話,就需要藉助於IPFS 提供的閘道器服務,由瀏覽器先訪問到閘道器,閘道器去獲取IPFS網路殺過了的檔案。 有了閘道器服務,就可以通過這個連結:
http://localhost:8080/ipfs/QmQgMZKqHzyEdyJja5ioF8WaXrbUDVjqhJDoaUKDymgioi
來訪問剛剛上傳到ipfs 的檔案。
ipfs 也提供了官方的閘道器服務:https://ipfs.io/, 因此也可以通過 https://ipfs.io/ipfs/QmQgMZKqHzyEdyJja5ioF8WaXrbUDVjqhJDoaUKDymgioi (需要FQ)來訪問剛剛上傳到ipfs 的檔案。
上傳目錄到IPFS
我們先建立一個資料夾upchain, 並把之前的 upchain.pro.txt 放進目錄。
> mkdir upchain
> mv upchain.pro.txt upchain
上傳目錄到IPFS 需要在使用 add 命令時加上 -r ,如下:
> ipfs add -r upchain
added QmQgMZKqHzyEdyJja5ioF8WaXrbUDVjqhJDoaUKDymgioi upchain/upchain.pro.txt
added QmQYpGRFBpHVzoShpwU5C3XgGAxJKqY83X8VXfMbyktdbP upchain
43 B / 43 B [===========================================================================] 100.00%
在上傳時資料夾,資料夾也會生成一個對應的hash,可以通過hash後接檔名來進行訪問, 如:
>ipfs cat QmQYpGRFBpHVzoShpwU5C3XgGAxJKqY83X8VXfMbyktdbP/upchain.pro.txt
登鏈學院:區塊鏈教育領先品牌
在瀏覽器可以連結:http://127.0.0.1:8080/ipfs/QmQYpGRFBpHVzoShpwU5C3XgGAxJKqY83X8VXfMbyktdbP/upchain.pro.txt
來訪問。
通過上傳目錄的方式,可以把整個靜態網站的根目錄上傳到IPFS網路,這樣就可以省去託管伺服器,例如可以直接通過以下連結訪問深入淺出區塊鏈部落格:
https://ipfs.io/ipfs/QmaFWgfpRNzeLgfDrH33BuBdiauRTejnF3Yw9AuCphq2ua/index.html
使用IPNS解決檔案更新問題
因為IPFS在IPFS中,對一個檔案的內容修改後(如升級),會生成一個完全不同的新Hash,使用IPNS就可以利用同一個連結總是指向更新的內容,其實使用也很簡單,只需要每次在內容更新之後使用ipfs name publish hash
釋出到節點。
例如把upchain.pro.txt釋出到節點,使用下面的命令:
> ipfs name publish QmQgMZKqHzyEdyJja5ioF8WaXrbUDVjqhJDoaUKDymgioi
Published to QmYM36s4ut2TiufVvVUABSVWmx8VvmDU7xKUiVeswBuTva: /ipfs/QmQgMZKqHzyEdyJja5ioF8WaXrbUDVjqhJDoaUKDymgioi
命令中的QmQgMZKqHzyEdyJja5ioF8WaXrbUDVjqhJDoaUKDymgioi
是upchain.pro.txt
的hash, 命令提示中的QmYM36s4ut2TiufVvVUABSVWmx8VvmDU7xKUiVeswBuTva
是當前節點id(大家可以回看一個前面ipfs init 的輸出)。
釋出之後就可以使用http://127.0.0.1:8080/ipns/QmYM36s4ut2TiufVvVUABSVWmx8VvmDU7xKUiVeswBuTva 或 https://ipfs.io/ipns/QmYM36s4ut2TiufVvVUABSVWmx8VvmDU7xKUiVeswBuTva 來訪問upchain.pro.txt的內容,如圖:
其實理想下是使用 ipns://QmYM36s4ut2TiufVvVUABSVWmx8VvmDU7xKUiVeswBuTva 來訪問,通過網站還是前面提到的瀏覽器暫不支援ipfs協議。
現在我們來更新一下upchain.pro.txt 加入文字:"創辦人:Tiny熊"
> echo "創辦人:Tiny熊" >> upchain.pro.txt
> ipfs add upchain.pro.txt
added QmUUiDN6tWtj89xmUw1iCK2NczBqE6m3zH9QnbhHoMvZ5S upchain.pro.txt
63 B / 63 B [=============================================================] 100.00%
重新發布一下:
> ipfs name publish QmUUiDN6tWtj89xmUw1iCK2NczBqE6m3zH9QnbhHoMvZ5S
Published to QmYM36s4ut2TiufVvVUABSVWmx8VvmDU7xKUiVeswBuTva: /ipfs/QmUUiDN6tWtj89xmUw1iCK2NczBqE6m3zH9QnbhHoMvZ5S
再次訪問 http://127.0.0.1:8080/ipns/QmYM36s4ut2TiufVvVUABSVWmx8VvmDU7xKUiVeswBuTva (這個連結和上面的連結一樣)可以看到內容更新了。
如果我們要查詢 節點id 指向的hash 可以使用 ipfs name resolve
進行查詢:
> ipfs name resolve
/ipfs/QmUUiDN6tWtj89xmUw1iCK2NczBqE6m3zH9QnbhHoMvZ5
有一點值得大家注意: 節點id其實是公鑰的hash,它的關聯資訊是需要經過私鑰簽名才可以釋出,因此只有我們自己才可以更新節點的指向。
如果我們有多個站點需要更新,可以新產生一個祕鑰對,使用新的key 釋出,如:
> ipfs key gen --type=rsa --size=2048 mykey
QmVZvdYEsdfHSR43Qm1fY8eDFrhB3UNZ2oVyEuVUH3VHrg
> ipfs name publish --key=mykey hashxxx
Pinning
Pinning 在IPFS裡是一個很重要的概念,當我們每次請求一個網路上的內容的時候,IPFS總是會把內容先同步的本地提供服務,而為了防止 IPFS 儲存空間不停增長,實際上使用cache 機制來處理檔案, 如果檔案在一段時間內沒有被使用,檔案會被”回收“。 Pinning 的作用就是把檔案”釘“住,確保檔案在本地不被”回收“。 如果是重要的檔案,就可以使用 Pinning 防止檔案被刪除。
當我們使用ipfs add 新增檔案時,預設會進行Pinning(使用其他命令獲取的檔案不會進行pinning),
IPFS 提供了pin命令進行Pinning操作, 比如我們查詢下某一個hash 是否被pin:
> ipfs pin ls QmUUiDN6tWtj89xmUw1iCK2NczBqE6m3zH9QnbhHoMvZ5S
QmUUiDN6tWtj89xmUw1iCK2NczBqE6m3zH9QnbhHoMvZ5S recursive
> ipfs pin ls QmWnrAEKyDVUQ1jh9vDtQhtBSNEgUnQhAJyMmo3JjwJZK7
Error: path 'QmWnrAEKyDVUQ1jh9vDtQhtBSNEgUnQhAJyMmo3JjwJZK7' is not pinned
可以使用 pin add 手動釘住一個檔案,如:
> ipfs pin add QmWnrAEKyDVUQ1jh9vDtQhtBSNEgUnQhAJyMmo3JjwJZK7
pinned QmWnrAEKyDVUQ1jh9vDtQhtBSNEgUnQhAJyMmo3JjwJZK7 recursively
如果要刪除pin的狀態,使用pin rm , 如:
> ipfs pin rm -r QmWnrAEKyDVUQ1jh9vDtQhtBSNEgUnQhAJyMmo3JjwJZK7
unpinned QmWnrAEKyDVUQ1jh9vDtQhtBSNEgUnQhAJyMmo3JjwJZK7
pin rm 的引數 -r 表示遞迴的刪除pin 狀態,對於沒有pin住的檔案, 如果執行GC操作 ipfs repo gc
檔案會被刪除。
歡迎來知識星球提問,星球內已經聚集了300多位區塊鏈技術愛好者。
深入淺出區塊鏈 - 系統學習區塊鏈,打造最好的區塊鏈技術部落格。