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):
當然也可以用 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 記錄:
記錄型別 | 主機記錄 | 記錄值 |
---|---|---|
TXT | ipfs | dnslink=/ipns/QmSYF1HZxhPUWWGrz5bMn16tdD73AeMVhp7pNSHkVCMF7R |
總結
IPFS 是永久的、去中心化儲存和共享檔案的方法,這是一種內容可定址、版本化、點對點超媒體的分散式協議
我們可以用它來存取檔案,資料永不丟失
應用可以用它來做資料庫,自動擁有版本化、快取及分散式特性
官方參考實現使用 golang 編寫,JavaScript、Python、C 等語言在陸續開發中
總之,IPFS 是一套非常厲害的檔案系統
原文:https://hacpai.com/article/1511015097370
推薦兩個以太坊相關的實戰教程:
區塊鏈初學者 : 以太坊 DApp 實戰開發入門
區塊鏈開發進階:去中心化以太坊 DApp 電商平臺實戰開發
写评论
很抱歉,必須登入網站才能發佈留言。