比特幣網路



比特幣網路作為一個點對點 (P2P) 系統執行,節點參與交易活動。這些節點負責驗證和傳播交易和區塊。其中,礦工是建立新區塊的專門節點。該網路包含各種型別的節點,主要分為兩類:完整節點簡單支付驗證 (SPV) 節點。

完整節點使用比特幣核心客戶端軟體,處理錢包功能、挖礦、完整區塊鏈儲存和網路路由。但是,並非比特幣網路中的每個節點都需要執行所有這些角色。SPV 節點或輕客戶端僅專注於錢包操作和網路路由。

識別比特幣網路

比特幣網路以其獨特的魔術值為特徵,用於表示訊息的源網路。下表列出了這些值:

Subsequent Table

一個完整的比特幣節點執行四個功能。分別是錢包、礦工、區塊鏈和網路路由。我們已經在前面的章節中討論了挖礦和區塊鏈。在這裡,我們從比特幣網路繼續之前的內容。

比特幣網路中的協議訊息

目前有幾種不同的協議訊息型別,隨著協議的發展,這種型別的數量可能會增加。以下是最常用的協議訊息及其描述的列表:

  • 版本 - 此初始訊息由節點發送到網路,指示其版本和區塊數量。遠端節點以相同的資訊進行響應,建立連線。
  • Verack - 此訊息確認版本訊息並接受連線請求。
  • Inv - 節點使用此訊息來宣佈它們知道哪些區塊和交易。
  • Getdata - 此訊息是對 inv 的響應,請求由其雜湊標識的特定區塊或交易。
  • Getblocks - 這將返回一個 inv 資料包,其中包含從最後一個已知雜湊開始或最多 500 個區塊的所有區塊的列表。
  • Getheaders - 此訊息請求指定範圍內的區塊頭。
  • Tx - 這用於在響應 getdata 協議訊息時傳輸交易。
  • Block - 此訊息在回覆 getdata 協議訊息時傳送區塊。
  • Headers - 此資料包可以作為對 getheaders 請求的響應返回多達 2,000 個區塊頭。
  • Getaddr - 傳送此訊息以請求有關已知對等節點的資訊。
  • Addr - 這提供了有關網路上節點的資訊,包括地址數量和格式為 IP 地址和埠號的地址列表。
  • Ping - 此訊息用於驗證 TCP/IP 網路連線的活動。
  • Pong - 此訊息是對 ping 的響應,確認網路連線正常。

比特幣網路中發生了什麼?

透過協議傳輸訊息的過程在比特幣網路中執行。這按時間順序發生,如下所示:

  • 在比特幣網路中,該過程從客戶端傳輸稱為版本訊息的協議訊息開始,該訊息包含多個欄位,例如版本、服務、時間戳、網路地址、隨機數和其他資訊。
  • 作為響應,遠端節點發送其自己的版本訊息,然後兩個節點之間交換verack訊息,確認連線已成功建立。
  • 隨後,交換getaddraddr訊息以識別客戶端尚不知道的對等節點。
  • 在此過程中,任一節點都可能傳送 ping 訊息以驗證連線的持續狀態。getaddr 和 addr 訊息型別在比特幣協議中指定。

此網路協議序列圖說明了兩個比特幣節點在初始連線階段的通訊。

Network Protocol Sequence Diagram

在給定的示例中,節點 A 位於左側,而節點 B 位於右側。節點 A 透過傳送包含版本號和當前時間戳的版本訊息到遠端對等節點節點 B 來啟動連線。然後,節點 B 以其自己的版本訊息進行回覆,其中也包含版本號和當前時間。

在此之後,節點 A 和節點 B 交換 verack 訊息,表示連線已成功建立。連線確認後,對等節點可以交換 getaddr 和 addr 訊息以發現網路中的其他對等節點。

此時,可以開始下載區塊的過程。如果節點已經同步了所有區塊,它將使用 inv 協議訊息偵聽新區塊。否則,它首先檢查對 inv 訊息的響應以及它是否擁有清單。如果有清單,它將使用 getdata 協議訊息請求區塊;如果沒有,它將透過 getblocks 訊息請求清單。

完整客戶端和 SPV 客戶端

比特幣網路節點可以以兩種主要模式執行:作為完整客戶端或作為輕量級SPV 客戶端。完整客戶端,也稱為胖客戶端或完整節點,下載整個區塊鏈,為驗證交易提供最高級別的安全性。

相反,SPV 客戶端允許使用者驗證支付,而無需下載完整的區塊鏈。這些 SPV 節點僅維護最長有效區塊鏈的區塊頭。透過檢查 Merkle 分支來實現驗證,該分支將交易連線到記錄它們的原始區塊。這種方法可能有些不切實際,需要更有效的解決方案,這透過BIP37引入。

布隆過濾器

布隆過濾器是一種專門的資料結構,特別是具有索引位置的位向量,旨在機率性地評估元素的成員資格。它允許進行可能產生誤報但保證不會產生漏報的機率查詢。這意味著,雖然過濾器可能會錯誤地指示某個元素是測試集的一部分,但它永遠不會錯誤地聲稱現有元素不存在。本質上,可能會發生誤報,但漏報是不可能的。

要將元素合併到布隆過濾器中,會對其進行多次雜湊,並根據結果索引將位向量中的相應位設定為 1。要驗證元素的存在,會應用相同的雜湊函式,並檢查位向量中的位是否都設定為 1。

布隆過濾器主要由簡單支付驗證 (SPV) 客戶端用於請求特定交易和相關的Merkle 塊

Merkle 塊作為區塊的緊湊表示,包含區塊頭、幾個雜湊、一個 1 位標誌列表和交易計數。此資料可用於構建Merkle 樹。過濾器經過定製,僅匹配 SPV 客戶端已請求的那些交易和區塊。在交換版本訊息並在對等節點之間建立連線後,節點可以根據其特定需求配置過濾器。

廣告