區塊鏈P2P網絡
閱讀大概需要10分鐘
前言
上兩篇文章中我們聊了共識機制,今天我們聊一下區塊鏈技術中的另外一個核心技術點:P2P網絡(Peer to peer networking)。首先澄清一點的是這裏講的P2P這個概念跟平時我們在互聯網金融圈提及的P2P概念不一樣,這裏聊的區塊鏈技術P2P是指點對點的對等網絡,它是區塊鏈系統技術中的重要組成部分,而並非是互聯網金融的網絡借貸P2P。從當前p2p技術應用領域來看,它的應用已經非常成熟,也非常廣泛,從文件共享到協助處理,從流媒體到點對點通信技術,像VoIP,BT,電驢 等等。
P2P網絡主要的特點:
去中心化
可擴展性
健壯性
高性價比
隱私保護
負載均衡
什麼是區塊鏈P2P網絡
區塊鏈P2P網絡是一個去中心化的點對點網絡,這意味着跟傳統網絡C/S結構模式不一樣,它是沒有服務端,客戶端的概念,它是由多個節點成員組成的網絡結構,每個節點都是安全的網絡成員,彼此節點之間處於對等的地位,相互節點之間共享資源,它既是資源的提供者(客戶端)也可以資源的接受者(服務端),節點之間的通信一般採用socket 編程方式進行通信。
P2P網絡結構是扁平化的拓撲結構,相互節點之間沒有層次之分,如圖示。
區塊鏈P2P網絡中的節點功能主要有:錢包交易功能、挖礦功能、區塊鏈數據庫功能、網絡路由功能。
錢包交易功能:發起轉賬交易、查看賬戶餘額、管理用戶錢包地址的公鑰、私鑰。
挖礦功能:將用戶的交易打包產生新的區塊,與其它挖礦節點具有竟爭性。
區塊鏈數據庫功能:存儲所有區塊交易數據信息,一個完整的區塊鏈數據庫容量是比較大,像比特幣來講它的Size 大於140G。
網絡路由功能:每個節點必須具備的,尋找附近節點的連接;比如比特幣網絡中使用硬編碼DNS-seed方式來做初始節點發現,以太坊採用Kademlia(Kad)算法實現節點間路由,定位連接。
區塊鏈P2P網絡的節點
全節點:全節點需要參與區塊的校驗,對交易進行確認,以及交易信息的廣播,因此全節點必須包含完整的區塊鏈數據庫副本,包括所有交易的數據信息,另外全節點也必須具備執行路由的操作,幫助節點與節點之間的連接發現,全節點越多就直接影響整個網絡交易的效率,因爲它們執行決策功能,決定了一個區塊和一筆交易的是否有有效性。
礦工節點: 礦工節點一般是運行在性能比較高的硬件上(上一篇文章有提到“PoW挖礦機的進化史”),目標是通過解決工作量證明(PoW)算法問題,與其它礦工節點搶奪記賬權。如果挖礦節點同時也存儲了完整的區塊鏈數據庫,這樣它屬於是全節點,這種節點也稱爲獨立礦工(Solo Miner)。另外有一部分礦工節點是由多個單獨節點聯合組成連接到礦池,參與集體挖礦的,這種節點叫礦池礦工(Pool Miner)。這種礦池礦工節點,一般是由一個內部礦池網絡搭建,中心節點是礦池服務器,然後由分散的礦工通過礦池內部協議連接到礦池服務器,然後再由礦池服務器作爲一個全節點方式與其它區塊鏈節點通過主網方式進行通信連接。
SPV(Simplified Payment Verification)節點:也叫輕節點,簡單支付驗證,這類節點它不會存儲完整的區塊鏈數據庫,只存儲其中一部分,而不會存儲所有交易數據,例如它只存儲區塊頭的Hash數據。SPV節點主要完成支付交易的校驗,不過它不是驗證所有的交易,而只是一個交易子集,例如,轉賬到某個指定地址的交易。一個SPV節點依賴於全節點來獲得數據,允許多個SPV節點連接到一個全節點。錢包應用就是採用SPV節點方式,個人不需要下載完整的區塊鏈數據庫,也可以完成交易驗證。
區塊鏈中P2P節點交易過程
-
通過中心節點創建區塊鏈數據結構。
-
中心節點創建一個創世錢包地址,並創建創世區塊,同時生成一個錢包地址數據庫表和一個區塊鏈數據庫表。
-
中心節點備份一個只包創世區塊的區塊鏈數據庫genesis.db。
-
啓動錢包節點連接到中心節點,並請求下載區塊鏈數據庫表。
-
啓動礦工節點連接到中心節點,並請求下載區塊鏈數據表。
-
錢包節點創建多個新的用戶錢包地址。
-
礦工節點創建礦工錢包地址。
-
用戶發起轉賬交易,由錢包節點確認一筆新交易發起。
-
礦工節點接收到新交易,並先將一筆新交易存放到內存池。
-
當礦工節點交易內存池達到一定數量,即發起打包一個新區塊確認,並廣播給全網節點。
-
中心節點校驗確認新區塊完成,修改區塊鏈數據表,並廣播給所有錢包節點。
-
錢包節點收到新區塊交易確認廣播後,與中心節點進行數據同步。
-
用戶基於錢包節點查詢交易是否成功。
節點交互邏輯
節點之間的交互必須遵循特定的協議指令,這些指令包含有消息頭和消息體,消息頭主要是包含發送的協議指令,消息體是傳遞的實際內容。
一般指令分爲兩大類,一類是請求指令,一類是數據交互指令。
交互指令-版本號Version
當節點連接上以後首先是通過交互【版本號】來實現握手的操作,握手完畢後建立長連接。如在比特幣系統上採用PING/PONG的消息協議,但在以太坊上將PING/PONG協議提前放在節點發現的邏輯上。
發送版本號格式比如: sendVersion(“主節點ip”, Version序列化結構值) 【12個字節長度 + 一個Version 序列化後的結構體數據】
版本號的代碼結構:
節點之間的版本號請求及數據同步
發送版本號
版本命令處理器
請求指令-inv
Inv 向其他節點展示當前節點擁有什麼塊和那些交易數據,但它沒有包含完整的區塊鏈和交易,只有哈希值。
Inv結構
sendInv(主節點發送所有區塊信息給錢包節點)
handleInv 接收處理器(錢包節點接收來自主節點的所有區塊信息)
請求指令-getData
用於某個塊或交易的請求。
Block 區塊同步
當接收到一個新塊時,把它添加到區塊鏈裏,如果還有更多的區塊需要下載,即繼續從上一個下載的塊的節點中繼續發出請求,直到把所有塊都下載完成後,纔對UTXO 集進行重新索引。
總結
本篇主要講述了區塊鏈技術中的核心技術點P2P網絡的概念及特點,同時也介紹了區塊鏈P2P網絡的幾大節點功能特徵,以及相互節點之間的消息交互邏輯實現。