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