比特幣和以太坊的P2P網(wǎng)絡(luò)詳解(一)

1、P2P原理及協(xié)議概述

P2P 主要存在四種不同的網(wǎng)絡(luò)模型,也代表著 P2P 技術(shù)的四個發(fā)展階段:集中式躬翁、純分布式、混合式和結(jié)構(gòu)化模型澜公。不過需要指出的是姆另,這里所說的網(wǎng)絡(luò)模型主要是指路由查詢結(jié)構(gòu)喇肋,即不同節(jié)點之間如何建立連接通道坟乾,兩個節(jié)點之間一旦建立連接,具體傳輸什么數(shù)據(jù)則是兩個節(jié)點之間的事情了蝶防。

最簡單的路由方式就是集中式甚侣,即存在一個中心節(jié)點保存了其他所有節(jié)點的索引信息,索引信息一般包括節(jié)點 IP 地址间学、端口殷费、節(jié)點資源等。集中式路由的優(yōu)點就是結(jié)構(gòu)簡單低葫、實現(xiàn)容易详羡。但缺點也很明顯,由于中心節(jié)點需要存儲所有節(jié)點的路由信息嘿悬,當(dāng)節(jié)點規(guī)模擴展時实柠,就很容易出現(xiàn)性能瓶頸;而且也存在單點故障問題善涨。

image.png

那第二種路由結(jié)構(gòu)則是純分布式的,移除了中心節(jié)點,在 P2P 節(jié)點之間建立隨機網(wǎng)絡(luò)套么,就是在一個新加入節(jié)點和 P2P 網(wǎng)絡(luò)中的某個節(jié)點間隨機建立連接通道最蕾,從而形成一個隨機拓撲結(jié)構(gòu)。新節(jié)點加入該網(wǎng)絡(luò)的實現(xiàn)方法也有很多種源内,最簡單的就是隨機選擇一個已經(jīng)存在的節(jié)點并建立鄰居關(guān)系葡粒。像比特幣的話,則是使用 DNS 的方式來查詢其他節(jié)點膜钓,DNS 一般是硬編碼到代碼里的嗽交,這些 DNS 服務(wù)器就會提供比特幣節(jié)點的 IP 地址列表,從而新節(jié)點就可以找到其他節(jié)點建立連接通道呻此。新節(jié)點與鄰居節(jié)點建立連接后轮纫,還需要進行全網(wǎng)廣播,讓整個網(wǎng)絡(luò)知道該節(jié)點的存在焚鲜。全網(wǎng)廣播的方式就是掌唾,該節(jié)點首先向鄰居節(jié)點廣播放前,鄰居節(jié)點收到廣播消息后,再繼續(xù)向自己的鄰居節(jié)點廣播糯彬,以此類推凭语,從而廣播到整個網(wǎng)絡(luò)。這種廣播方法也稱為泛洪機制撩扒。純分布式結(jié)構(gòu)不存在集中式結(jié)構(gòu)的單點性能瓶頸問題和單點故障問題似扔,具有較好的可擴展性,但泛洪機制引入了新的問題搓谆,主要是可控性差的問題炒辉,包括兩個較大的問題,一是容易形成泛洪循環(huán)泉手,比如節(jié)點 A 發(fā)出的消息經(jīng)過節(jié)點 B 到 節(jié)點 C黔寇,節(jié)點 C 再廣播到節(jié)點 A,這就形成了一個循環(huán)斩萌;另一個棘手問題則是響應(yīng)消息風(fēng)暴問題缝裤,如果節(jié)點 A 想請求的資源被很多節(jié)點所擁有,那么在很短時間內(nèi)颊郎,會出現(xiàn)大量節(jié)點同時向節(jié)點 A 發(fā)送響應(yīng)消息憋飞,這就可能會讓節(jié)點 A 瞬間癱瘓。

image.png

