溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

區(qū)塊鏈的P2P網絡是什么

發(fā)布時間:2022-01-19 09:50:35 來源:億速云 閱讀:150 作者:iii 欄目:互聯網科技

這篇“區(qū)塊鏈的P2P網絡是什么”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“區(qū)塊鏈的P2P網絡是什么”文章吧。

1

P2P網絡

如果我們簡單來看 P2P 技術,它的應用領域已經非常廣泛了,從流媒體到點對點通訊、從文件共享到協同處理,多種領域都有它的身影出現。

同樣的,P2P 的網絡協議也有很多,比較常見的有 BitTorrent、ED2K、Gnutella、Tor 等,也就是我們常說的 BT 工具和電驢。

比特幣、以太坊等眾多數字貨幣都實現了屬于自己的 P2P 網絡協議,但是這種模式并不同于以上討論的 P2P 網絡協議,所以本講重點主要是區(qū)塊鏈技術的 P2P 技術,也就是比特幣和以太坊的 P2P 網絡。

2

網絡連接與拓撲結構

1. 網絡連接

除去少數支持 UDP 協議的區(qū)塊鏈項目外,絕大部分的區(qū)塊鏈項目所使用的底層網絡協議依然是 TCP/IP 協議。

所以從網絡協議的角度來看,區(qū)塊鏈其實是基于 TCP/IP 網絡協議的,這與 HTTP 協議、SMTP 協議是處在同一層,也就是應用層。

在“區(qū)塊鏈的常見誤區(qū)”這篇文章中,我們提到了“區(qū)塊鏈是否會顛覆互聯網”這一說法,如果要是認真分析的話,它顛覆的層面其實最多只到 HTTP 協議,不能再多了。

以 HTTP 協議為代表的、與服務端的交互模式在區(qū)塊鏈上被徹底打破了,變更為完全的點對點拓撲結構,這也是以太坊提出的 Web3.0 的由來。

比特幣的 P2P 網絡是一個非常復雜的結構,考慮到礦池內部的挖礦交互協議與輕節(jié)點。我們僅僅討論全節(jié)點這種場景下的 P2P 網絡發(fā)現與路由。

比特幣的 P2P 網絡基于 TCP 構建,主網默認通信端口為 8333。

以太坊的 P2P 網絡則與比特幣不太相同,以太坊 P2P 網絡是一個完全加密的網絡,提供 UDP 和 TCP 兩種連接方式,主網默認 TCP 通信端口是 30303,推薦的 UDP 發(fā)現端口為 30301。

2. 拓撲結構

P2P 網絡拓撲結構有很多種,有些是中心化拓撲,有些是半中心化拓撲,有些是全分布式拓撲結構。

比特幣全節(jié)點組成的網絡是一種全分布式的拓撲結構,節(jié)點與節(jié)點之間的傳輸過程更接近“泛洪算法”,即:交易從某個節(jié)點產生,接著廣播到臨近節(jié)點,臨近節(jié)點一傳十十傳百,直至傳播到全網。

區(qū)塊鏈的P2P網絡是什么

全節(jié)點與 SPV 簡化支付驗證客戶端之間的交互模式,更接近半中心化的拓撲結構,也就是 SPV 節(jié)點可以隨機選擇一個全節(jié)點進行連接,這個全節(jié)點會成為 SPV 節(jié)點的代理,幫助 SPV 節(jié)點廣播交易。

3

節(jié)點發(fā)現

節(jié)點發(fā)現是任何區(qū)塊鏈節(jié)點接入區(qū)塊鏈 P2P 網絡的第一步。 這與你孤身一人去陌生地方旅游一樣,如果沒有地圖和導航,那你只能拽附近的人問路,“拽附近的人問路”的這個動作就可以理解成節(jié)點發(fā)現。

節(jié)點發(fā)現可分為初始節(jié)點發(fā)現,和啟動后節(jié)點發(fā)現。初始節(jié)點發(fā)現就是說你的全節(jié)點是剛下載的,第一次運行,什么節(jié)點數據都沒有。啟動后發(fā)現表示正在運行的錢包已經能跟隨網絡動態(tài)維護可用節(jié)點。

1. 初始節(jié)點發(fā)現

在比特幣網絡中,初始節(jié)點發(fā)現一共有兩種方式。

第一種叫做 DNS-seed,又稱 DNS 種子節(jié)點,DNS 就是中心化域名查詢服務,比特幣的社區(qū)維護者會維護一些域名。

比如 seed.bitcoin.sipa.be 這個域名就是由比特幣的核心開發(fā)者 Sipa 維護的,如果我們通過 nslookup 會發(fā)現大約二十多個 A 紀錄的 IPv4 主機地址。

我們通過 nc 命令嘗試連接域名下的某個主機的 8333 端口會發(fā)現連接成功,運行結構如下。

$ nc -nvv 149.202.179.35 8333found 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!

第二種方式就是,代碼中硬編碼( hard-code )了一些地址,這些地址我們稱之為種子節(jié)點(seed-node),當所有的種子節(jié)點全部失效時,全節(jié)點會嘗試連接這些種子節(jié)點。

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

2. 啟動后節(jié)點發(fā)現

在 Bitcoin 的網絡中,一個節(jié)點可以將自己維護的對等節(jié)點列表 (peer list) 發(fā)送給臨近節(jié)點,所以在初始節(jié)點發(fā)現之后,你的節(jié)點要做的第一件事情就是向對方要列表:“快把你的節(jié)點列表給我復制一份。”

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

而在以太坊網絡中,也會維護類似的一個節(jié)點列表 (NodeTable),但是這個節(jié)點列表與比特幣的簡單維護不同,它采用了 P2P 網絡協議中一個成熟的算法,叫做 Kademlia 網絡,簡稱 KAD 網絡。

它使用了 DHT 來定位資源,全稱 Distributed Hash Table,中文名為分布式哈希表。KAD 網絡會維護一個路由表,用于快速定位目標節(jié)點。由于 KAD 網絡基于 UDP 通信協議,所以以太坊節(jié)點的節(jié)點發(fā)現是基于 UDP 的,如果找到節(jié)點以后,數據交互又會切換到 TCP 協議上。

3. 黑名單與長連接

公有區(qū)塊鏈面臨的網絡環(huán)境是非常開放的,任何人只要下載好錢包,打開運行就進入了這個 P2P 網絡,這也會帶來被攻擊的可能。

所以在比特幣的代碼中,會有一段去控制邏輯,你可以手動將你認為可疑的節(jié)點移除并加入禁止列表,同時去配置可信的節(jié)點。當然,以上并不屬于客戶端的標準協議的一部分,任何人都可以實現屬于自己的 P2P 網絡層。

以太坊上有針對賬戶進行的黑名單處理,但是這屬于業(yè)務層。我沒有找到很詳盡的資料,所以你有興趣的話,可以自己嘗試一下。

不過總的來說,黑名單我們也可以通過操作系統的防火墻去處理,這并不算一個特別棘手的問題。

4

局域網穿透

前面我們說到了區(qū)塊鏈的 P2P 網絡結構是一種全分布式的拓撲結構。但是,如今我們的網絡環(huán)境是由局域網和互聯網組成的。也就是說,當你在局域網運行一個區(qū)塊鏈節(jié)點,在公網是發(fā)現不了的,公網上的節(jié)點只能被動接受連接,并不能主動發(fā)起連接。

如果這個局域網是你可以控制的,那么很好說,咱們只需要在 VPC 網絡中配置路由,將公網 IP 和端口映射到局域網中你的 IP 和端口即可。

這個條件是非??量痰模敲吹降子袥]有一種方案可以自行建立映射呢?答案是:有,就是 NAT 技術和 UPnP 協議。

NAT 技術非常常見,這里使用的是源 NAT,簡而言之就是替換 TCP 報文中的源地址并映射到內網地址。

UPnP 是通用即插即用(Universal Plug and Play)的縮寫,它主要用于設備的智能互聯互通,所有在網絡上的設備馬上就能知道有新設備加入。

這些設備彼此之間能互相通信,更能直接使用或者控制它,一切都不需要人工設置。有關 UPnP 的資料比較多,這里就不贅述了,你可以自行搜索相關的信息。

比特幣和以太坊均使用了 UPnP 協議作為局域網穿透工具,只要局域網中的路由設備支持 NAT 網關功能、支持 UPnP 協議,即可將你的區(qū)塊鏈節(jié)點自動映射到公網上。

5

節(jié)點交互協議

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

命令分為兩種,一種是請求命令,一種是數據交互命令。

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

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

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

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

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

第二種叫做 BlockFirst,這種區(qū)塊同步的方式比較簡單粗暴,就是從其他節(jié)點獲取區(qū)塊必須是完整的。第一種方案提供了較好的交互過程,減輕了網絡負擔。這兩種同步方式會直接體現在節(jié)點交互協議上,他們使用的命令邏輯完全不同。

以上就是關于“區(qū)塊鏈的P2P網絡是什么”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業(yè)資訊頻道。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI