《精通比特幣》學習:比特幣網絡「P2P網絡架構」

1、P2P網絡架構:

對於比特幣,大家聽得最多的就是去中心化,分佈式吧。簡單理解就是比特幣網絡是一個分佈式的網絡,網絡中的節點是點對點通訊,沒有中心節點,也即P2P網絡。對於有著多年技術背景和互聯網從業經驗的我來說,P2P協議對我來說並不陌生,在區塊鏈興起之前,P2P已經早就出來很多年了,只是一直不溫不火,知名度最高的應該早期的電驢和迅雷了吧,主要用在分佈式的文件共享和下載,相信很多人都用電驢下載過日本電影吧。P2P還有一個很重要的特點,單個文件也是可以分佈式存儲的,比如一部電影可能分散存在多個人的電腦裡面,下載的時候從多個電腦下載組合,原來電驢下載就有種子一說,種子越多下載速度反而越快。

比特幣網絡是按照比特幣P2P協議運行的一系列節點的集合,也稱為主網絡。比特幣網絡除了P2P協議之外,還包含其他協議,例如Stratum,用於挖礦以及比特幣錢包中。例如,Stratum服務器通過Stratum協議將所有Stratum挖礦節點連接至比特幣主網絡、並將Stratum協議橋接(bridge)至比特幣P2P協議之上。我們使用“擴展比特幣網絡(extended bitcoin network)”指代所有包含比特幣P2P協議、礦池挖礦協議、Stratum協議以及其他連接比特幣系統組件相關協議的整體網絡結構。

2、比特幣網絡節點:

在比特幣網絡中的每一個節點獨立平等,但是每一個節點並不是完全一樣,有不同的分工和作用。最完整的一個節點應該具有四大功能,如下圖:

《精通比特幣》學習:比特幣網絡“P2P網絡架構”

一個包含四個完整功能的比特幣網絡節點:錢包、礦工、完整區塊鏈、網絡路由節點

但不是每一個節點都需要這麼完備的功能,比如有些只挖礦,擴展比特幣網絡中最為常見的節點類型如下圖:

《精通比特幣》學習:比特幣網絡“P2P網絡架構”

3、比特幣主網絡和擴展比特幣網絡

比特幣主網絡由大約7000-10000個運行著不同版本比特幣核心客戶端(Bitcoin Core)的監聽節點、以及幾百個運行著各類比特幣P2P協議的應用(例如BitcoinJ、Libbitcoin、btcd等)的節點組成。主網絡上的節點有一小部分也是挖礦節點,但更多的挖礦節點是主網絡連接的礦池服務器通過礦池挖礦協議連接的挖礦節點。

簡單理解:主網絡節點通過運行P2P協議相互連接,主網絡節點主要是核心客戶端、全節點客戶端和輕量錢包等節點,另外礦池服務器和Stratum服務器通過P2P協議橋接連入主網絡,然後挖礦節點通過礦池挖礦協議接入礦池服務器,Stratum挖礦節點和輕量Stratum錢包節點通過Stratum協議接入Stratum服務器,從而構成了一個完整的比特幣網絡,也叫擴展比特幣網絡。

4、邊緣路由器

主網絡中有很多完整區塊鏈節點,這些節點有完整的區塊鏈和網絡路由節點,但是沒有錢包和挖礦功能,這些節點是網絡中的邊緣路由器。那這些節點既不能用來挖礦賺錢,也不能轉賬交易,那他們能做什麼呢?這些節點可都是大公司運行的節點,通過他們可以搭建其他服務,比如交易所、錢包、區塊瀏覽器、商家交易處理等,是不是看到交易所眼睛一亮?

《精通比特幣》學習:比特幣網絡“P2P網絡架構”

具有多種節點類型、網關及協議的擴展比特幣網絡

5、網絡發現節點:

當一個新的節點啟動後,他必須發現並連接網絡中至少一個已經存在的節點。由於節點可以隨時加入和離開,所以節點之間的通訊路徑是不可靠的,所以節點必須持續的進行兩項工作:一是在失去節點連接時發現新節點,二是在其他節點啟動時為其提供幫助。

6、補全缺失區塊:

一個完整區塊鏈節點連接到對等節點後,首先就是要構建完整的區塊鏈,新節點需要下載從創世區塊開始的數十萬區塊的全部內容。新節點和對等節點會交換信息,其中包含他們本地區塊鏈的頂端區塊哈希值,如果某個對等節點發現它接收到的哈希值不是頂端區塊,那麼他就會判斷出自身的本地區塊鏈比其他對等節點的區塊鏈更長。擁有更長區塊鏈的對等節點可以識別出哪些區塊是其他節點需要補充的,第一批可供分享的500個區塊通過使用INV消息把這些區塊哈希值傳播出去,缺少這些區塊的節點通過getdata消息來請求得到全區塊信息。新節點收到對等節點的inv消息後,通過分攤工作量的方式向與之相連的節點請求區塊,防止單一對等節點被批量請求壓垮。

7、簡易支付驗證 (SPV)節點

不是所有的節點都有能力儲存完整的區塊鏈賬簿,比如手機。對於這樣的設備節點,就通過SPV的方式讓他們不必儲存完整區塊鏈節點的情況下進行工作。SPV節點只下載區塊頭,不下載區塊中的交易信息,由此產生的區塊鏈大小隻有完整區塊鏈大小的1/1000。SPV節點驗證交易時需要依賴完整區塊鏈節點,完整區塊鏈節點就像有完整城市地圖的遊客,SPV節點就像只知道當前道路名字的遊客,儘管兩個遊戲都可以驗證當前所在街道是否存在,但沒有地圖的遊客不知道當前所在街道是不是唯一的,是不是就是想找的那條街道,所以他只能向足夠多的陌生人問路,並且希望別人不要搶劫他。SPV節點使用的是一條getheaders消息,而不是getblocks消息來獲得區塊頭。發出響應的對等節點將用一條headers消息發送多達2000個區塊頭。

8、SPV節點的隱私風險問題

由於SPV節點需要讀取特定交易從而選擇性地驗證交易,這樣就又產生了隱私風險。與全區塊鏈節點收集每一個區塊內的全部交易所不同的是,SPV節點對特定數據的請求可能無意中透露了錢包裡的地址信息。例如,監控網絡的第三方可以跟蹤某個SPV節點上的錢包所請求的全部交易信息,並且利用這些交易信息把比特幣地址和錢包的用戶關聯起來,從而損害了用戶的隱私。比特幣開發人員就添加了一個新功能:Bloom過濾器,用以解決SPV節點的隱私風險問題。Bloom過濾器通過一個採用概率而不是固定模式的過濾機制,允許SPV節點只接收交易信息的子集,同時不會精確洩露哪些是它們感興趣的地址。


分享到:


相關文章: