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

1.什麼是IPFS?

  IPFSInter Planetary File System(星際文件系統)的縮寫,是一個典型的點對點分佈式文件系統, 旨在用同一個文件系統鏈接全部的計算設備。這時候有些小夥伴可能會問,爲何要使用分佈式文件系統,我將個人文件存儲在本地筆記本上,或者上傳到雲端(典型的雲端提供商有AWS S3, Azure Cloud 等等)保管就行了呀,可用性高並且通常不會丟。其實對區塊鏈技術有一點了解的小夥伴不難想到,這種中心化的服務器模式,很容易形成單點故障(服務提供商中斷服務或者以違反規定爲由,移除/屏蔽你的文件)。此外,隨着文件存儲數量的增長,存儲成本也將變得愈來愈昂貴。在這種背景下,IPFS應用而生。前端

  在 IPFS 的世界裏,這些服務提供商將再也不是中心化服務器,而是 P2P 網絡裏的計算機。與任何人均可以 運行一個以太坊節點同樣,任何人也均可以運行一個 IPFS 節點,並加入網絡來造成全球的文件系統。 文件能夠在不少節點間複製,幾乎不可能出現沒法訪問文件的狀況(IPFS 沒有單故障點, 節點不須要相互信任)。附上兩種文件系統的對比圖。java

此外,IPFS也被稱爲顛覆HTTP協議的協議,目前已成爲事實上的分佈式HTTP協議的工業標準。之因此這麼講是由於,目前咱們所使用的WEB網絡(即平常瀏覽的各大網站:百度,github,淘寶等等)都是基於HTTP協議的,HTTP底層基於TCP協議,是一種典型的中心化的網絡,即不管內容分發如何分佈式進行,不管有多少服務器分佈在世界各地。中心化的本質仍然存在。爲了從根本上解決這種中心化的模式,IPFS將相同的文件進行了hash計算,肯定了其惟一的地址。說的再直白點就是,咱們平時所瀏覽的每個網頁其實都是前端工程師對文字、圖片、聲音、視頻等一系列文件的打包處理,若是咱們將這些文件放到IPFS進行哈希計算惟一化處理,則咱們之後直接使用這個哈希地址對同一份文件進行訪問,不管從任何設備,任意地點,地址的惟一性均可以幫助咱們找到相同的資源。此外,文件在IPFS中是可共享的。你的鄰居若是訪問過相同的網站,你就能夠從他那裏直接獲取,而不須要再訪問雲端,物理距離更近,打開速度也更快。有了IPFS,咱們或再也不須要中心化的WEB服務器,一切資源能夠去中心化的發佈。將網頁,圖片,腳本等等資源,提交到IPFS進行惟一化發佈,獲得了這些地址,即可以訪問你的網站。地址太長很差記,還能夠生成一個短地址,就像如今的網站域名(此說法來自 IPFS:下一代分佈式文件系統(filenet))。至於用戶的登陸驗證等功能,則可使用智能合約來完成 (msg.sender=owner)。linux


2.IPFS在區塊鏈中的應用

 

正如文檔中所說,因在以太坊中存儲數據須要gas,若是存儲的文件過多,則花費十分昂貴,因爲以太坊虛擬機的限制, 有時甚至是不可行的。以分佈式電商系統爲例,若是咱們將用於商品展現的圖片和描述超文本都存儲在以太坊上的話,則會給以太坊網絡形成很大的壓力,消耗大量的帶寬。所以,爲了減緩區塊鏈的存儲壓力,咱們能夠將商品圖片和商品描述信息等信息存儲在 一樣去中心化的星際文件系統(IPFS)中,而僅僅在鏈上保存這些數據的IDgit

須要注意的是,在IPFS中只關心文件內容,而不關心文件的名稱。也就是說只要兩個文件的內容同樣,即便是不一樣的文件名,也將獲得一樣的 哈希值。這對於醫療數據分享這種應用場景下,是十分重要且必要的。github


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類似,在開始使用前都須要初始化一個本地倉庫進行工做。web

~$ ipfs init

默認狀況下,init命令將在當前用戶主目錄下創建.ipfs目錄做爲本地倉庫根目錄。 若是你但願設置一個其餘的目錄做爲倉庫根目錄,可使用環境變量IPFS_PATH來指向指望 的目錄,以下圖所示:json

~$ 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網絡。bash

能夠注意到系統爲該文件返回了一個惟一的hash索引。

在 上面 2.IPFS在區塊鏈中的應用 中咱們有提到,IPFS只關心文件的內容,而與文件名無關,即相同的內容一定會是相同的哈希值,讓咱們在這裏驗證一下這個神奇的功能。

4.2 文件的下載

在IPFS中,你要獲取一個文件的惟一辦法,是知道它的哈希值。使用惟一的哈希值進行文件下載的方式有兩種:命令行使用cat 或者HTTP網關(這裏咱們的端口是5000)訪問遠程容器

 

參考文獻:

IPFS:下一代分佈式文件系統(filenet)

相關文章
相關標籤/搜索