再來看看第三種路由結(jié)構(gòu):混合式姆吭¢蛔觯混合式其實就是混合了集中式和分布式結(jié)構(gòu),如下圖所示猾编,網(wǎng)絡(luò)中存在多個超級節(jié)點組成分布式網(wǎng)絡(luò)瘤睹,而每個超級節(jié)點則有多個普通節(jié)點與它組成局部的集中式網(wǎng)絡(luò)。一個新的普通節(jié)點加入答倡,則先選擇一個超級節(jié)點進行通信轰传,該超級節(jié)點再推送其他超級節(jié)點列表給新加入節(jié)點,加入節(jié)點再根據(jù)列表中的超級節(jié)點狀態(tài)決定選擇哪個具體的超級節(jié)點作為父節(jié)點瘪撇。這種結(jié)構(gòu)的泛洪廣播就只是發(fā)生在超級節(jié)點之間获茬,就可以避免大規(guī)模泛洪存在的問題。在實際應(yīng)用中倔既,混合式結(jié)構(gòu)是相對靈活并且比較有效的組網(wǎng)架構(gòu)恕曲,實現(xiàn)難度也相對較小,因此目前較多系統(tǒng)基于混合式結(jié)構(gòu)進行開發(fā)實現(xiàn)渤涌。其實佩谣,比特幣網(wǎng)絡(luò)如今也是這種結(jié)構(gòu),后面再細說实蓬。

image.png

最后一種網(wǎng)絡(luò)則是結(jié)構(gòu)化 P2P 網(wǎng)絡(luò)茸俭,它也是一種分布式網(wǎng)絡(luò)結(jié)構(gòu)吊履,但與純分布式結(jié)構(gòu)不同。純分布式網(wǎng)絡(luò)就是一個隨機網(wǎng)絡(luò)调鬓,而結(jié)構(gòu)化網(wǎng)絡(luò)則將所有節(jié)點按照某種結(jié)構(gòu)進行有序組織艇炎,比如形成一個環(huán)狀網(wǎng)絡(luò)或樹狀網(wǎng)絡(luò)。而結(jié)構(gòu)化網(wǎng)絡(luò)的具體實現(xiàn)上腾窝,普遍都是基于 **DHT(Distributed Hash Table缀踪,分布式哈希表) **算法思想。DHT 只是提出一種網(wǎng)絡(luò)模型虹脯,并不涉及具體實現(xiàn)驴娃,主要想解決如何在分布式環(huán)境下快速而又準(zhǔn)確地路由、定位數(shù)據(jù)的問題归形。具體的實現(xiàn)方案有 Chord托慨、Pastry鼻由、CAN暇榴、Kademlia 等算法,其中 Kademlia 也是以太坊網(wǎng)絡(luò)的實現(xiàn)算法蕉世,很多常用的 P2P 應(yīng)用如 BitTorrent蔼紧、電驢等也是使用 Kademlia。因為篇幅有限狠轻,就不展開講這些算法的具體原理了奸例。目前,我們主要理解 DHT 的核心思想即可向楼。

在 P2P 網(wǎng)絡(luò)中查吊,可以抽象出兩種空間:資源空間和節(jié)點空間。資源空間就是所有節(jié)點保存的資源集合湖蜕,節(jié)點空間就是所有節(jié)點的集合逻卖。對所有資源和節(jié)點分別進行編號,如把資源名稱或內(nèi)容用 Hash 函數(shù)變成一個數(shù)值(這也是 DHT 常用的一種方法)昭抒,這樣评也,每個資源就有對應(yīng)的一個 ID,每個節(jié)點也有一個 ID灭返,資源 ID 和節(jié)點 ID 之間建立起一種映射關(guān)系盗迟,比如,將資源 n 的所有索引信息存放到節(jié)點 n 上熙含,那要搜索資源 n 時罚缕,只要找到節(jié)點 n 即可,從而就可以避免泛洪廣播怎静,能更快速而又準(zhǔn)確地路由和定位數(shù)據(jù)邮弹。當(dāng)然喂饥,在實際應(yīng)用中,資源 ID 和節(jié)點 ID 之間是無法做到一一對應(yīng)的肠鲫,但因為 ID 都是數(shù)字员帮,就存在大小關(guān)系或偏序關(guān)系等,基于這些關(guān)系就能建立兩者的映射關(guān)系导饲。這就是 DHT 的核心思想捞高。DHT 算法在資源編號和節(jié)點編號上就是使用了分布式哈希表,使得資源空間和節(jié)點空間的編號有唯一性渣锦、均勻分布式等較好的性質(zhì)硝岗,能夠適合結(jié)構(gòu)化分布式網(wǎng)絡(luò)的要求。

