理論基礎
IPFS(星際文件系統),是一個分布式文件系統協議。IPFS協議定義了文件在分布式系統中如何存儲、索引、傳輸。IPFS的目標是通過一個文件系統將網絡中的所有的設備連接在起來
簡介
- 基於內容尋址,而非基於域名尋址。文件具有唯一存在的唯一性,一個文件加入到IPFS的網絡,基於計算對內容賦予一個唯一加密的哈希值。
- 提供文件的歷史版本控制器(如git),並且讓多個節點使用保存不同版本的文件;
- IPFS的網絡運行着一條區塊鏈,即用來存儲互聯網文件的哈希值表,每次有網絡訪問,即要在鏈上查詢該內容(文件)的地址;
- 通過使用代幣(FileCoin)的激勵作用,讓各節點有動力去存儲數據。FileCoin是一個由加密貨幣驅動的存儲網絡。礦工通過為網絡提供開放的硬盤空間獲得FileCoin,而用戶則用FileCoin來支付在去中心化網絡中存儲加密文件的費用。
工作機制
IPFS為每一個文件分配一個獨一無二的hash值,這個方式使得IPFS可以支持基於文件內容尋址。IPFS在整個網絡范圍內去掉重復的文件,並且為每一個文件建立版本管理。
當查詢文件的時候,IPFS網絡根據文件的hash值進行查找。為了讓用戶更好的記文件存放的hash,IPFS利用IPNS將hash值映射一個比較容易記憶的IPNS名字,每個節點除了存儲自己需要的數據,還需要存儲一張hash表,用來記錄文件存儲的位置,進行文件的查詢下載。
實驗操作
IPFS環境搭建
Ubuntu 18.04.5 LTS 在此平台開發用正常步驟 之后演示是在win10平台
sudo apt-get update
更新一下軟件列表
還需安裝golang sudo apt-get install golang-go -y
,安裝過的可以忽略
下載IPFS
wget https://gitee.com/plusz/go-ipfs.git
這里用gitee同步的github鏡像
或者直接 git clone https://gitee.com/plusz/go-ipfs.git
WINDOWS平台下載地址:https://dist.ipfs.io/#go-ipfs (選windows binary,需要梯子)
配置環境變量
將解壓的路勁添加到PATH環境變量,不加也行
在解壓路徑下ipfs version
查看版本
初始化本地倉庫
和git類似,ipfs節點也需要先初始化一個本地倉庫
執行 ipfs init
此處的peer identity 即是屬於自身的IPFS網絡哈希值,相當於ID,通過ID可以訪問到節點
安裝
輸入上面最后一行的內容
出現這個即為安裝成功
ipfs安裝的默認配置
IPFS安裝后的配置放在系統用戶文件夾目錄下C:\Users\xxxx.ipfs , xxxx 為pc名,config為配置信息,可以按需修改,這里暫時不修改
運行
1. 輸入 ipfs daemon 啟動IPFS服務監聽
目的是用於監聽IPFS網絡通信數據,使用的監聽端口是5001。注意要並保持開啟狀態,才能守護監聽的進程。
2. IPFS的基礎命令
通過ipfs help
可以查看一些基礎命令
基本命令:
init ——初始化IPFS本地配置
Add ——添加一個文件到IPFS
cat —— 展示IPFS對象數據
get —— 下載IPFS對象
ls —— 從一個對象中列出鏈接
refs —— 從一個對象中列出鏈接哈希
數據結構命令:
block —— 與數據存儲中的原始塊交互
object —— 與原始DAG節點交互
高級命令:
daemon —— 開啟一個開始運行的后台進程
mount —— 掛載一個IPFS只讀的掛載點
name —— 發布並解析IPFS名字
key —— 創建並列出IPFS名字密鑰對
pin —— 將對象鎖定到本地存儲
網絡命令:
id —— 展示IPFS節點信息
bootstrap —— 添加或刪除引導文件
swarm —— 管理p2p網絡連接
工具命令:
config —— 管理配置
version —— 展示IPFS版本信息
update —— 下載並應用go-ipfs更新
commands —— 列出所有可用命令
此時我們通過ipfs id
可以查看屬於自己的通信ID信息
輸入ipfs config show
可以查看配置信息
ipfs swarm peers
查看附近也在使用IPFS網絡節點的伙伴,如果沒有數據說明附近沒人使用。
這里可以看到附近還是有很多IPFS節點的
3. 調用IPFS網絡中的文件
輸入 ipfs cat /ipfs/QmW2WQi7j6c7UgJTarActp7tDNikE4B2qXtFCfLPdsgaTQ/cat.jpg >cat.jpg
我們即從mW2WQi7j6c7UgJTarActp7tDNikE4B2qXtFCfLPdsgaTQ的節點里下載了名為cat.jpg的一張圖片到本地。
4. 上傳文件
文件夾內新建一個測試文件
通過命令ipfs add ipfsTest.txt
上傳文件,並且返回一個唯一哈希值
在命令行輸入ipfs cat + 哈希值
既可以看到內容
可視化頁面
在IPFS網絡狀態開啟時可以通過http://localhost:5001/webui查看到IPFS可視化操作界面
查看節點消息
與上面在命令行里查看是一樣的ID
將剛才上傳的文件hash復制到搜索框檢查后
從上圖可知,這個CID值的HASH值不是我們想要的HASH值,這是由於原本的hash太長了,一堆數字讀起來不容易,所以需要再進行編碼,壓縮其長度,且容易被傳播,為此,IPFS采用了Base58這種編碼。
在右側可以看到CID信息
IPFS現在的multihash值,都是以1220開頭的,按照Base58的算法,算出來的結果都是以Qm開頭的。
IPFS如何計算文件hash?
IPFS采用了SHA2-256算法,對任意長度的內容,生成的hash值長度固定,都是32個字節。在Linux下,直接用sha256sum可以計算SHA2-256格式的HASH值。雖然目前用的是SHA-256,但是可以支持多種HASH算法,可以升級算法,但是不會有大的架構改動。於是,IPFS采用了multihash這種簡單的HASH表示方法,支持多種HASH算法。如果未來修改算法,用的仍然是multihash,保證了表達方式的持續性。
multihash是一種自識別hash。multihash多重哈希遵循TLV模式(type-length-value)。其實就是一個字符串,由三部分組成:HASH算法編碼、HASH值得長度(字節數)、HASH值。
SHA2-256的編碼為Ox12,其HASH摘要長度為32字節(十六進制數為0x20)。把1220加到前面所得HASH至的開頭。例如本例文件的multihash編碼(十六進制)。
簡而言之:
原始數據添加元數據封裝為IPFS文件—>計算SHA2-256—>封裝成multihash—>轉化為Base58
上傳圖片、視頻文件
上傳了一張1mb的圖片后
可以看到有很多的link,我們繼續上傳一個更大的視頻文件
檢查剛上傳的視頻文件可以看到擁有更多的LINKS
這里的links就是IPFS存儲並共享文件的機制所生成的
再打開一個links[0]可以看到還有更多的子集
IPFS上的文件都存儲在IPFS對象中,每個對象最多可以存儲256KB的數據,也可以包含連接其他IPFS對象的鏈接。
那么超過256KB的文件怎么辦呢?比如一個圖片或者一個視頻,這些大型文件會被分割成數個IPFS對象。每一個對象都是256KB。之后系統會生成一個空白IPFS對象與包含這個文件的其他所有IPFS對象鏈接。
IPFS的數據結果非常簡單但卻非常強大。這一結構使我們可以把它作為文件系統來使用。這是一個包含了一些文件的簡單索引結構,可以將其轉成IPFS對象,每一個文件和索引都生成一個IPFS對象。一旦一個文件加入了網絡就不能被修改了,這是一個不能篡改的數據存儲庫,非常類似於區塊鏈。
這也有利於我們大文件存儲區塊鏈的應用實例
上傳大文件
根據上述性質可以將IPFS和區塊鏈完美結合,用戶可以使用IPFS來處理大量數據,然后把對應的加密哈希存儲到區塊鏈中並打上時間戳。這樣就無需將數據本身放在鏈上,不但可以節省區塊鏈的網絡帶寬,還可以對其進行有效保護。關於文件的安全性,一方面可以加密后存入IPFS,另一方面也可利用IPFS實現文件分布式共享。
IPFS彌補了現有區塊鏈系統在文件存儲方面的短板,將IPFS的永久文件存儲和區塊鏈的不可篡改、時間戳證明特性結合,非常適合在版權保護、身份及來源證明等方面加以應用。