做者簡介:戴嘉樂( Mr.Maple ) | 前百度高級研發工程師 | IPFS應用實踐者&佈道師| 我的網站:www.daijiale.cn 聯繫方式:微信號:daijiale6239。html
IPFS全稱InterPlanetary File System,中文名:星際文件系統,是一個旨在建立持久且分佈式存儲和共享文件的網絡傳輸協議。 它是一種內容可尋址的對等超媒體分發協議。在IPFS網絡中的節點將構成一個分佈式文件系統。它是一個開放源代碼項目,自2014年開始由Protocol Labs (協議實驗室)在開源社區的幫助下發展。其最初由Juan Benet設計。 IPFS是點對點的超媒體協議,可讓網絡更快、更安全、更開放。它是一個面向全球的、點對點的分佈式版本文件系統,試圖將全部具備相同文件系統的計算設備鏈接在一塊兒。 官網:ipfs.io/前端
IPFS—又稱「星際文件系統」。簡單點說,它是一個點對點的分佈式文件系統(和比特幣技術同樣),經過底層協議,可讓存儲在IPFS系統上的文件,在全世界任何一個地方快速獲取,且不受防火牆的影響(無需網絡代理)。git
咱們如今所使用的互聯網協議被稱做——超文本協議HTTP。這種協議具備超中心化特性。github
也就是說,你從互聯網上下載文件或者是瀏覽網頁,一次只能從一個數據中心獲取你所須要的資料。若是這個數據中心出現故障,或者被限制或是攻擊,就會出現文件丟失或者網頁沒法打開的問題。好比你存在某雲盤的資料忽然沒法下載,或者你想瀏覽的網頁由於某些政策緣由沒法打開。web
而IPFS的目的就是解決這些問題。在某些方面,IPFS相似Web,你同樣能夠基於IPFS進行互聯網地址的連接。但IPFS是去中心化的,它不存在Web的主網故障問題。因此,IPFS徹底取代掉HTTP也並不是天方夜譚。算法
HTTP效率低下,服務器成本昂貴 使用HTTP協議從一臺計算機服務器上一次只能下載一個文件,而不是同時從多臺計算機中獲取文件。經過P2P方式的視頻傳輸能夠節省帶寬成本的60%。json
歷史文件被刪除 網頁的平均使用壽命爲100天,大量的網站文件不能得以長期保存。有些重要的文件因操做不當,也有可能永遠在互聯網消失。bootstrap
中心化的網絡限制了機會 互聯網一直是人類進步的催化器,但中心化的網絡容易被控制,是對互聯網良性發展的的威脅。vim
網絡應用太依賴骨幹網 爲保證數據的可靠性,咱們開發的應用程序太依賴大型的中心服務器,並經過大量的備份來保證數據的安全。
HTTP協議已經用了20年的歷史,從HTTP 1.0 到如今的HTTP5,網頁的展現愈來愈美觀豐富,但它背後的Browser/Server 模式是歷來沒變的。跨域
互聯網信息永久存儲 IPFS像是一個分佈式存儲網絡(相似於SIA),任何存儲在系統裏的資源,包括文字、圖片、聲音、視頻,以及網站代碼,經過IPFS進行哈希運算後,都會生成惟一的地址。從此,你只要經過這個地址就能夠打開它們。而且這個地址是能夠被分享的。 而因爲加密算法的保護,該地址具有了不可篡改和刪除的特性(在某種意義上,若是破解密碼仍是有可能被篡改或刪除,但機率極低)。因此,一旦數據存儲在IPFS中,它就會是永久性的。好比咱們常常會遇到的某個資源刪除沒法訪問的問題。 這種狀況,在IPFS上就不會發生。即使是把該站點撤銷,只要存儲該站點信息的網絡依然存在,該網頁就能夠被正常訪問。存儲站點的分佈式網絡越多,它的可靠性也就越強。 與SIA不一樣的是,IPFS存儲的通常是公共信息,普通大衆均可以得到的。有一種說法認爲,若是IPFS徹底取代HTTP,那麼此後,人類歷史將會被永久保存,且不會被篡改。 這也就意味着,人類所作的每一件事情都會被記錄,無論是正確的、抑或是錯誤的。
解決過分冗餘問題,實現共享經濟 若是你喜歡某部電影,又擔憂電影資源丟失,一般的作法是,你會把這部電影下載在本身的電腦上。好比電影《阿凡達》,在2016年一年的下載次數就達到了1658萬次,總下載數量更是驚人。那麼一個沒法避免的問題是:一樣的一部電影被反覆儲存,形成了內存資源極大浪費。這就是HTTP協議的弊端。一樣的資源備份的次數過多,就會形成過分冗餘的問題。 而IPFS的出現能夠很好的解決這個問題。IPFS會把存儲文件,作一次哈希計算,隻字不差的兩個文件哈希值相同。因此,用戶只須要使用相同的哈希值,就能夠訪問那個文件,這個哈希值就是文件的地址。只要獲取這個地址,就能夠共享資源了。 基於上面的永久存儲特性,你不再用擔憂某個電影找不到了,也不用備份,由於全球電腦上只要有那麼幾我的存儲着,你就能拿到它。而不是重複存儲幾十萬份。
同時基於內容尋址,而非基於域名尋址。 IPFS的網絡上運行着一條區塊鏈,即用來存儲互聯網文件的哈希值表,每次有網絡訪問,即要在鏈上查詢該內容(文件)的地址。 文件(內容)具備存在的惟一性,一個文件加入了IPFS的網絡,將基於計算對內容賦予一個惟一加密的哈希值。這將改變咱們使用域名訪問網絡的習慣。 提供文件的歷史版本控制器(相似Git),而且讓多節點使用保存不一樣版本的文件。
節點存儲激勵,代幣分紅 經過使用代幣(FileCoin)的激勵做用,讓各節點有動力去存儲數據。 Filecoin 是一個由加密貨幣驅動的存儲網絡。礦工經過爲網絡提供開放的硬盤空間得到Filecoin,而用戶則用 Filecoin 來支付在去中心化網絡中儲存加密文件的費用。
本篇博客下載並使用的版本是:go-ipfs Version v0.4.13 for OS X 64bit
ipfs --help //打開命令行,輸入,出現Log信息時,表示安裝成功
複製代碼
在本地全局目錄下新建倉庫:
cd ~/.ipfs
export EDITOR=/usr/bin/vim
ipfs config edit
複製代碼
執行完ipfs config edit後會打開一個ipfs節點配置文件,能夠以下修改配置參數:
{
"Identity":{
"PeerID":"QmXXXXXXXXXXXXXXX",
"PrivKey":"XXXXXXXXXXXX"
},
"Datastore":{
"StorageMax":"10GB",
"StorageGCWatermark":90,
"GCPeriod":"1h",
"Spec":{
"mounts":[
{
"child":{
"path":"blocks",
"shardFunc":"/repo/flatfs/shard/v1/next-to-last/2",
"sync":true,
"type":"flatfs"
},
"mountpoint":"/blocks",
"prefix":"flatfs.datastore",
"type":"measure"
},
{
"child":{
"compression":"none",
"path":"datastore",
"type":"levelds"
},
"mountpoint":"/",
"prefix":"leveldb.datastore",
"type":"measure"
}
],
"type":"mount"
},
"HashOnRead":false,
"BloomFilterSize":0
},
"Addresses":{
"Swarm":[
"/ip4/0.0.0.0/tcp/4001",
"/ip6/::/tcp/4001"
],
"Announce":[
],
"NoAnnounce":[
],
"API":"/ip4/127.0.0.1/tcp/5001",
"Gateway":"/ip4/127.0.0.1/tcp/8080"
},
"Mounts":{
"IPFS":"/ipfs",
"IPNS":"/ipns",
"FuseAllowOther":false
},
"Discovery":{
"MDNS":{
"Enabled":true,
"Interval":10
}
},
"Ipns":{
"RepublishPeriod":"",
"RecordLifetime":"",
"ResolveCacheSize":128
},
"Bootstrap":[
"/dnsaddr/bootstrap.libp2p.io/ipfs/QmNnooDu7bfjPFoTZYxMNLWUQJyrVwtbZg5gBMjTezGAJN",
"/dnsaddr/bootstrap.libp2p.io/ipfs/QmQCU2EcMqAqQPR2i9bChDtGNJchTbq5TbXJJ16u19uLTa",
"/dnsaddr/bootstrap.libp2p.io/ipfs/QmbLHAnMoJPWSCR5Zhtx6BHJX9KiKNN6tpvbUcqanj75Nb",
"/dnsaddr/bootstrap.libp2p.io/ipfs/QmcZf59bWwK5XFi76CZX8cbJ4BhTzzA3gU1ZjYZcYW3dwt",
"/ip4/104.131.131.82/tcp/4001/ipfs/QmaCpDMGvV2BGHeYERUEnRQAwe3N8SzbUtfsmvsqQLuvuJ",
"/ip4/104.236.179.241/tcp/4001/ipfs/QmSoLPppuBtQSGwKDZT2M73ULpjvfd3aZ6ha4oFGL1KrGM",
"/ip4/128.199.219.111/tcp/4001/ipfs/QmSoLSafTMBsPKadTEgaXctDQVcqN88CNLHXMkTNwMKPnu",
"/ip4/104.236.76.40/tcp/4001/ipfs/QmSoLV4Bbm51jM9C4gDYZQ9Cy3U6aXMJDAbzgu2fzaDs64",
"/ip4/178.62.158.247/tcp/4001/ipfs/QmSoLer265NRgSp2LA3dPaeykiS1J6DifTC88f5uVQKNAd",
"/ip6/2604:a880:1:20::203:d001/tcp/4001/ipfs/QmSoLPppuBtQSGwKDZT2M73ULpjvfd3aZ6ha4oFGL1KrGM",
"/ip6/2400:6180:0:d0::151:6001/tcp/4001/ipfs/QmSoLSafTMBsPKadTEgaXctDQVcqN88CNLHXMkTNwMKPnu",
"/ip6/2604:a880:800:10::4a:5001/tcp/4001/ipfs/QmSoLV4Bbm51jM9C4gDYZQ9Cy3U6aXMJDAbzgu2fzaDs64",
"/ip6/2a03:b0c0:0:1010::23:1001/tcp/4001/ipfs/QmSoLer265NRgSp2LA3dPaeykiS1J6DifTC88f5uVQKNAd"
],
"Gateway":{
"HTTPHeaders":{
"Access-Control-Allow-Headers":[
"X-Requested-With",
"Range"
],
"Access-Control-Allow-Methods":[
"GET"
],
"Access-Control-Allow-Origin":[
"*"
]
},
"RootRedirect":"",
"Writable":false,
"PathPrefixes":[
]
},
"API":{
"HTTPHeaders":null
},
"Swarm":{
"AddrFilters":null,
"DisableBandwidthMetrics":false,
"DisableNatPortMap":false,
"DisableRelay":false,
"EnableRelayHop":false,
"ConnMgr":{
"Type":"basic",
"LowWater":600,
"HighWater":900,
"GracePeriod":"20s"
}
},
"Reprovider":{
"Interval":"12h",
"Strategy":"all"
},
"Experimental":{
"FilestoreEnabled":false,
"ShardingEnabled":false,
"Libp2pStreamMounting":false
}
}
複製代碼
每一個節點都會存在一個惟一標識,查看節點ID方式以下:
ipfs id
複製代碼
ipfs daemon
複製代碼
出現了5001端口被佔用的狀況,這邊能夠經過對節點配置文件的修改來解決,以下所示:
爲了方便後續前端的開發和數據訪問,提早對跨域資源共享CORS進行配置,ctrl-c 退出ipfs,而後按照下面的步驟進行跨域配置:
ipfs config --json API.HTTPHeaders.Access-Control-Allow-Methods '["PUT", "GET", "POST", "OPTIONS"]'
ipfs config --json API.HTTPHeaders.Access-Control-Allow-Origin '["*"]'
複製代碼
瀏覽器打開 http://localhost:5002/webui ,出現Web Console 圖形化控制檯:
這裏能夠看到全部run在主網上的節點信息,和本地節點相關的配置數據。
利用 IPFS 構建一個去中心化、不可篡改的分佈式Wiki系統。
考慮到方便後期開源和推廣,這邊我是託管在github上,你們能夠選擇本身熟悉的代碼託管服務,也能夠克隆個人工程 -> ipfs-wiki-system
,在其基礎上進行你的二次開發,有任何問題,歡迎提交issue給我。
mkdir workplace
cd workplace
git clone git@github.com:daijiale/ipfs-wiki-system.git
複製代碼
cd workplace/ipfs-wiki-system/wiki-release
ll
複製代碼
能夠看到以下文件:
你們能夠參考ipfs-wiki Demo,根據本身的需求,經過markdown自定義不一樣的wiki內容和目錄。
記住文件根目錄的Hash值:QmV5ZVQxXURKPDcVDW8WjpLCiQYvNzg173XcB6rYFevoXm
ipfs daemon
複製代碼
因爲ipfs的hash對應着一個不可變的內容,每次更新網站以後,website的hash都會變,舊的link不能訪問到新的內容。
ipfs提供了ipns來解決更新的問題。
ipfs容許用戶使用一個私有密鑰來對哈希附加一個引用,使用一個公共密鑰哈希(簡稱pubkeyhash)表示你的網站的最新版本。
具體操做是:
經過上述方式,就完成了website和一個固定的link的綁定: QmPS5NRXPCeAUtofKbW7c58Qm4PpM8mPEVJvaooE13LF78
ipfs name resolve QmPS5NRXPCeAUtofKbW7c58Qm4PpM8mPEVJvaooE13LF78
/ipfs/QmV5ZVQxXURKPDcVDW8WjpLCiQYvNzg173XcB6rYFevoXm
複製代碼
IPNS訪問固定節點Hash:
驗證成功,出現以下效果:
以以前發佈到主網的節點爲第一節點,咱們本地再新建一個節點,用以模擬第二節點的身份,打開Web Console:
在第二節點上,咱們依然能夠經過IPFS HASH查詢到第一節點主網上的 ipfs-wiki-system目錄文件數據
同時,咱們也能看到:控制檯顯示記錄了咱們發佈至主網數據的區塊節點數已經擴散至275個。
也就是說,來自另外全球其餘274地方的個體,在本身的「記帳本」中記下了你以前發佈的數據,哪怕其中個別服務器宕機(天災人禍,挖斷電纜,世界末日等等),只要有一個節點安好,你的數據都不會丟失,真正意義實現了去中心化的服務機制。
##參考文獻
本文部份內容參考以下文獻,特別鳴謝:
如何使用星際文件傳輸網絡(IPFS)搭建區塊鏈服務-黎躍春 Youtube實驗室 protocol協議實驗室 Filecoin早期曠工計劃 IPFS開發英文官方文檔 IPFS——它能取代HTTP協議? IPFS—http的終極殺手
圓方圓學院聚集大批區塊鏈名師,打造精品的區塊鏈技術課程。 在各大平臺都長期有優質免費公開課,歡迎報名收看。 公開課地址:ke.qq.com/course/3451…