綜上袋毙,這就是 P2P 網(wǎng)絡(luò)的一點理論基礎(chǔ)型檀,不同的區(qū)塊鏈可能會使用不一樣的網(wǎng)絡(luò)模型,但基本原理是一樣的听盖。后面分別講解下最有代表性的兩個區(qū)塊鏈的網(wǎng)絡(luò):比特幣網(wǎng)絡(luò)和以太坊網(wǎng)絡(luò)胀溺。

2、比特幣和以太坊中的P2P網(wǎng)絡(luò)整體對比分析

2.1 通信協(xié)議層面

  • 比特幣的P2P網(wǎng)絡(luò)完全基于TCP構(gòu)建皆看,主網(wǎng)默認通信端口是8333仓坞。
  • 以太坊的P2P網(wǎng)絡(luò)是一個完全加密的網(wǎng)絡(luò),提供UDP和TCP兩種連接方式腰吟,主網(wǎng)默認TCP端口30303无埃,推薦UDP發(fā)現(xiàn)端口為30301.

2.2 初始節(jié)點發(fā)現(xiàn)

比特幣網(wǎng)絡(luò)中,初始節(jié)點發(fā)現(xiàn)有兩種方式:

  1. DNS-seed毛雇,又稱為DNS種子節(jié)點嫉称,比特幣的社區(qū)會維護一些域名,通過nslookup該域名可解析出數(shù)十個A記錄的主機IP灵疮。例如:

