做者簡介:戴嘉樂( Mr.Maple ) | 前百度高級研發工程師 | IPFS應用實踐者&佈道師|
我的網站: https://www.daijiale.cn
聯繫方式:微信號:daijiale6239。
IPFS全稱InterPlanetary File System,中文名:星際文件系統,是一個旨在建立持久且分佈式存儲和共享文件的網絡傳輸協議。
它是一種內容可尋址的對等超媒體分發協議。在IPFS網絡中的節點將構成一個分佈式文件系統。它是一個開放源代碼項目,自2014年開始由Protocol Labs (協議實驗室)在開源社區的幫助下發展。其最初由Juan Benet設計。
IPFS是點對點的超媒體協議,可讓網絡更快、更安全、更開放。它是一個面向全球的、點對點的分佈式版本文件系統,試圖將全部具備相同文件系統的計算設備鏈接在一塊兒。
官網:https://ipfs.io/html
IPFS—又稱「星際文件系統」。簡單點說,它是一個點對點的分佈式文件系統(和比特幣技術同樣),經過底層協議,可讓存儲在IPFS系統上的文件,在全世界任何一個地方快速獲取,且不受防火牆的影響(無需網絡代理)。前端
咱們如今所使用的互聯網協議被稱做——超文本協議HTTP。這種協議具備超中心化特性。git
也就是說,你從互聯網上下載文件或者是瀏覽網頁,一次只能從一個數據中心獲取你所須要的資料。若是這個數據中心出現故障,或者被限制或是攻擊,就會出現文件丟失或者網頁沒法打開的問題。好比你存在某雲盤的資料忽然沒法下載,或者你想瀏覽的網頁由於某些政策緣由沒法打開。github
而IPFS的目的就是解決這些問題。在某些方面,IPFS相似Web,你同樣能夠基於IPFS進行互聯網地址的連接。但IPFS是去中心化的,它不存在Web的主網故障問題。因此,IPFS徹底取代掉HTTP也並不是天方夜譚。web
下載地址:https://dist.ipfs.io/#go-ipfs算法
本篇博客下載並使用的版本是:go-ipfs Version v0.4.13 for OS X 64bitjson
ipfs --help //打開命令行,輸入,出現Log信息時,表示安裝成功
在本地全局目錄下新建倉庫:bootstrap
cd ~/.ipfs export EDITOR=/usr/bin/vim ipfs config edit
執行完ipfs config edit後會打開一個ipfs節點配置文件,能夠以下修改配置參數:vim
{ "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
能夠看到以下文件:
wiki-release
你們能夠參考ipfs-wiki Demo,根據本身的需求,經過markdown自定義不一樣的wiki內容和目錄。
記住文件根目錄的Hash值:QmV5ZVQxXURKPDcVDW8WjpLCiQYvNzg173XcB6rYFevoXm
ipfs daemon
https://ipfs.io/ipfs/QmV5ZVQx...
因爲ipfs的hash對應着一個不可變的內容,每次更新網站以後,website的hash都會變,舊的link不能訪問到新的內容。
ipfs提供了ipns來解決更新的問題。
ipfs容許用戶使用一個私有密鑰來對哈希附加一個引用,使用一個公共密鑰哈希(簡稱pubkeyhash)表示你的網站的最新版本。
具體操做是:
經過上述方式,就完成了website和一個固定的link的綁定:
QmPS5NRXPCeAUtofKbW7c58Qm4PpM8mPEVJvaooE13LF78
ipfs name resolve QmPS5NRXPCeAUtofKbW7c58Qm4PpM8mPEVJvaooE13LF78 /ipfs/QmV5ZVQxXURKPDcVDW8WjpLCiQYvNzg173XcB6rYFevoXm
IPNS訪問固定節點Hash:
https://ipfs.io/ipns/QmPS5NRX...
驗證成功,出現以下效果:
以以前發佈到主網的節點爲第一節點,咱們本地再新建一個節點,用以模擬第二節點的身份,打開Web Console:
在第二節點上,咱們依然能夠經過IPFS HASH查詢到第一節點主網上的 ipfs-wiki-system目錄文件數據
同時,咱們也能看到:控制檯顯示記錄了咱們發佈至主網數據的區塊節點數已經擴散至275個。
也就是說,來自另外全球其餘274地方的個體,在本身的「記帳本」中記下了你以前發佈的數據,哪怕其中個別服務器宕機(天災人禍,挖斷電纜,世界末日等等),只要有一個節點安好,你的數據都不會丟失,真正意義實現了去中心化的服務機制。
本文部份內容參考以下文獻,特別鳴謝:
如何使用星際文件傳輸網絡(IPFS)搭建區塊鏈服務-黎躍春
Youtube實驗室
protocol協議實驗室
Filecoin早期曠工計劃
IPFS開發英文官方文檔
IPFS——它能取代HTTP協議?
IPFS—http的終極殺手
[ 【戴嘉樂】詳解IPFS的本質、技術架構以及應用]()
圓方圓學院聚集大批區塊鏈名師,打造精品的區塊鏈技術課程。 在各大平臺都長期有優質免費公開課,歡迎報名收看。
公開課地址:https://ke.qq.com/course/345101