1.什么是IPFS?
IPFS
是Inter Planetary File System
(星際文件系統)的縮寫,是一個典型的點對點分布式文件系統, 旨在用同一個文件系統連接所有的計算設備。這時候有些小伙伴可能會問,為什么要使用分布式文件系統,我將我的文件存儲在本地筆記本上,或者上傳到雲端(典型的雲端提供商有AWS S3, Azure Cloud 等等)保管就好了呀,可用性高而且一般不會丟。其實對區塊鏈技術有一點了解的小伙伴不難想到,這種中心化的服務器模式,很容易造成單點故障(服務提供商中斷服務或者以違反規定為由,移除/屏蔽你的文件)。此外,隨着文件存儲數量的增加,存儲成本也將變得越來越昂貴。在這種背景下,IPFS應用而生。在 IPFS 的世界里,這些服務提供商將不再是中心化服務器,而是 P2P 網絡里的計算機。與任何人都可以 運行一個以太坊節點一樣,任何人也都可以運行一個 IPFS 節點,並加入網絡來形成全球的文件系統。 文件可以在很多節點間復制,幾乎不可能出現無法訪問文件的情況(IPFS 沒有單故障點, 節點不需要相互信任)。附上兩種文件系統的對比圖。
此外,IPFS也被稱為顛覆HTTP協議的協議,目前已成為事實上的分布式HTTP協議的工業標准。之所以這么講是因為,目前我們所使用的WEB網絡(即日常瀏覽的各大網站:百度,github,淘寶等等)都是基於HTTP協議的,HTTP底層基於TCP協議,是一種典型的中心化的網絡,即無論內容分發如何分布式進行,無論有多少服務器分布在世界各地。中心化的本質仍然存在。為了從根本上解決這種中心化的模式,IPFS將相同的文件進行了hash計算,確定了其唯一的地址。說的再直白點就是,我們平時所瀏覽的每一個網頁其實都是前端工程師對文字、圖片、聲音、視頻等一系列文件的打包處理,如果我們將這些文件放到IPFS進行哈希計算唯一化處理,則我們以后直接使用這個哈希地址對同一份文件進行訪問,無論從任何設備,任意地點,地址的唯一性都可以幫助我們找到相同的資源。此外,文件在IPFS中是可共享的。你的鄰居如果訪問過相同的網站,你就可以從他那里直接獲取,而不需要再訪問雲端,物理距離更近,打開速度也更快。有了IPFS,我們或不再需要中心化的WEB服務器,一切資源可以去中心化的發布。將網頁,圖片,腳本等等資源,提交到IPFS進行唯一化發布,得到了這些地址,便可以訪問你的網站。地址太長不好記,還可以生成一個短地址,就像現在的網站域名(此說法來自 IPFS:下一代分布式文件系統(filenet))。至於用戶的登錄驗證等功能,則可以使用智能合約來完成 (msg.sender=owner)。
2.IPFS在區塊鏈中的應用
正如文檔中所說,因在以太坊中存儲數據需要gas,如果存儲的文件過多,則花費十分昂貴,由於以太坊虛擬機的限制, 有時甚至是不可行的。以分布式電商系統為例,如果我們將用於商品展示的圖片和描述超文本都存儲在以太坊上的話,則會給以太坊網絡造成很大的壓力,消耗大量的帶寬。因此,為了減緩區塊鏈的存儲壓力,我們可以將商品圖片和商品描述信息等信息存儲在 同樣去中心化的星際文件系統(IPFS
)中,而僅僅在鏈上保存這些數據的ID
。
需要注意的是,在IPFS中只關心文件內容,而不關心文件的名稱。也就是說只要兩個文件的內容一樣,即使是不同的文件名,也將得到同樣的 哈希值。這對於醫療數據分享這種應用場景下,是十分重要且必要的。
3.IPFS節點軟件安裝與自定義設置
3.1軟件安裝
- 下載地址:https://dist.ipfs.io/#go-ipfs (讀者可以選擇自己需要的版本)
~$ wget https://dist.ipfs.io/go-ipfs/v0.4.13/go-ipfs_v0.4.13_linux-amd64.tar.gz
- 解壓
~$ tar xzvf go-ipfs_v0.4.13_linux-386.tar.gz
- 配置環境變量(類似於java中的jdk配置)
~$ echo "export PATH=$HOME/go-ipfs:$PATH" >> .bashrc ~$ source .bashrc
3.2自定義設置
- 初始化倉庫
IPFS的實現與Git相似,在開始使用前都需要初始化一個本地倉庫進行工作。
~$ ipfs init
默認情況下,init
命令將在當前用戶主目錄下建立.ipfs
目錄作為本地倉庫根目錄。 如果你希望設置一個其他的目錄作為倉庫根目錄,可以使用環境變量IPFS_PATH
來指向期望 的目錄,如下圖所示:
~$ export IPFS_PATH=/path/to/ipfsrepo ~$ ipfs init
- 節點配置
IPFS節點軟件提供了REST API接口,默認在本地5001端口監聽,但也可以自己設置。通過設置監聽地址和CORS(允許跨域資源共享),可以在其他主機的瀏覽器中通過AJAX技術訪問到這個API.
~$ ipfs config --json API.HTTPHeaders.Access-Control-Allow-Origin '["*"]' ~$ ipfs config --json Addresses.API '"/ip4/0.0.0.0/tcp/5001"'
配置默認網關(該網關可以讓我們通過HTTP協議訪問IPFS網絡中的文件),默認是8080。由於我們項目中的默認web服務器端口也是8080,因此,為了避免沖突,我們最好設置一個新的值,在這里我設置為5000
~$ ipfs config --json Addresses.Gateway '"/ip4/0.0.0.0/tcp/5000"'
3.3加入IPFS網絡
~$ ipfs daemon
4. IPFS網絡的文件上傳與下載
4.1 文件上傳
類似於Git,在IPFS中,文件的添加是在本地倉庫中進行的。而且 和Git一樣,都是使用add
命令向本地倉庫中添加文件。假設我們現在要將一個寫着 “Hello IPFS!!!”的文件hello.txt 上傳到IPFS網絡。
可以注意到系統為該文件返回了一個唯一的hash索引。
在 上面 2.IPFS在區塊鏈中的應用 中我們有提到,IPFS只關心文件的內容,而與文件名無關,即相同的內容必定會是相同的哈希值,讓我們在這里驗證一下這個神奇的功能。
4.2 文件的下載
在IPFS中,你要獲取一個文件的唯一辦法,是知道它的哈希值。使用唯一的哈希值進行文件下載的方式有兩種:命令行使用cat 或者HTTP網關(這里我們的端口是5000)訪問遠程容器
參考文獻:
IPFS:下一代分布式文件系統(filenet)