根據(jù)上一節(jié)的內(nèi)容,內(nèi)容提供者將自己存儲的內(nèi)容通過網(wǎng)絡(luò)層發(fā)出缸逃,內(nèi)容的接收者接收到數(shù)據(jù)之后厂抽,首先通過Engine的一個賬單系統(tǒng)筷凤,統(tǒng)計(jì)一下本節(jié)點(diǎn)與發(fā)送數(shù)據(jù)節(jié)點(diǎn)之間的數(shù)據(jù)交互統(tǒng)計(jì),然后查找一下Engine中緩存的WantList信息挪丢,如果還有其它節(jié)點(diǎn)也在請求本節(jié)點(diǎn)剛剛接收到的數(shù)據(jù)乾蓬,則將該數(shù)據(jù)放入peerRequestQueue中去慎恒,這樣本節(jié)點(diǎn)也會馬上成為內(nèi)容的提供者。
隨后本節(jié)點(diǎn)會將數(shù)據(jù)存儲在本地的存儲空間上死嗦,這樣既能夠?yàn)楸竟?jié)點(diǎn)的訪問者越除,再次訪問數(shù)據(jù)的時候提供數(shù)據(jù)緩存,也能夠成為其他節(jié)點(diǎn)的數(shù)據(jù)訪問者提供數(shù)據(jù)的存儲服務(wù)翼雀。
在數(shù)據(jù)交互層第一節(jié)中我們講到骡澈,訪問數(shù)據(jù)的節(jié)點(diǎn)會subscribe一些列的key锅纺,這些key是要查找的數(shù)據(jù)對應(yīng)的索引肋殴,因此當(dāng)我們接收到數(shù)據(jù)之后护锤,應(yīng)該對這些訂閱者廣播一下最新接收到的數(shù)據(jù)酿傍,步驟4就是publish這樣的消息到相關(guān)的頻道上。
當(dāng)以上操作完成后氯析,本節(jié)點(diǎn)檢查Want Manager隊(duì)列中的數(shù)據(jù)掩缓,如果接受到的數(shù)據(jù)被其他節(jié)點(diǎn)訪問遵岩,則會將數(shù)據(jù)提供給完了中的其它節(jié)點(diǎn)尘执,這是步驟5的工作內(nèi)容。本節(jié)點(diǎn)接收到數(shù)據(jù)之后表悬,會將Want Manager中關(guān)于該節(jié)點(diǎn)的請求從Want List中刪除丧靡,如果本節(jié)點(diǎn)是最初的數(shù)據(jù)請求發(fā)起者窘行,為了避免多個節(jié)點(diǎn)重復(fù)的發(fā)送同一份數(shù)據(jù)罐盔,并在網(wǎng)絡(luò)中傳播,在接受到數(shù)據(jù)之后應(yīng)該發(fā)起Cancel命令捏顺,通知其它節(jié)點(diǎn)不要再對本數(shù)據(jù)進(jìn)行全網(wǎng)查找幅骄。Cancel的邏輯與GetBlock相似拆座。有興趣的同學(xué)可以自己研究一下就提的代碼實(shí)現(xiàn)邏輯挪凑。
代碼路徑如下:
除了以上查找邏輯,數(shù)據(jù)交換層的Engine還有一個功能搞旭,就是根據(jù)本節(jié)點(diǎn)與其他節(jié)點(diǎn)的數(shù)據(jù)交換多少菇绵,來決定是否繼續(xù)為自己的鄰居節(jié)點(diǎn)提供服務(wù)咬最,如果一個節(jié)點(diǎn)接受的數(shù)據(jù)很多丹诀,貢獻(xiàn)的數(shù)據(jù)很少,那么它很可能被視為惡意節(jié)點(diǎn)铆遭,被大家加入Frozen賬號枚荣,我們上一節(jié)介紹PeerRequestQueue的時候提到過這個Map結(jié)構(gòu)。數(shù)據(jù)首發(fā)的邏輯關(guān)系如下圖衙伶。
第一個公式r表示發(fā)送的數(shù)據(jù)與接收的數(shù)據(jù)的比例關(guān)系。
第二個公式P表示繼續(xù)給對方節(jié)點(diǎn)發(fā)送數(shù)據(jù)的概率
如果我們對方節(jié)點(diǎn)發(fā)送了很多數(shù)據(jù)慌随,但是從對方接收的數(shù)據(jù)很少,那么r值會很大蹋艺,概率P就會變小黄刚,即,如果我們對對方貢獻(xiàn)的數(shù)據(jù)多涛救,接收的數(shù)據(jù)少州叠,那么我們會認(rèn)為對方有可能是攻擊節(jié)點(diǎn)凶赁∈蓿或者是惡意節(jié)點(diǎn)咏窿。反之我們應(yīng)該以更高的概率服務(wù)那些給我們提供更多服務(wù)的節(jié)點(diǎn)素征。不過這一些列的引擎設(shè)計(jì)對于Filecoin這樣的帶激勵的區(qū)塊鏈架構(gòu)方案沒有太多參考價值集嵌,因此本文沒有展開詳細(xì)的論述。在Filecoin的設(shè)計(jì)原則這御毅,只要提供代幣服務(wù)根欧,就可以享受更高的帶寬和存儲服務(wù),而服務(wù)的提供者為了獲取更多的代幣端蛆,會非常歡迎這樣的節(jié)點(diǎn)凤粗。
關(guān)于數(shù)據(jù)交換層,我們僅僅以GetBlocks這個比較有代表性的接口今豆,來講解整個的數(shù)據(jù)處理業(yè)務(wù)邏輯嫌拣,整個數(shù)據(jù)交換層需要解決的問題很多,難度也是最大的呆躲,在一個去中心化的存儲體系里面异逐,你很難有效的通知其他節(jié)點(diǎn),數(shù)據(jù)是否有效以及存儲的位置變化插掂,這將是IPFS面臨的一大挑戰(zhàn)灰瞻。