nc -nvv 149.202.179.35 8333
found 0 associations
found 1 connections:
1: flags=82<CONNECTED,PREFERRED>
outif en0
src 192.168.1.104 port 62125
dst 149.202.179.35 port 8333
rank info not available
TCP aux info available
Connection to 149.202.179.35 port 8333 [tcp/*] succeeded!

  1. 硬編碼一些seed-node织阅,當(dāng)所有的種子節(jié)點全失效時,全節(jié)點會嘗試連接這些種子節(jié)點始藕。

在以太坊中蒲稳,思路也大致相同,也是在代碼中硬編碼(hard-code)了一些種子節(jié)點做類似的工作伍派。

2.3 啟動后節(jié)點發(fā)現(xiàn)

在 Bitcoin 的網(wǎng)絡(luò)中江耀,一個節(jié)點可以將自己維護的對等節(jié)點列表 (peer list) 發(fā)送給臨近節(jié)點,所以在初始節(jié)點發(fā)現(xiàn)之后诉植,你的節(jié)點要做的第一件事情就是向?qū)Ψ揭斜恚骸翱彀涯愕墓?jié)點列表給我復(fù)制一份祥国。”

所以在每次需要發(fā)送協(xié)議消息的時候,它會花費固定的時間嘗試和已存的節(jié)點列表中的節(jié)點建立鏈接舌稀,如果有任何一個節(jié)點在超時之前可以連接上啊犬,就不用去 DNS seed 獲取地址,一般來說壁查,這種可能性很小觉至,尤其是全節(jié)點數(shù)目非常多的情況下。

而在以太坊網(wǎng)絡(luò)中睡腿,也會維護類似的一個節(jié)點列表 (NodeTable)语御,但是這個節(jié)點列表與比特幣的簡單維護不同,它采用了 P2P 網(wǎng)絡(luò)協(xié)議中一個成熟的算法席怪,叫做 Kademlia 網(wǎng)絡(luò)应闯,簡稱 KAD 網(wǎng)絡(luò)。

它使用了 DHT 來定位資源挂捻,全稱 Distributed Hash Table碉纺,中文名為分布式哈希表。KAD 網(wǎng)絡(luò)會維護一個路由表刻撒,用于快速定位目標(biāo)節(jié)點骨田。由于 KAD 網(wǎng)絡(luò)基于 UDP 通信協(xié)議,所以以太坊節(jié)點的節(jié)點發(fā)現(xiàn)是基于 UDP 的疫赎,如果找到節(jié)點以后盛撑,數(shù)據(jù)交互又會切換到 TCP 協(xié)議上。

2.4 NAT穿透

局域網(wǎng)中的主機IP與公網(wǎng)IP建立P2P連接的解決方案是做NAT穿透捧搞。
比特幣和以太坊均使用了 UPnP (Universal Plug and Play)協(xié)議作為局域網(wǎng)穿透工具,只要局域網(wǎng)中的路由設(shè)備支持 NAT 網(wǎng)關(guān)功能狮荔、支持 UPnP 協(xié)議胎撇,即可將你的區(qū)塊鏈節(jié)點自動映射到公網(wǎng)上。

UPnP 是通用即插即用(Universal Plug and Play)的縮寫殖氏,它主要用于設(shè)備的智能互聯(lián)互通晚树,所有在網(wǎng)絡(luò)上的設(shè)備馬上就能知道有新設(shè)備加入。

2.5 節(jié)點交互協(xié)議

一旦節(jié)點建立連接以后雅采,節(jié)點之間的交互是遵循一些特定的命令爵憎,這些命令寫在消息的頭部,消息體寫的則是消息內(nèi)容婚瓜。

命令分為兩種宝鼓,一種是請求命令,一種是數(shù)據(jù)交互命令巴刻。

節(jié)點連接完成要做的第一件事情叫做握手操作愚铡。這一點在比特幣和以太坊上的流程是差不多的,就是相互問候一下,提供一些簡要信息沥寥。

比如先交換一下版本號碍舍,看看是否兼容。只是以太坊為握手過程提供了對稱加密邑雅,而比特幣沒有片橡。

握手完畢之后,無論交互什么信息淮野,都是需要保持長連接的锻全,在比特幣上有 PING/PONG 這兩種類型的消息,這很明顯就是用于保持節(jié)點之間長連接的心跳而設(shè)計的录煤;而在以太坊的設(shè)計中鳄厌,將 PING/PONG 協(xié)議移到了節(jié)點發(fā)現(xiàn)的過程中。

請求命令一般分為發(fā)起者請求妈踊,比如比特幣中的 getaddr 命令是為了獲取對方的可用節(jié)點列表了嚎,inv 命令則提供了數(shù)據(jù)傳輸,消息體中會包含一個數(shù)據(jù)向量廊营。

我們說區(qū)塊鏈最重要的功能就是同步區(qū)塊鏈歪泳,而同步區(qū)塊恰巧是最考驗 P2P 網(wǎng)絡(luò)能力的。區(qū)塊同步方式分為兩種露筒,第一種叫做 HeaderFirst呐伞,它提供了區(qū)塊頭先同步,同步完成以后再從其他節(jié)點獲得區(qū)塊體慎式。

第二種叫做 BlockFirst伶氢,這種區(qū)塊同步的方式比較簡單粗暴,就是從其他節(jié)點獲取區(qū)塊必須是完整的瘪吏。第一種方案提供了較好的交互過程癣防,減輕了網(wǎng)絡(luò)負擔(dān)。這兩種同步方式會直接體現(xiàn)在節(jié)點交互協(xié)議上掌眠,他們使用的命令邏輯完全不同蕾盯。

一般 P2P 網(wǎng)絡(luò)技術(shù)要解決兩個主要問題,第一是資源定位蓝丙,第二是資源獲取级遭,這一篇文章也是主要圍繞這兩點展開,其中節(jié)點發(fā)現(xiàn)和局域網(wǎng)穿透是屬于資源定位問題渺尘,節(jié)點交互協(xié)議是屬于資源獲取問題挫鸽。

3、比特幣中的P2P網(wǎng)絡(luò)詳解

比特幣網(wǎng)絡(luò)

首先沧烈,比特幣網(wǎng)絡(luò)中的節(jié)點主要有四大功能:錢包掠兄、挖礦、區(qū)塊鏈數(shù)據(jù)庫、網(wǎng)絡(luò)路由蚂夕。每個節(jié)點都會具備路由功能迅诬,但其他功能不一定都具備,不同類型的節(jié)點可能只包含部分功能婿牍,一般只有比特幣核心(bitcoin core)節(jié)點才會包含所有四大功能侈贷。

image.png

所有節(jié)點都會參與校驗和廣播交易及區(qū)塊信息,且會發(fā)現(xiàn)和維持與其他節(jié)點的連接等脂。有些節(jié)點會包含完整的區(qū)塊鏈數(shù)據(jù)庫俏蛮,包括所有交易數(shù)據(jù),這種節(jié)點也稱為全節(jié)點(Full Node)上遥。另外一些節(jié)點只存儲了區(qū)塊鏈數(shù)據(jù)庫的一部分搏屑,一般只存儲區(qū)塊頭而不存儲交易數(shù)據(jù),它們會通過“簡化交易驗證(SPV)”的方式完成交易校驗粉楚,這樣的節(jié)點也稱為 SPV節(jié)點輕節(jié)點(Lightweight Node)辣恋。錢包一般是 PC 或手機客戶端的功能,用戶通過錢包查看自己的賬戶金額模软、管理錢包地址和私鑰伟骨、發(fā)起交易等。除了比特幣核心錢包是全節(jié)點之外燃异,大部分錢包都是輕節(jié)點携狭。挖礦節(jié)點則通過解決工作量證明(PoW)算法問題,與其他挖礦節(jié)點相互競爭創(chuàng)建新區(qū)塊回俐。有些挖礦節(jié)點同時也是全節(jié)點逛腿,即也存儲了完整的區(qū)塊鏈數(shù)據(jù)庫,這種節(jié)點一般都是獨立礦工(Solo Miner)鲫剿。還有一些挖礦節(jié)點不是獨立挖礦的鳄逾,而是和其他節(jié)點一起連接到礦池,參與集體挖礦灵莲,這種節(jié)點一般也稱為礦池礦工(Pool Miner)。這會形成一個局部的集中式礦池網(wǎng)絡(luò)殴俱,中心節(jié)點是一個礦池服務(wù)器政冻,其他挖礦節(jié)點全部連接到礦池服務(wù)器。礦池礦工和礦池服務(wù)器之間的通信也不是采用標(biāo)準(zhǔn)的比特幣協(xié)議线欲,而是使用礦池挖礦協(xié)議明场,而礦池服務(wù)器作為一個全節(jié)點再與其他比特幣節(jié)點使用主網(wǎng)絡(luò)的比特幣協(xié)議進行通信。

在整個比特幣網(wǎng)絡(luò)中李丰,除了不同節(jié)點間使用比特幣協(xié)議作為通信協(xié)議的主網(wǎng)絡(luò)苦锨,也存在很多擴展網(wǎng)絡(luò),包括上面提到的礦池網(wǎng)絡(luò)。不同的礦池網(wǎng)絡(luò)可能還會使用不同的礦池挖礦協(xié)議舟舒,目前主流的具體礦池協(xié)議應(yīng)該是 Stratum協(xié)議拉庶,該協(xié)議除了支持挖礦節(jié)點,也支持瘦客戶端錢包秃励。一個包含了比特幣協(xié)議主網(wǎng)絡(luò)各種節(jié)點和 Stratum 網(wǎng)絡(luò)氏仗,以及其他礦池網(wǎng)絡(luò)的擴展比特幣網(wǎng)絡(luò)大概如下圖所示:

image.png

另外,挖礦這塊還有特殊需求夺鲜。我們知道皆尔,礦工創(chuàng)建新區(qū)塊后,是需要廣播給全網(wǎng)所有節(jié)點的币励,當(dāng)全網(wǎng)都接受了該區(qū)塊慷蠕,給礦工的挖礦獎勵才算是有效的,這之后才好開始下一個區(qū)塊 Hash 的計算食呻。所以礦工必須最大限度縮短新區(qū)塊的廣播和下一個區(qū)塊 Hash 計算之間的時間流炕。如果礦工之間傳播區(qū)塊只采用上圖所示的比特幣協(xié)議網(wǎng)絡(luò),那無疑會有很高的網(wǎng)絡(luò)延遲搁进,所以浪感,需要一個專門的傳播網(wǎng)絡(luò)用來加快新區(qū)塊在礦工之間的同步傳播,這個專門網(wǎng)絡(luò)也叫比特幣傳播網(wǎng)絡(luò)或比特幣中繼網(wǎng)絡(luò)(Bitcoin Relay Network)饼问。

4影兽、以太坊中的P2P網(wǎng)絡(luò)詳解

以太坊網(wǎng)絡(luò)

和比特幣一樣,以太坊的節(jié)點也具備錢包莱革、挖礦峻堰、區(qū)塊鏈數(shù)據(jù)庫、網(wǎng)絡(luò)路由四大功能盅视,也同樣存在很多不同類型的節(jié)點捐名,除了主網(wǎng)絡(luò)之外也同樣存在很多擴展網(wǎng)絡(luò)。但與比特幣不同的闹击,比特幣主網(wǎng)的 P2P 網(wǎng)絡(luò)是無結(jié)構(gòu)的镶蹋,但以太坊的 P2P 網(wǎng)絡(luò)是有結(jié)構(gòu)的。前面我們已經(jīng)提過赏半,以太坊的 P2P 網(wǎng)絡(luò)主要采用了 Kademlia(簡稱 Kad) 算法實現(xiàn)贺归,Kad 是一種分布式哈希表(DHT)技術(shù),使用該技術(shù)断箫,可以實現(xiàn)在分布式環(huán)境下快速而又準(zhǔn)確地路由拂酣、定位數(shù)據(jù)的問題。所以仲义,下面主要講解下以太坊的 Kad 網(wǎng)絡(luò)婶熬。

在 Kad 網(wǎng)絡(luò)中剑勾,每個節(jié)點都具有一個唯一的節(jié)點 ID。另外赵颅,也會計算不同節(jié)點之間的距離虽另,但這個距離不是物理上的距離,而是邏輯上的距離性含,是通過對兩個節(jié)點 ID 進行 異或(符號為^) 計算得到的洲赵,即 A、B 兩節(jié)點之間的距離的計算公式為:D(A,B) = A.ID^B.ID商蕴。異或有一個重要的性質(zhì):假設(shè) a叠萍、b、c 為任意三個數(shù)绪商,如果 a^b = a^c 成立苛谷,那就一定 b = c。因此格郁,如果給定一個結(jié)點 a 和距離 L腹殿,那就有且僅有一個結(jié)點 b, 會使得 D(a,b) = L。通過這種方式例书,就能有效度量 Kad 網(wǎng)絡(luò)中不同節(jié)點之間的邏輯距離锣尉。

在異或距離度量的基礎(chǔ)上,Kad 還可以將整個網(wǎng)絡(luò)拓撲組織成如下圖所示的一個二叉前綴樹决采,每個 NodeID 會映射到二叉樹上的某個葉子自沧。

image.png

映射規(guī)則主要是:

  1. 將 NodeID 以二進制形式表示,然后從高到低對每一位的 0 或 1 依次處理树瞭;
  2. 二進制的第 n 位就對應(yīng)了二叉樹的第 n 層拇厢;
  3. 如果該位是 0,進入左子樹晒喷,是 1 則進入右子樹(反過來也可以)孝偎;
  4. 全部位都處理完后,這個 NodeID 就對應(yīng)了二叉樹上的某個葉子凉敲。

在這種二叉樹結(jié)構(gòu)下衣盾,對每個節(jié)點來說,離它越近的節(jié)點異或距離也是越近的爷抓。接著雨效,可以按照離自己異或距離的遠近,對整顆二叉樹進行拆分废赞。拆分規(guī)則是:從根節(jié)點開始,將不包括自己的那顆子樹拆分出來叮姑,然后在包含自己的子樹中唉地,把不包括自己的下一層子樹再拆分出來据悔,以此類推,直到只剩下自己耘沼。以上圖的 110 節(jié)點為例极颓,從根節(jié)點開始,由于 110 節(jié)點在右子樹群嗤,所以將左邊的整顆子樹拆分出來菠隆,即包含 000、001狂秘、010 這三個節(jié)點的這顆子樹骇径;接著,到第二層子樹者春,將不包含 110 節(jié)點的左子樹再拆分出來破衔,即包含 100 和 101 這兩個節(jié)點的子樹;最后钱烟,再將 111 拆分出來晰筛。這樣,就將 110 節(jié)點之外的整個二叉樹拆分出了三顆子樹拴袭。

完成子樹拆分后读第,只要知道每個子樹里面的其中一個節(jié)點,就可以進行遞歸路由實現(xiàn)整顆二叉樹所有節(jié)點的遍歷拥刻。但在實際場景下怜瞒,由于節(jié)點是動態(tài)變化的,所以一般不會只知道每個子樹的一個節(jié)點泰佳,而是需要知道多個節(jié)點盼砍。因此,Kad 中有一個叫 K-桶(K-bucket)的概念逝她,每個桶會記錄每顆子樹里所知道的多個節(jié)點浇坐。其實,一個K-桶就是一張路由表黔宛,如果拆分出來有 m 顆子樹近刘,那對應(yīng)節(jié)點就需要維護 m 個路由表。每個節(jié)點都會各自維護自己的 m 個 K-桶臀晃,每個 K-桶里記錄的節(jié)點信息一般會包括 NodeID觉渴、IP、Endpoint徽惋、與 Target 節(jié)點(即維護該 K-桶的節(jié)點)的異或距離等信息案淋。以太坊中,每個節(jié)點維護的 K-桶數(shù)量為 256 個险绘,這 256 個 K-桶會根據(jù)與 Target 節(jié)點的異或距離進行排序踢京,每個 K-桶保存的節(jié)點數(shù)量上限是 16誉碴。

在以太坊的 Kad 網(wǎng)絡(luò)中,節(jié)點之間的通信是基于 UDP 的瓣距,另外設(shè)置了 4 個主要的通信協(xié)議:

  1. Ping:用于探測一個節(jié)點是否在線
  2. Pong:用于響應(yīng) Ping 命令
  3. FindNode:用于查找與 Target 節(jié)點異或距離最近的其他節(jié)點
  4. Neighbours:用于響應(yīng) FindNode 命令黔帕,會返回一或多個節(jié)點

通過以上 4 個命令,就可以實現(xiàn)新節(jié)點的加入蹈丸、K-桶的刷新等機制成黄。具體的實現(xiàn)流程就不細講了,留給大伙自己去思考逻杖。

總結(jié)

不同結(jié)構(gòu)的 P2P 網(wǎng)絡(luò)奋岁,會有不同的優(yōu)點和缺點。比特幣網(wǎng)絡(luò)的結(jié)構(gòu)明顯容易理解弧腥,實現(xiàn)起來也相對容易得多厦取,而以太坊網(wǎng)絡(luò)引入了異或距離、二叉前綴樹管搪、K-桶等虾攻,結(jié)構(gòu)上復(fù)雜不少,但在節(jié)點路由上的確會比比特幣快很多更鲁。另外霎箍,不管是比特幣還是以太坊,其實都只是一種或多種協(xié)議的集合澡为,不同節(jié)點其實可以用不同的具體實現(xiàn)漂坏,比如,比特幣就有用 C++ 實現(xiàn)的 Bitcoin Core媒至,還有用 Java 實現(xiàn)的 BitcoinJ顶别;以太坊也有用 Go 語言實現(xiàn)的 go-ethereum,也有用 C++ 實現(xiàn)的 go-ethereum拒啰,還有用 Java 實現(xiàn)的 Ethereum(J)驯绎。

思考和實踐

在以太坊的 Kad 網(wǎng)絡(luò)中,新節(jié)點的加入和 K-桶的刷新流程是怎樣的谋旦?比特幣的新節(jié)點加入流程又是怎樣的剩失?哈希表有哪些實現(xiàn)方式?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末册着,一起剝皮案震驚了整個濱河市拴孤,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌甲捏,老刑警劉巖演熟,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異司顿,居然都是意外死亡绽媒,警方通過查閱死者的電腦和手機蚕冬,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來是辕,“玉大人,你說我怎么就攤上這事猎提』袢” “怎么了?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵锨苏,是天一觀的道長疙教。 經(jīng)常有香客問我,道長伞租,這世上最難降的妖魔是什么贞谓? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮葵诈,結(jié)果婚禮上裸弦,老公的妹妹穿的比我還像新娘。我一直安慰自己作喘,他們只是感情好理疙,可當(dāng)我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著泞坦,像睡著了一般窖贤。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上贰锁,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天赃梧,我揣著相機與錄音,去河邊找鬼豌熄。 笑死授嘀,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的房轿。 我是一名探鬼主播粤攒,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼囱持!你這毒婦竟也來了夯接?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤纷妆,失蹤者是張志新(化名)和其女友劉穎盔几,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體掩幢,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡逊拍,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年上鞠,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片芯丧。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡芍阎,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出缨恒,到底是詐尸還是另有隱情谴咸,我是刑警寧澤,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布骗露,位于F島的核電站岭佳,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏萧锉。R本人自食惡果不足惜珊随,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望柿隙。 院中可真熱鬧叶洞,春花似錦、人聲如沸优俘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽帆焕。三九已至惭婿,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間叶雹,已是汗流浹背财饥。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留折晦,地道東北人钥星。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像满着,于是被迫代替她去往敵國和親谦炒。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,577評論 2 353

推薦閱讀更多精彩內(nèi)容