前言:透過本章的學習,相信你對比特幣網路、網路中的節點分類、節點如何同步區塊、輕量級客戶端如何驗證交易的有效性以及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說”