什麼是IPFS?IPFS與區塊鏈有什麼關係

阿童木的眷戀發表於2019-06-19

1.什麼是IPFS?

  IPFSInter 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軟體安裝

~$ 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)

 


 

 

相關文章