您好,登錄后才能下訂單哦!
這篇文章給大家介紹如何利用IPFS構(gòu)建去中心化分布式Wiki系統(tǒng),內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。
IPFS全稱InterPlanetary File System,中文名:星際文件系統(tǒng),是一個(gè)旨在創(chuàng)建持久且分布式存儲(chǔ)和共享文件的網(wǎng)絡(luò)傳輸協(xié)議。 它是一種內(nèi)容可尋址的對(duì)等超媒體分發(fā)協(xié)議。在IPFS網(wǎng)絡(luò)中的節(jié)點(diǎn)將構(gòu)成一個(gè)分布式文件系統(tǒng)。它是一個(gè)開(kāi)放源代碼項(xiàng)目,自2014年開(kāi)始由Protocol Labs (協(xié)議實(shí)驗(yàn)室)在開(kāi)源社區(qū)的幫助下發(fā)展。其最初由Juan Benet設(shè)計(jì)。 IPFS是點(diǎn)對(duì)點(diǎn)的超媒體協(xié)議,可以讓網(wǎng)絡(luò)更快、更安全、更開(kāi)放。它是一個(gè)面向全球的、點(diǎn)對(duì)點(diǎn)的分布式版本文件系統(tǒng),試圖將所有具有相同文件系統(tǒng)的計(jì)算設(shè)備連接在一起。 官網(wǎng):https://ipfs.io/
IPFS—又稱“星際文件系統(tǒng)”。簡(jiǎn)單點(diǎn)說(shuō),它是一個(gè)點(diǎn)對(duì)點(diǎn)的分布式文件系統(tǒng)(和比特幣技術(shù)一樣),通過(guò)底層協(xié)議,可以讓存儲(chǔ)在IPFS系統(tǒng)上的文件,在全世界任何一個(gè)地方快速獲取,且不受防火墻的影響(無(wú)需網(wǎng)絡(luò)代理)。
我們現(xiàn)在所使用的互聯(lián)網(wǎng)協(xié)議被稱作——超文本協(xié)議HTTP。這種協(xié)議具有超中心化特性。
也就是說(shuō),你從互聯(lián)網(wǎng)上下載文件或者是瀏覽網(wǎng)頁(yè),一次只能從一個(gè)數(shù)據(jù)中心獲取你所需要的資料。如果這個(gè)數(shù)據(jù)中心出現(xiàn)故障,或者被限制或是攻擊,就會(huì)出現(xiàn)文件丟失或者網(wǎng)頁(yè)無(wú)法打開(kāi)的問(wèn)題。比如你存在某云盤(pán)的資料突然無(wú)法下載,或者你想瀏覽的網(wǎng)頁(yè)因?yàn)槟承┱咴驘o(wú)法打開(kāi)。
而IPFS的目的就是解決這些問(wèn)題。在某些方面,IPFS類似Web,你一樣可以基于IPFS進(jìn)行互聯(lián)網(wǎng)地址的鏈接。但I(xiàn)PFS是去中心化的,它不存在Web的主網(wǎng)故障問(wèn)題。所以,IPFS完全取代掉HTTP也并非天方夜譚。
HTTP效率低下,服務(wù)器成本昂貴 使用HTTP協(xié)議從一臺(tái)計(jì)算機(jī)服務(wù)器上一次只能下載一個(gè)文件,而不是同時(shí)從多臺(tái)計(jì)算機(jī)中獲取文件。通過(guò)P2P方式的視頻傳輸可以節(jié)省帶寬成本的60%。
歷史文件被刪除 網(wǎng)頁(yè)的平均使用壽命為100天,大量的網(wǎng)站文件不能得以長(zhǎng)期保存。有些重要的文件因操作不當(dāng),也有可能永遠(yuǎn)在互聯(lián)網(wǎng)消失。
中心化的網(wǎng)絡(luò)限制了機(jī)會(huì) 互聯(lián)網(wǎng)一直是人類進(jìn)步的催化器,但中心化的網(wǎng)絡(luò)容易被控制,是對(duì)互聯(lián)網(wǎng)良性發(fā)展的的威脅。
網(wǎng)絡(luò)應(yīng)用太依賴骨干網(wǎng) 為保證數(shù)據(jù)的可靠性,我們開(kāi)發(fā)的應(yīng)用程序太依賴大型的中心服務(wù)器,并通過(guò)大量的備份來(lái)保證數(shù)據(jù)的安全。
HTTP協(xié)議已經(jīng)用了20年的歷史,從HTTP 1.0 到現(xiàn)在的HTTP5,網(wǎng)頁(yè)的展示越來(lái)越美觀豐富,但它背后的Browser/Server 模式是從來(lái)沒(méi)變的。
互聯(lián)網(wǎng)信息永久存儲(chǔ) IPFS像是一個(gè)分布式存儲(chǔ)網(wǎng)絡(luò)(類似于SIA),任何存儲(chǔ)在系統(tǒng)里的資源,包括文字、圖片、聲音、視頻,以及網(wǎng)站代碼,通過(guò)IPFS進(jìn)行哈希運(yùn)算后,都會(huì)生成唯一的地址。今后,你只要通過(guò)這個(gè)地址就可以打開(kāi)它們。并且這個(gè)地址是可以被分享的。 而由于加密算法的保護(hù),該地址具備了不可篡改和刪除的特性(在某種意義上,如果破解密碼還是有可能被篡改或刪除,但概率極低)。所以,一旦數(shù)據(jù)存儲(chǔ)在IPFS中,它就會(huì)是永久性的。比如我們經(jīng)常會(huì)遇到的某個(gè)資源刪除無(wú)法訪問(wèn)的問(wèn)題。 這種情況,在IPFS上就不會(huì)發(fā)生。即便是把該站點(diǎn)撤銷,只要存儲(chǔ)該站點(diǎn)信息的網(wǎng)絡(luò)依然存在,該網(wǎng)頁(yè)就可以被正常訪問(wèn)。存儲(chǔ)站點(diǎn)的分布式網(wǎng)絡(luò)越多,它的可靠性也就越強(qiáng)。 與SIA不同的是,IPFS存儲(chǔ)的一般是公共信息,普通大眾都可以獲得的。有一種說(shuō)法認(rèn)為,如果IPFS完全取代HTTP,那么此后,人類歷史將會(huì)被永久保存,且不會(huì)被篡改。 這也就意味著,人類所做的每一件事情都會(huì)被記錄,不管是正確的、抑或是錯(cuò)誤的。
解決過(guò)度冗余問(wèn)題,實(shí)現(xiàn)共享經(jīng)濟(jì) 如果你喜歡某部電影,又擔(dān)心電影資源丟失,通常的做法是,你會(huì)把這部電影下載在自己的電腦上。比如電影《阿凡達(dá)》,在2016年一年的下載次數(shù)就達(dá)到了1658萬(wàn)次,總下載數(shù)量更是驚人。那么一個(gè)無(wú)法避免的問(wèn)題是:同樣的一部電影被反復(fù)儲(chǔ)存,造成了內(nèi)存資源極大浪費(fèi)。這就是HTTP協(xié)議的弊端。同樣的資源備份的次數(shù)過(guò)多,就會(huì)造成過(guò)度冗余的問(wèn)題。 而IPFS的出現(xiàn)可以很好的解決這個(gè)問(wèn)題。IPFS會(huì)把存儲(chǔ)文件,做一次哈希計(jì)算,只字不差的兩個(gè)文件哈希值相同。所以,用戶只需要使用相同的哈希值,就可以訪問(wèn)那個(gè)文件,這個(gè)哈希值就是文件的地址。只要獲取這個(gè)地址,就可以共享資源了。 基于上面的永久存儲(chǔ)特性,你再也不用擔(dān)心某個(gè)電影找不到了,也不用備份,因?yàn)槿螂娔X上只要有那么幾個(gè)人存儲(chǔ)著,你就能拿到它。而不是重復(fù)存儲(chǔ)幾十萬(wàn)份。
同時(shí)基于內(nèi)容尋址,而非基于域名尋址。 IPFS的網(wǎng)絡(luò)上運(yùn)行著一條區(qū)塊鏈,即用來(lái)存儲(chǔ)互聯(lián)網(wǎng)文件的哈希值表,每次有網(wǎng)絡(luò)訪問(wèn),即要在鏈上查詢?cè)搩?nèi)容(文件)的地址。 文件(內(nèi)容)具有存在的唯一性,一個(gè)文件加入了IPFS的網(wǎng)絡(luò),將基于計(jì)算對(duì)內(nèi)容賦予一個(gè)唯一加密的哈希值。這將改變我們使用域名訪問(wèn)網(wǎng)絡(luò)的習(xí)慣。 提供文件的歷史版本控制器(類似Git),并且讓多節(jié)點(diǎn)使用保存不同版本的文件。
節(jié)點(diǎn)存儲(chǔ)激勵(lì),代幣分成 通過(guò)使用代幣(FileCoin)的激勵(lì)作用,讓各節(jié)點(diǎn)有動(dòng)力去存儲(chǔ)數(shù)據(jù)。 Filecoin 是一個(gè)由加密貨幣驅(qū)動(dòng)的存儲(chǔ)網(wǎng)絡(luò)。礦工通過(guò)為網(wǎng)絡(luò)提供開(kāi)放的硬盤(pán)空間獲得Filecoin,而用戶則用 Filecoin 來(lái)支付在去中心化網(wǎng)絡(luò)中儲(chǔ)存加密文件的費(fèi)用。
每個(gè)文件及其中的所有塊都被賦予一個(gè)稱為加密散列的唯一指紋。
IPFS通過(guò)網(wǎng)絡(luò)刪除重復(fù)具有相同哈希值的文件,通過(guò)計(jì)算是可以判斷哪些文件是冗余重復(fù)的。并跟蹤每個(gè)文件的版本歷史記錄。
每個(gè)網(wǎng)絡(luò)節(jié)點(diǎn)只存儲(chǔ)它感興趣的內(nèi)容,以及一些索引信息,有助于弄清楚誰(shuí)在存儲(chǔ)什么。
查找文件時(shí),你通過(guò)文件的哈希值就可以在網(wǎng)絡(luò)查找到儲(chǔ)存改文件的節(jié)點(diǎn),找到想要的文件。
使用稱為IPNS(去中心化命名系統(tǒng)),每個(gè)文件都可以被協(xié)作命名為易讀的名字。通過(guò)搜索,就能很容易地找到想要查看的文件。
從IPFS的介紹可以看出, IPFS設(shè)想的是讓所有的網(wǎng)絡(luò)終端節(jié)點(diǎn)不僅僅只充當(dāng) Browser或Client的角色,其實(shí)人人都可以作為這個(gè)網(wǎng)絡(luò)的運(yùn)營(yíng)者,人人都可以是服務(wù)器。
下載地址:https://dist.ipfs.io/#go-ipfs
本篇博客下載并使用的版本是:go-ipfs Version v0.4.13 for OS X 64bit
ipfs --help //打開(kāi)命令行,輸入,出現(xiàn)Log信息時(shí),表示安裝成功
在本地全局目錄下新建倉(cāng)庫(kù):
cd ~/.ipfs export EDITOR=/usr/bin/vim ipfs config edit
執(zhí)行完ipfs config edit后會(huì)打開(kāi)一個(gè)ipfs節(jié)點(diǎn)配置文件,可以如下修改配置參數(shù):
{ "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 } }
每個(gè)節(jié)點(diǎn)都會(huì)存在一個(gè)唯一標(biāo)識(shí),查看節(jié)點(diǎn)ID方式如下:
ipfs id
ipfs daemon
出現(xiàn)了5001端口被占用的情況,這邊可以通過(guò)對(duì)節(jié)點(diǎn)配置文件的修改來(lái)解決,如下所示:
找到所有配置5001端口的地方
替換成5002端口
再次啟動(dòng)節(jié)點(diǎn),服務(wù)成功啟動(dòng).
為了方便后續(xù)前端的開(kāi)發(fā)和數(shù)據(jù)訪問(wèn),提前對(duì)跨域資源共享CORS進(jìn)行配置,ctrl-c 退出ipfs,然后按照下面的步驟進(jìn)行跨域配置:
ipfs config --json API.HTTPHeaders.Access-Control-Allow-Methods '["PUT", "GET", "POST", "OPTIONS"]' ipfs config --json API.HTTPHeaders.Access-Control-Allow-Origin '["*"]'
瀏覽器打開(kāi) http://localhost:5002/webui ,出現(xiàn)Web Console 圖形化控制臺(tái).
這里可以看到所有run在主網(wǎng)上的節(jié)點(diǎn)信息,和本地節(jié)點(diǎn)相關(guān)的配置數(shù)據(jù)。
利用 IPFS 構(gòu)建一個(gè)去中心化、不可篡改的分布式Wiki系統(tǒng)。
考慮到方便后期開(kāi)源和推廣,這邊我是托管在github上,大家可以選擇自己熟悉的代碼托管服務(wù),也可以克隆我的工程 -> ipfs-wiki-system
,在其基礎(chǔ)上進(jìn)行你的二次開(kāi)發(fā),有任何問(wèn)題,歡迎提交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
index.html //markdown模板渲染
navigation.md //導(dǎo)航markdown
index.md //首頁(yè)markdown
大家可以參考ipfs-wiki Demo,根據(jù)自己的需求,通過(guò)markdown自定義不同的wiki內(nèi)容和目錄。
記住文件根目錄的Hash值:QmV5ZVQxXURKPDcVDW8WjpLCiQYvNzg173XcB6rYFevoXm
ipfs daemon
https://ipfs.io/ipfs/QmV5ZVQxXURKPDcVDW8WjpLCiQYvNzg173XcB6rYFevoXm/#!index.md
由于ipfs的hash對(duì)應(yīng)著一個(gè)不可變的內(nèi)容,每次更新網(wǎng)站之后,website的hash都會(huì)變,舊的link不能訪問(wèn)到新的內(nèi)容。
ipfs提供了ipns來(lái)解決更新的問(wèn)題。
ipfs允許用戶使用一個(gè)私有密鑰來(lái)對(duì)哈希附加一個(gè)引用,使用一個(gè)公共密鑰哈希(簡(jiǎn)稱pubkeyhash)表示你的網(wǎng)站的最新版本。
具體操作是:
通過(guò)上述方式,就完成了website和一個(gè)固定的link的綁定: QmPS5NRXPCeAUtofKbW7c58Qm4PpM8mPEVJvaooE13LF78
ipfs name resolve QmPS5NRXPCeAUtofKbW7c58Qm4PpM8mPEVJvaooE13LF78 /ipfs/QmV5ZVQxXURKPDcVDW8WjpLCiQYvNzg173XcB6rYFevoXm
IPNS訪問(wèn)固定節(jié)點(diǎn)Hash:
https://ipfs.io/ipns/QmPS5NRXPCeAUtofKbW7c58Qm4PpM8mPEVJvaooE13LF78
驗(yàn)證成功,出現(xiàn)如下效果.
以之前發(fā)布到主網(wǎng)的節(jié)點(diǎn)為第一節(jié)點(diǎn),我們本地再新建一個(gè)節(jié)點(diǎn),用以模擬第二節(jié)點(diǎn)的身份,打開(kāi)Web Console:
在第二節(jié)點(diǎn)上,我們依然可以通過(guò)IPFS HASH查詢到第一節(jié)點(diǎn)主網(wǎng)上的 ipfs-wiki-system目錄文件數(shù)據(jù)
同時(shí),我們也能看到:控制臺(tái)顯示記錄了我們發(fā)布至主網(wǎng)數(shù)據(jù)的區(qū)塊節(jié)點(diǎn)數(shù)已經(jīng)擴(kuò)散至275個(gè)。
也就是說(shuō),來(lái)自另外全球其他274地方的個(gè)體,在自己的“記賬本”中記下了你之前發(fā)布的數(shù)據(jù),哪怕其中個(gè)別服務(wù)器宕機(jī)(天災(zāi)人禍,挖斷電纜,世界末日等等),只要有一個(gè)節(jié)點(diǎn)安好,你的數(shù)據(jù)都不會(huì)丟失,真正意義實(shí)現(xiàn)了去中心化的服務(wù)機(jī)制。
關(guān)于如何利用IPFS構(gòu)建去中心化分布式Wiki系統(tǒng)就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。