這篇“區(qū)塊鏈的P2P網(wǎng)絡是什么”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內(nèi)容,內(nèi)容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“區(qū)塊鏈的P2P網(wǎng)絡是什么”文章吧。
10年積累的成都網(wǎng)站設計、成都網(wǎng)站制作經(jīng)驗,可以快速應對客戶對網(wǎng)站的新想法和需求。提供各種問題對應的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡服務。我雖然不認識你,你也不認識我。但先網(wǎng)站制作后付款的網(wǎng)站建設流程,更有潁泉免費網(wǎng)站建設讓你可以放心的選擇與我們合作。
如果我們簡單來看 P2P 技術,它的應用領域已經(jīng)非常廣泛了,從流媒體到點對點通訊、從文件共享到協(xié)同處理,多種領域都有它的身影出現(xiàn)。
同樣的,P2P 的網(wǎng)絡協(xié)議也有很多,比較常見的有 BitTorrent、ED2K、Gnutella、Tor 等,也就是我們常說的 BT 工具和電驢。
比特幣、以太坊等眾多數(shù)字貨幣都實現(xiàn)了屬于自己的 P2P 網(wǎng)絡協(xié)議,但是這種模式并不同于以上討論的 P2P 網(wǎng)絡協(xié)議,所以本講重點主要是區(qū)塊鏈技術的 P2P 技術,也就是比特幣和以太坊的 P2P 網(wǎng)絡。
1. 網(wǎng)絡連接
除去少數(shù)支持 UDP 協(xié)議的區(qū)塊鏈項目外,絕大部分的區(qū)塊鏈項目所使用的底層網(wǎng)絡協(xié)議依然是 TCP/IP 協(xié)議。
所以從網(wǎng)絡協(xié)議的角度來看,區(qū)塊鏈其實是基于 TCP/IP 網(wǎng)絡協(xié)議的,這與 HTTP 協(xié)議、SMTP 協(xié)議是處在同一層,也就是應用層。
在“區(qū)塊鏈的常見誤區(qū)”這篇文章中,我們提到了“區(qū)塊鏈是否會顛覆互聯(lián)網(wǎng)”這一說法,如果要是認真分析的話,它顛覆的層面其實最多只到 HTTP 協(xié)議,不能再多了。
以 HTTP 協(xié)議為代表的、與服務端的交互模式在區(qū)塊鏈上被徹底打破了,變更為完全的點對點拓撲結構,這也是以太坊提出的 Web3.0 的由來。
比特幣的 P2P 網(wǎng)絡是一個非常復雜的結構,考慮到礦池內(nèi)部的挖礦交互協(xié)議與輕節(jié)點。我們僅僅討論全節(jié)點這種場景下的 P2P 網(wǎng)絡發(fā)現(xiàn)與路由。
比特幣的 P2P 網(wǎng)絡基于 TCP 構建,主網(wǎng)默認通信端口為 8333。
以太坊的 P2P 網(wǎng)絡則與比特幣不太相同,以太坊 P2P 網(wǎng)絡是一個完全加密的網(wǎng)絡,提供 UDP 和 TCP 兩種連接方式,主網(wǎng)默認 TCP 通信端口是 30303,推薦的 UDP 發(fā)現(xiàn)端口為 30301。
2. 拓撲結構
P2P 網(wǎng)絡拓撲結構有很多種,有些是中心化拓撲,有些是半中心化拓撲,有些是全分布式拓撲結構。
比特幣全節(jié)點組成的網(wǎng)絡是一種全分布式的拓撲結構,節(jié)點與節(jié)點之間的傳輸過程更接近“泛洪算法”,即:交易從某個節(jié)點產(chǎn)生,接著廣播到臨近節(jié)點,臨近節(jié)點一傳十十傳百,直至傳播到全網(wǎng)。
全節(jié)點與 SPV 簡化支付驗證客戶端之間的交互模式,更接近半中心化的拓撲結構,也就是 SPV 節(jié)點可以隨機選擇一個全節(jié)點進行連接,這個全節(jié)點會成為 SPV 節(jié)點的代理,幫助 SPV 節(jié)點廣播交易。
節(jié)點發(fā)現(xiàn)是任何區(qū)塊鏈節(jié)點接入?yún)^(qū)塊鏈 P2P 網(wǎng)絡的第一步。 這與你孤身一人去陌生地方旅游一樣,如果沒有地圖和導航,那你只能拽附近的人問路,“拽附近的人問路”的這個動作就可以理解成節(jié)點發(fā)現(xiàn)。
節(jié)點發(fā)現(xiàn)可分為初始節(jié)點發(fā)現(xiàn),和啟動后節(jié)點發(fā)現(xiàn)。初始節(jié)點發(fā)現(xiàn)就是說你的全節(jié)點是剛下載的,第一次運行,什么節(jié)點數(shù)據(jù)都沒有。啟動后發(fā)現(xiàn)表示正在運行的錢包已經(jīng)能跟隨網(wǎng)絡動態(tài)維護可用節(jié)點。
1. 初始節(jié)點發(fā)現(xiàn)
在比特幣網(wǎng)絡中,初始節(jié)點發(fā)現(xiàn)一共有兩種方式。
第一種叫做 DNS-seed,又稱 DNS 種子節(jié)點,DNS 就是中心化域名查詢服務,比特幣的社區(qū)維護者會維護一些域名。
比如 seed.bitcoin.sipa.be 這個域名就是由比特幣的核心開發(fā)者 Sipa 維護的,如果我們通過 nslookup 會發(fā)現(xiàn)大約二十多個 A 紀錄的 IPv4 主機地址。
我們通過 nc 命令嘗試連接域名下的某個主機的 8333 端口會發(fā)現(xiàn)連接成功,運行結構如下。
$ nc -nvv 149.202.179.35 8333found 0 associations found 1 connections: 1: flags=82outif 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!
第二種方式就是,代碼中硬編碼( hard-code )了一些地址,這些地址我們稱之為種子節(jié)點(seed-node),當所有的種子節(jié)點全部失效時,全節(jié)點會嘗試連接這些種子節(jié)點。
用在以太坊中,思路也大致相同,也是在代碼中硬編碼(hard-code)了一些種子節(jié)點做類似的工作。
2. 啟動后節(jié)點發(fā)現(xiàn)
在 Bitcoin 的網(wǎng)絡中,一個節(jié)點可以將自己維護的對等節(jié)點列表 (peer list) 發(fā)送給臨近節(jié)點,所以在初始節(jié)點發(fā)現(xiàn)之后,你的節(jié)點要做的第一件事情就是向對方要列表:“快把你的節(jié)點列表給我復制一份?!?/p>
所以在每次需要發(fā)送協(xié)議消息的時候,它會花費固定的時間嘗試和已存的節(jié)點列表中的節(jié)點建立鏈接,如果有任何一個節(jié)點在超時之前可以連接上,就不用去 DNS seed 獲取地址,一般來說,這種可能性很小,尤其是全節(jié)點數(shù)目非常多的情況下。
而在以太坊網(wǎng)絡中,也會維護類似的一個節(jié)點列表 (NodeTable),但是這個節(jié)點列表與比特幣的簡單維護不同,它采用了 P2P 網(wǎng)絡協(xié)議中一個成熟的算法,叫做 Kademlia 網(wǎng)絡,簡稱 KAD 網(wǎng)絡。
它使用了 DHT 來定位資源,全稱 Distributed Hash Table,中文名為分布式哈希表。KAD 網(wǎng)絡會維護一個路由表,用于快速定位目標節(jié)點。由于 KAD 網(wǎng)絡基于 UDP 通信協(xié)議,所以以太坊節(jié)點的節(jié)點發(fā)現(xiàn)是基于 UDP 的,如果找到節(jié)點以后,數(shù)據(jù)交互又會切換到 TCP 協(xié)議上。
3. 黑名單與長連接
公有區(qū)塊鏈面臨的網(wǎng)絡環(huán)境是非常開放的,任何人只要下載好錢包,打開運行就進入了這個 P2P 網(wǎng)絡,這也會帶來被攻擊的可能。
所以在比特幣的代碼中,會有一段去控制邏輯,你可以手動將你認為可疑的節(jié)點移除并加入禁止列表,同時去配置可信的節(jié)點。當然,以上并不屬于客戶端的標準協(xié)議的一部分,任何人都可以實現(xiàn)屬于自己的 P2P 網(wǎng)絡層。
以太坊上有針對賬戶進行的黑名單處理,但是這屬于業(yè)務層。我沒有找到很詳盡的資料,所以你有興趣的話,可以自己嘗試一下。
不過總的來說,黑名單我們也可以通過操作系統(tǒng)的防火墻去處理,這并不算一個特別棘手的問題。
前面我們說到了區(qū)塊鏈的 P2P 網(wǎng)絡結構是一種全分布式的拓撲結構。但是,如今我們的網(wǎng)絡環(huán)境是由局域網(wǎng)和互聯(lián)網(wǎng)組成的。也就是說,當你在局域網(wǎng)運行一個區(qū)塊鏈節(jié)點,在公網(wǎng)是發(fā)現(xiàn)不了的,公網(wǎng)上的節(jié)點只能被動接受連接,并不能主動發(fā)起連接。
如果這個局域網(wǎng)是你可以控制的,那么很好說,咱們只需要在 VPC 網(wǎng)絡中配置路由,將公網(wǎng) IP 和端口映射到局域網(wǎng)中你的 IP 和端口即可。
這個條件是非??量痰?,那么到底有沒有一種方案可以自行建立映射呢?答案是:有,就是 NAT 技術和 UPnP 協(xié)議。
NAT 技術非常常見,這里使用的是源 NAT,簡而言之就是替換 TCP 報文中的源地址并映射到內(nèi)網(wǎng)地址。
UPnP 是通用即插即用(Universal Plug and Play)的縮寫,它主要用于設備的智能互聯(lián)互通,所有在網(wǎng)絡上的設備馬上就能知道有新設備加入。
這些設備彼此之間能互相通信,更能直接使用或者控制它,一切都不需要人工設置。有關 UPnP 的資料比較多,這里就不贅述了,你可以自行搜索相關的信息。
比特幣和以太坊均使用了 UPnP 協(xié)議作為局域網(wǎng)穿透工具,只要局域網(wǎng)中的路由設備支持 NAT 網(wǎng)關功能、支持 UPnP 協(xié)議,即可將你的區(qū)塊鏈節(jié)點自動映射到公網(wǎng)上。
一旦節(jié)點建立連接以后,節(jié)點之間的交互是遵循一些特定的命令,這些命令寫在消息的頭部,消息體寫的則是消息內(nèi)容。
命令分為兩種,一種是請求命令,一種是數(shù)據(jù)交互命令。
節(jié)點連接完成要做的第一件事情叫做握手操作。這一點在比特幣和以太坊上的流程是差不多的,就是相互問候一下,提供一些簡要信息。
比如先交換一下版本號,看看是否兼容。只是以太坊為握手過程提供了對稱加密,而比特幣沒有。
握手完畢之后,無論交互什么信息,都是需要保持長連接的,在比特幣上有 PING/PONG 這兩種類型的消息,這很明顯就是用于保持節(jié)點之間長連接的心跳而設計的;而在以太坊的設計中,將 PING/PONG 協(xié)議移到了節(jié)點發(fā)現(xiàn)的過程中。
請求命令一般分為發(fā)起者請求,比如比特幣中的 getaddr 命令是為了獲取對方的可用節(jié)點列表,inv 命令則提供了數(shù)據(jù)傳輸,消息體中會包含一個數(shù)據(jù)向量。
我們說區(qū)塊鏈最重要的功能就是同步區(qū)塊鏈,而同步區(qū)塊恰巧是最考驗 P2P 網(wǎng)絡能力的。 區(qū)塊同步方式分為兩種,第一種叫做 HeaderFirst,它提供了區(qū)塊頭先同步,同步完成以后再從其他節(jié)點獲得區(qū)塊體。
第二種叫做 BlockFirst,這種區(qū)塊同步的方式比較簡單粗暴,就是從其他節(jié)點獲取區(qū)塊必須是完整的。第一種方案提供了較好的交互過程,減輕了網(wǎng)絡負擔。這兩種同步方式會直接體現(xiàn)在節(jié)點交互協(xié)議上,他們使用的命令邏輯完全不同。
以上就是關于“區(qū)塊鏈的P2P網(wǎng)絡是什么”這篇文章的內(nèi)容,相信大家都有了一定的了解,希望小編分享的內(nèi)容對大家有幫助,若想了解更多相關的知識內(nèi)容,請關注創(chuàng)新互聯(lián)行業(yè)資訊頻道。