《精通比特幣》第六章“比特幣網絡”解讀——區塊鏈基礎知識篇

前言:通過本章的學習,相信你對比特幣網絡、網絡中的節點分類、節點如何同步區塊、輕量級客戶端如何驗證交易的有效性以及Bloom過濾器的原理,會有系統的掌握。

《精通比特幣》第六章“比特幣網絡”解讀——區塊鏈基礎知識篇

建議閱讀時長:15分鐘左右

第1節 比特幣網絡

比特幣採用的是基於國際互聯網的P2P網絡架構。P2P是指接入到同一網絡中的各個節點之間彼此對等,共同提供服務,不存在任何中央化的服務。比特幣系統是一個點對點的數字現金系統。每個節點在對外提供服務的同時也使用網絡中其他節點所提供的服務。P2P網絡也因此具有可靠性、去中心化,以及開放性。

比特幣網絡是指各個節點按照比特幣P2P協議運行。當然擴展的比特幣網絡除了P2P協議之外,還有其他協議,比如Stratum協議、礦池挖礦協議以及其他連接比特幣系統相關組件的協議。

Stratum協議:是當前主流的礦機與礦池之間的通訊協議。非獨立礦工在挖礦時,可連接至礦池服務器,此時礦工不直接接入比特幣網絡,而是與礦池服務器之前通過Stratum協議通訊,由礦池服務器通過比特幣P2P協議連接到比特幣網絡。

第2節 比特幣網絡中的節點

儘管加入比特幣網絡的各個節點完全對等,但是根據各個節點的目的不同,各個節點所包含的功能可能不同。一個完整的比特幣節點(即全節點)包含4個功能:路由、完整區塊鏈數據庫、礦工、錢包服務。

《精通比特幣》第六章“比特幣網絡”解讀——區塊鏈基礎知識篇

節點功能

以下是這些功能的介紹:

路由:所有的比特幣節點都具有路由功能。具備路由功能的節點可以傳播驗證交易並轉發區塊信息,維持與對等節點的連接。

完整區塊鏈數據庫:存儲區塊鏈的完整數據,可以獨立的驗證所有交易而不需要依賴於其他節點。

礦工:具備礦工功能的節點,可以通過解決工作量算法證明難題,競爭創建新區塊的資格並獲取比特幣獎勵和交易手續費。

錢包:管理用戶私鑰,支持比特幣交易和查詢功能。

以上4個功能都包含的節點,稱為比特幣全節點,比如比特幣核心客戶端。根據目的的不同,有的節點只包含部分功能,常見的節點類型如下:

完整區塊鏈節點

:只包含完整區塊鏈數據庫和路由功能。這類節點通常用於搭建基於比特幣系統的應用服務,如交易所等。

獨立礦工節點:包含礦工、完整區塊鏈和路由功能。這類節點用於獨立的礦工挖礦,獨立礦工節點不需要藉助於礦池服務器的任務分配和校驗,因為具有完整的區塊鏈數據備份,可獨立的挖礦建立新區塊。

輕量(SPV)錢包節點:包含錢包和路由功能。輕量級錢包沒有完整的區塊鏈數據庫,無法獨立的完成交易驗證,需要藉由外部參照。

挖礦節點:包含礦工功能,挖礦節點不直接接入比特幣網絡,其先通過Stratum協議與礦池服務器通訊,由礦池服務器接入到比特幣網絡,


通過上面的介紹,我們對比特幣網絡以及網絡中的節點類型和分類有了大致的瞭解,下面主要講述實現過程,可幫助你瞭解其背後的運行機制。

第3節 新的節點如何接入比特幣網路

比特幣網絡中雖然沒有特殊的節點,但是新的節點在啟動時,為了接入比特幣網絡,參與比特幣系統的協作,需要連接到已知正運行的節點,由正運行的節點將新節點的信息廣播到其他節點,從而接入網絡。所以,新節點接入到比特幣網絡的關鍵在於需維護對等節點列表,以幫助其廣播交易、區塊等信息。

節點可通過以下方式獲取對接節點列表:

第1種方式:由於節點可以不斷的加入和離開,所以本地維護的節點列表最好是長期穩定運行的,這樣的節點稱為“種子節點”,在比特幣核心客戶端,提供了獲取種子節點的方法,客戶端可以設置自動獲取。當然,新節點不一定需要與種子節點建立連接,但是可以通過種子節點快速的發現網絡中的其他節點。這個是包含在節點間建立通訊時相互傳遞的信息中的。

第2種方式:新節點可以設置至少一個其他節點的IP地址,通過該IP地址的節點引薦並連接到某個節點。

第3種方式:新節點只指定固定節點的IP地址,此時節點只能連接到這些固定的IP地址對應的節點,不會自動發現並維護與對等節點之間的連接。

節點再次啟動時,不會與獲取到的所有節點地址都嘗試建立連接,它默認會與上次連接成功的節點建立連接,如果上次連接成功的節點沒有應答,節點可以使用種子節點進行重啟動,以獲取新的節點列表。

第4節 全節點如何同步區塊

全節點,即擁有全部交易信息的比特幣完整區塊鏈的節點。全節點可以獨立完成交易信息的驗證、可以通過比特幣網絡獲取包含交易信息的新區塊更新,並在驗證無誤後將此更新合併至本地的區塊鏈拷貝當中。截止2018年8月末,比特幣區塊鏈大小已超過190G,完全同步下來需要一個月左右的時間。

一個全節點連接到對等節點之後,第一件事就是構建完整的區塊鏈。同步過程如下:

1.新節點發送本地的版本信息,其中包含本地的區塊高度(即區塊數量);同時對等節點會將自身的版本信息返回給新節點。

2.當對等節點識別出新節點的頂端區塊高度小於自身的頂端區塊高度時,對等節點會將一批可供分享的500個區塊的區塊哈希值廣播出去。

3.新節點通過發送消息請求獲取區塊信息,當從對等節點讀取區塊來同步區塊鏈時,會將該區塊信息同步完成後,才會發送下一次區塊同步請求,以防止壓垮網絡。每一個區塊在被接收後,就會被添加到本地的區塊鏈中,這一過程詳見第7章的介紹。

第5節 簡易支付驗證(SPV)是如何驗證交易的

普通用戶使用比特幣完成支付、轉賬完成交易,通常在智能手機等終端完成,但受限於終端的空間和效率,需要在沒有完整區塊鏈的情況下運行,於是簡易支付驗證(SPV)客戶端應運而生。

SPV節點只需要下載區塊頭,而不需要下載每個區塊中的交易信息。完整區塊鏈通過掃描區塊鏈,可建立完整的UTXO(未花費交易輸出)數據庫,每一筆交易都可以從UTXO中完成校驗。而SPV節點,由於自身不存儲交易信息,其驗證時需要藉助於對等節點返回的信息來驗證交易。

用戶A在商家B消費支付,商家B是驗證支付有效(SPV驗證)的過程如下:

1.商家B只關心支付到自己比特幣的地址是否完成交易,可以通過設置Bloom過濾器,限制只接收包含自己比特幣地址的交易。(關於Bloom過濾器的原理,後文會詳細介紹)

2.一旦比特幣網絡中的其他節點檢測到某個交易符合SPV節點設置的Bloom過濾器的條件時,其他節點便會發送所檢測到區塊的消息,該消息中含有區塊頭和包含目標交易的Merkle路徑。關於Merkle路徑,可以理解為,在每個區塊中的所有交易,都通過兩兩哈希、層層遞歸,最終形成只含有一個Merkle根節點的樹形結構,所以只要知道了區塊頭、以及在樹形結構中的Merkle路徑,即可找到葉子節點中的對應交易。

3.驗證交易是否存在。SPV節點通過比對目標地址中該交易的哈希值、與對等節點返回的Merkle路徑中該交易的哈希值是否相等,若相等,則說明交易存在。但是交易存在,不代表有效,也有可能存在雙重支付的問題,即同一筆來源的比特幣支付2次,所以還需進行是否雙重支付驗證。

4.驗證是否為雙重支付。由於SPV節點本身會保存完整的區塊頭,在對等節點返回該交易所在的區塊之後,SPV節點通過查看這筆交易所在區塊之後的區塊個數,一旦大於等於6時,說明這筆交易被眾多節點達成共識,被篡改的可能行很低。

至此,簡易支付驗證完成。

所以,簡易支付驗證,最關鍵的地方在於向對等的全節點獲取包含該交易的區塊頭和Merkle路徑,從而驗證交易。但是,如果SPV節點請求查詢交易信息時,直接將目標地址提供給全節點的話,很容易將目標地址和所歸屬的錢包用戶相結合,從而暴露了用戶隱私。所以,在SPV節點查詢交易信息時,不會直接將目標地址發送至對等節點,而是將該目標地址對應的Bloom過濾器發送至對等節點,對等節點再將交易中的輸出值代入到過濾器中驗證,若驗證能匹配上,則將匹配出的交易對應區塊的區塊頭以及Merkle樹返回給請求節點。

第6節 Bloom過濾器原理說明

Bloom過濾器的實現是由一個可變長度的數組N(即包含N位二進制數組成的數組)和數量可變的M個哈希函數組成,其原理是將每個關鍵詞依次經過多個哈希函數計算後,將每個哈希函數計算的結果對應到二機制數組中,將數組中對應位置的值置為1。

SPV節點建立Bloom過濾器的過程:

1.首先SPV節點會初始化一個沒有關鍵詞的空白Bloom過濾器;

2.接下來SPV節點會建立一個包含錢包所有地址的地址列表,並創建每個地址對應的關鍵詞,即能匹配到對應地址的搜索模式。通常,這個能匹配的關鍵詞是一個向公鑰付款的哈希腳本,即對應交易輸出鎖定腳本中的公鑰哈希值;

3.SPV節點將關鍵詞添加到Bloom過濾器中。

第7節 總結

通過本章的學習,相信你對比特幣網絡、網絡中的節點分類、節點如何同步區塊、輕量級客戶端如何驗證交易的有效性以及Bloom過濾器的原理,會有系統的掌握。

如果對文中的表述有不明白的地方或者表述有誤,歡迎在留言區討論交流,一起精通比特幣。

本文首發於公號“Tina說”


分享到:


相關文章: