IPFS是什麼?

IPFS是什麼?

IPFS 是什麼

IPFS(InterPlanetary File System,星際檔案系統)是永久的、去中心化儲存和共享檔案的方法,這是一種內容可定址、版本化、點對點超媒體的分散式協議。

內容可定址:通過檔案內容生成唯一雜湊值來標識檔案,而不是通過檔案儲存位置來標識。相同內容的檔案在系統中只會存在一份,節約儲存空間
版本化:可追溯檔案修改歷史
點對點超媒體:P2P 儲存各種各樣型別的資料

可以把 IPFS 想象成所有檔案資料是在同一個 BitTorrent 群並且通過同一個 Git 倉庫存取。

總之,它集一些成功系統(分散式雜湊表、BitTorrent、Git、自認證檔案系統)的優勢於一身,是一套很厲害的檔案存取系統。

IPFS 使用場景

IPFS 的發明者 Juan Benet([email protected])在 IPFS 技術白皮書中假設了一些使用場景:

在 /ipfs 和 /ipns 下掛載全球檔案系統
掛載的個人同步資料夾,擁有版本功能
檔案加密,資料共享系統
可用於所有軟體的帶版本的包管理器(已經實現了:https://github.com/whyrusleeping/gx
可以作為虛機的根檔案系統
可以作為資料庫:應用可以直接操作 Merkle DAG,擁有 IPFS 提供的版本化、快取以及分散式特性
可以做(加密)通訊平臺
各種型別的 CDN
永久的 Web,不存在不能訪問的連結

我覺得作為資料庫這一點對應用開發者來說會很有用。

安裝與初始化

下載 go-ipfs 解壓(下面的示例我是在 Windows 10 上做的,解壓目錄為 D:\go-ipfs),然後到解壓目錄執行命令 ipfs init,將在使用者 home(~)下建立 .ipfs 目錄存放資料,預設最大儲存 10G。init 命令可以帶參,比如修改最大儲存、目錄等,具體參考 ipfs init help

繼續執行命令 ipfs daemon 啟動節點伺服器:

加入 IPFS 網路
本地 HTTP 伺服器,預設 8080 埠
處理後續 ipfs 的客戶端命令

新開一個命令列,執行命令 ipfs id 以檢視當前節點標識:

{ "ID": "QmSYF1HZxhPUWWGrz5bMn16tdD73AeMVhp7pNSHkVCMF7R", "PublicKey": "....", "Addresses": [ "/ip4/169.254.40.215/tcp/4001/ipfs/...", .... ], "AgentVersion": "go-ipfs/0.4.12/", "ProtocolVersion": "ipfs/0.1.0" } 

瀏覽器訪問 http://localhost:5001/webui 進入管理介面,檢視系統狀態、管理檔案以及配置系統。

配置

除了使用 Web 管理介面修改配置外,也可以直接用命令列 ipfs config show > ipfs.conf 先匯出當前配置(JSON 格式,配置項不多且含義明顯),改完後使用 ipfs config replace ipfs.conf 更新配置,重啟伺服器就生效了。當然,修改配置也可以直接用 ipfs config edit

伺服器最終使用的配置檔案儲存在 ~/.ipfs/config 中,對比剛剛匯出的檔案我們發現匯出的檔案只比這個 config 少了一項 Identity.PrivKey,即節點初始化時自動生成的 RSA 私鑰。

金鑰對

節點初始化時會自動生成 RSA 金鑰對,並且私鑰沒有設定密碼。

公鑰通過多重雜湊得到節點 id(即上面的 QmSYF1HZxhPUWWGrz5bMn16tdD73AeMVhp7pNSHkVCMF7R),節點伺服器啟動後會和其他節點互動公鑰,後續通訊時使用對方公鑰加密資料,通過多重雜湊對方公鑰、對比對方節點 id 來確認是否正在和正確的節點互動。

私鑰用來解密接收到的資料,也用於 ipns 來繫結檔名。整個過程沒有引入證書,僅是使用了 PKI 機制。

總之,我覺得可以暫時不用關心金鑰對,可能只有在一些使用場景下面才需要吧。

新增檔案

我當前目錄結構是這樣的:

D:\GO-IPFS │ build-log │ config │ install.sh │ ipfs.conf │ ipfs.exe │ LICENSE │ README.md │ └─b3log └─hacpai README.md 

我準備新增的目錄是 b3log,執行命令:

D:\go-ipfs>ipfs add -r b3log 94 B / 94 B [=============================================================================================] 100.00% 0s added Qmco94dYP733XwrUqFUhDtDG8RsqmGQ6UDPvnmH4Pvy2rv b3log/hacpai/README.md added Qmbkno2HVZdW7XfwsVjmuu9VDKBByczFR8qwsBXMjMrjPQ b3log/hacpai added QmPxebZuW2pgfzj5JWq22KUzxStmqQ6i7YUK9Sq9xepXT9 b3log 

這樣我們使用 ipfs cat /ipfs/Qmco94dYP733XwrUqFUhDtDG8RsqmGQ6UDPvnmH4Pvy2rv 就可以檢視 README.md 了。在其他節點上也可以,只要記住這個檔案的雜湊值就行了。我們可以在自己的 HTTP 閘道器上試試(注意我的埠改成了 5002,你的預設應該是 8080):

9070383bdece4f6792a561c7b4fa98c4-image.png

當然也可以用 ipfs 官方的 HTTP 閘道器:https://ipfs.io/ipfs/Qmco94dYP733XwrUqFUhDtDG8RsqmGQ6UDPvnmH4Pvy2rv

獲取檔案

ipfs get /ipns/QmSYF1HZxhPUWWGrz5bMn16tdD73AeMVhp7pNSHkVCMF7R 

將獲取剛才我們釋出的 b3log 目錄。

Pin

IPFS 的本意是讓使用者覺得所有檔案都是在本地的,沒有“從遠端伺服器上下載檔案”。Pin 是將檔案長期保留在本地,不被垃圾回收。

執行 ipfs pin ls 可以檢視哪些檔案在本地是持久化的,通過 add 新增的檔案預設就是 pin 過的。

繫結節點名

每次修改檔案後 add 都會返回不同的雜湊,這對於網站來說就沒法固定訪問地址了,所以我們需要通過 ipns 來“繫結”節點名。

上面 b3log 目錄的雜湊值是 QmPxebZuW2pgfzj5JWq22KUzxStmqQ6i7YUK9Sq9xepXT9,我們將整個目錄作為節點根目錄釋出:

D:\go-ipfs>ipfs name publish QmPxebZuW2pgfzj5JWq22KUzxStmqQ6i7YUK9Sq9xepXT9 Published to QmSYF1HZxhPUWWGrz5bMn16tdD73AeMVhp7pNSHkVCMF7R: /ipfs/QmPxebZuW2pgfzj5JWq22KUzxStmqQ6i7YUK9Sq9xepXT9 

然後我們就可以通過 ipns 訪問了,注意是 ipns

D:\go-ipfs>ipfs cat /ipns/QmSYF1HZxhPUWWGrz5bMn16tdD73AeMVhp7pNSHkVCMF7R/hacpai/README.md The piper will lead us to reason. 歡迎訪問黑客與畫家的社群 https://hacpai.com 

以後每次更新檔案都再 publish 一下就行了。目前(v0.4.12)使用 ipns 訪問會很慢,據說 v0.4.14 會解決。

DNS 解析

IPFS 允許使用者使用現有的域名系統,這樣就能用一個好記的地址來訪問檔案了,比如:

D:\go-ipfs>ipfs cat /ipns/ipfs.b3log.org/hacpai/README.md The piper will lead us to reason. 歡迎訪問黑客與畫家的社群 https://hacpai.com 

只需要在 DNS 解析加入一條 TXT 記錄:

記錄型別主機記錄記錄值
TXTipfsdnslink=/ipns/QmSYF1HZxhPUWWGrz5bMn16tdD73AeMVhp7pNSHkVCMF7R

總結

IPFS 是永久的、去中心化儲存和共享檔案的方法,這是一種內容可定址、版本化、點對點超媒體的分散式協議
我們可以用它來存取檔案,資料永不丟失
應用可以用它來做資料庫,自動擁有版本化、快取及分散式特性
官方參考實現使用 golang 編寫,JavaScript、Python、C 等語言在陸續開發中
總之,IPFS 是一套非常厲害的檔案系統

原文:https://hacpai.com/article/1511015097370
 

推薦兩個以太坊相關的實戰教程:

區塊鏈初學者   : 以太坊 DApp 實戰開發入門
區塊鏈開發進階:去中心化以太坊 DApp 電商平臺實戰開發