一 repo
1 什么是repo?
我們知道泛烙,ipfs啟動(dòng)之前需要先運(yùn)行ipfs init初始化藐唠,什么意思坊饶?就是生成該程序的配置信息和初始的數(shù)據(jù)庫(kù),就像一個(gè)商店要開(kāi)張迎業(yè)津函,先要把商店蓋好,貨物提前采購(gòu)好,那這些初始化的數(shù)據(jù)放置在哪里呢?位于每個(gè)用戶的家目錄下.ipfs目錄下展运,如下圖(我是以ec2-user用戶的身份登錄的):
[ec2-user@ip-172-31-23-215 ~]$ pwd
/home/ec2-user
[ec2-user@ip-172-31-23-215 ~]$ ls .ipfs
api?blocks? config?datastore? datastore_spec?keystore? repo.lock? version
那這些存儲(chǔ)配置信息和數(shù)據(jù)庫(kù)的目錄怒允,就叫repo( 全稱:repository ,倉(cāng)庫(kù))
2 repo的作用迷殿?
當(dāng)要向ipfs申請(qǐng)數(shù)據(jù)時(shí),ipfs先會(huì)去本地的repo目錄下去查找需要的數(shù)據(jù),repo目錄里的數(shù)據(jù)分兩部分,一部分是metadata(元數(shù)據(jù))一部分是block數(shù)據(jù)(真正的內(nèi)容)踊挠。metadata想像成是商店的賬本权谁,賬本上記錄了所有商店的產(chǎn)品清單(目錄),而block就是擺放在商店里的具體的內(nèi)容运嗜。
運(yùn)行ipfs repo stat命令,查看repo的狀態(tài):
[ec2-user@ip-172-31-23-215 ~]$ ipfs repo stat
NumObjects: 21
RepoSize: ? 1374684
StorageMax: 10000000000
RepoPath: ? /home/ec2-user/.ipfs
Version:??? fs-repo@6
我們嘗試向ipfs倉(cāng)庫(kù)里添加一個(gè)文件阱洪,倉(cāng)庫(kù)的狀態(tài)也相應(yīng)變化
[ec2-user@ip-172-31-23-215 ~]$ echo "ipfs" >foo
[ec2-user@ip-172-31-23-215 ~]$ ipfs add foo
added QmbXBAKDgbhE8HkGuEF4FuQQJej2mxqXtYSMsBPuJDqgjq foo
[ec2-user@ip-172-31-23-215 ~]$ ipfs repo stat
NumObjects: 25
RepoSize: ? 1387472
StorageMax: 10000000000
RepoPath: ? /home/ec2-user/.ipfs
Version:??? fs-repo@6
二 Bootstrap list
1 什么是bootstrap list?
如果ipfs只是通過(guò)自己的倉(cāng)庫(kù)查找數(shù)據(jù)蚌本,那就太狹隘了轴猎,ipfs還會(huì)根據(jù)bootstrap 列表,了解網(wǎng)絡(luò)上其他節(jié)點(diǎn)的對(duì)等體列表,如果自己的倉(cāng)庫(kù)里沒(méi)有需要的數(shù)據(jù)矛渴,就通過(guò)bootstrap列表筐赔,查到其它的節(jié)點(diǎn)是否有需要的數(shù)據(jù)。 IPFS自帶有默認(rèn)的受信任對(duì)等列表鳞绕。
[ec2-user@ip-172-31-23-215 ~]$ ipfs? bootstrap list
/ip4/178.62.158.247/tcp/4001/ipfs/QmSoLer265NRgSp2LA3dPaeykiS1J6DifTC88f5uVQKNAd
/ip4/34.219.173.48/tcp/4001/ipfs/QmbZWkAvsFbN6Mfj8d5AnBjELb6zi6NFnFZtaDubL7bhok
...
上面列出的行是默認(rèn)IPFS引導(dǎo)程序節(jié)點(diǎn)的地址 - 它們由IPFS開(kāi)發(fā)團(tuán)隊(duì)運(yùn)行冤竹。 列出的地址完全解析并以multiaddr格式指定,這使得每個(gè)協(xié)議都是明確的。 這樣票唆,您的節(jié)點(diǎn)就可以準(zhǔn)確知道到達(dá)引導(dǎo)節(jié)點(diǎn)的位置 - 該位置是明確的。 除非你明白這意味著什么,否則不要改變這個(gè)列表。 Bootstrapping是分布式系統(tǒng)中一個(gè)重要的安全故障點(diǎn):惡意引導(dǎo)對(duì)等方只能將您引入其他惡意對(duì)等方授滓。 建議保留IPFS開(kāi)發(fā)團(tuán)隊(duì)提供的默認(rèn)列表诚啃,或者 - 在設(shè)置專用網(wǎng)絡(luò)的情況下 - 保存您控制的節(jié)點(diǎn)列表。 不要將同行添加到您不信任的列表中。
2 實(shí)驗(yàn)
我為了更好理解ipfs的工作原理办斑,準(zhǔn)備了兩臺(tái)服務(wù)器A和B罪郊,分別安裝運(yùn)行了ipfs
在A服務(wù)器上:
[ec2-user@ip-172-31-23-215 ~]$ ipfs bootstrap rm --all ? ? ? ?刪除默認(rèn)的bootstrap list
removed /ip6/2a03:b0c0:0:1010::23:1001/tcp/4001/ipfs/QmSoLer265NRgSp2LA3dPaeykiS1J6DifTC88f5uVQKNAd
...
[ec2-user@ip-172-31-23-215 ~]$ ipfs bootstrap add /ip4/172.31.31.186/tcp/4001/ipfs/QmbZWkAvsFbN6Mfj8d5AnBjELb6zi6NFnFZtaDubL7bhok ? ?172.31.31.186是B服務(wù)器的IP ?最后面的ID是B服務(wù)器節(jié)點(diǎn)ID
added /ip4/172.31.31.186/tcp/4001/ipfs/QmbZWkAvsFbN6Mfj8d5AnBjELb6zi6NFnFZtaDubL7bhok
[ec2-user@ip-172-31-23-215 ~]$ ipfs bootstrap list?
/ip4/172.31.31.186/tcp/4001/ipfs/QmbZWkAvsFbN6Mfj8d5AnBjELb6zi6NFnFZtaDubL7bhok
在B服務(wù)器上操作同A橄维,省略
環(huán)境OK后,我做了一個(gè)測(cè)試實(shí)驗(yàn)店溢,最終驗(yàn)證一個(gè)結(jié)果遭贸,當(dāng)在A服務(wù)器的IPFS上上傳了文件后,在B服務(wù)器上是可以查找到了踏堡,同時(shí)B服務(wù)器會(huì)把查詢的結(jié)果保存到repo里腐魂,那這樣,當(dāng)A服務(wù)器宕機(jī)后,網(wǎng)絡(luò)上還是可以通過(guò)B獲取到數(shù)據(jù)绕辖。
三 Pinning
1 什么是Pinning?
ipfs有一個(gè)相當(dāng)積極的緩存機(jī)制,可以在對(duì)其執(zhí)行任何ipfs操作后很短時(shí)間內(nèi)將對(duì)象保留在本地,但這些對(duì)象可能會(huì)被定期垃圾清理。 為了防止垃圾收集簡(jiǎn)單地固定你關(guān)心的哈希刘绣,固定的方法就是Pinning
Pinning 是ipfs中非常重要的概念移斩。 ipfs試圖讓它感覺(jué)每個(gè)單獨(dú)的對(duì)象都是本地的, 固定是允許你告訴ipfs始終保持給定對(duì)象本地的機(jī)制。
2 實(shí)驗(yàn)
查看哪些數(shù)據(jù)被Pinning
[ec2-user@ip-172-31-23-215 ~]$ ipfs pin ls
QmUNLLsPACCz1vLxQVkXqqLX5R1X345qqfHbsf67hvA3Nn recursive
QmbXBAKDgbhE8HkGuEF4FuQQJej2mxqXtYSMsBPuJDqgjq recursive
QmejvEPop4D7YUadeGqYWmZxHhLc4JBUCzJJHWMzdcMe2y indirect
...
準(zhǔn)備文件
[ec2-user@ip-172-31-23-215 ~]$ echo "ipfs rocks" >rocks
[ec2-user@ip-172-31-23-215 ~]$ ipfs add rocks
added QmRTV3h1jLcACW4FRfdisokkQAk4E4qDhUzGpgdrd4JAFy rocks
[ec2-user@ip-172-31-23-215 ~]$ ipfs pin ls
QmUNLLsPACCz1vLxQVkXqqLX5R1X345qqfHbsf67hvA3Nn recursive
QmRTV3h1jLcACW4FRfdisokkQAk4E4qDhUzGpgdrd4JAFy recursive
...
IPFS默認(rèn)會(huì)把新上傳的文件做Pinning.
清除repo緩存长搀,但被pinning的文件不會(huì)被清除
[ec2-user@ip-172-31-23-215 ~]$ ipfs repo gc ? ?清楚repo緩存
removed Qmaum8B9RA4gxZQRxJxxzEBEJBVfgz2DCgJSq2mzRzzJiP
removed QmQTBtcd7QWY15DsKiaAgWhtEAC6MqFu4AhvtEU2P1tiwx
...
[ec2-user@ip-172-31-23-215 ~]$ ipfs pin ls
QmRTV3h1jLcACW4FRfdisokkQAk4E4qDhUzGpgdrd4JAFyrecursive
QmS4ustL54uo8FzR9455qaxZwuMiUhyvMcX9Ba8nUH4uVv recursive
...
[ec2-user@ip-172-31-23-215 ~]$ ipfs cat QmRTV3h1jLcACW4FRfdisokkQAk4E4qDhUzGpgdrd4JAFy
ipfs rocks內(nèi)容還可以查看到
刪除對(duì)該文件的Pinning?
[ec2-user@ip-172-31-23-215 ~]$ ipfs pin rm -r QmRTV3h1jLcACW4FRfdisokkQAk4E4qDhUzGpgdrd4JAFy
unpinned QmRTV3h1jLcACW4FRfdisokkQAk4E4qDhUzGpgdrd4JAFy
[ec2-user@ip-172-31-23-215 ~]$ ipfs repo gc
removed QmRTV3h1jLcACW4FRfdisokkQAk4E4qDhUzGpgdrd4JAFy ?該文件的緩存被清除
removed QmaBNU361QD9rA3rmhzTk8oCBd2aygyS9Cca3m81MReGJU
removed QmRY35rAQfSmerbh3JfMMUiecqytkVpnJC9B8tpEM9c3kk
四 工作原理
IPFS獲取數(shù)據(jù)的流程:
第一步:先查詢Pinning 如果沒(méi)有,則進(jìn)入第二步
第二步:查詢本地的repo ,如果沒(méi)有良蛮,則進(jìn)入第三步
第三步:根據(jù)bootstrap list 查尋其它節(jié)點(diǎn) ,如果沒(méi)有痴颊,就真的沒(méi)有
五 結(jié)論
IPFS就像一個(gè)強(qiáng)大的連接者瀑梗,手里有一個(gè)龐大的通信薄(bootstrap list)允蜈,只要網(wǎng)上有數(shù)據(jù)妓蛮,就能快速定位,緩存到自己的倉(cāng)庫(kù)(repo)里,并且對(duì)情有獨(dú)鐘的數(shù)據(jù)直接固定(pinning),永久鎖定夫否!霸氣驼鹅!