Don’t Trust, Verify

這篇文章試圖討論全節點對於區塊鏈的意義。

角色

我們都知道,區塊鏈網絡中的節點有不同的角色。例如:

出塊節點

出塊節點負責打包交易,生產區塊。出塊節點在不同的地方有不同的名字,例如比特幣和以太坊中的礦工/礦池,Bitshares的Delegator,EOS的Producer, Cardarno的Stakeholder,Tendermint和Casper中的Validator,以及CITA中的共識節點等等。 在這些網絡中,出塊節點的角色往往與全節點角色重合。最接近純粹出塊節點的例子應該是使用getblocktemplate協議參與挖礦的比特幣礦機,他們不驗證區塊,但是擁有選擇交易打包和封裝完整區塊的權力。

出塊節點相對於其他節點往往需要付出更多的資源,包括算力(無論是用於PoW還是用於交易計算),磁盤,網絡帶寬等等。這些資源要求擡高了出塊節點的門檻,容易造成出塊節點分佈的中心化。

全節點

區塊鏈中的區塊由兩個部分組成,區塊頭和區塊體。區塊頭中存放包括區塊見證(例如工作量證明或是投票)在內的元數據,區塊體中包含交易數據。區塊的驗證由此也可以分爲兩部分,對區塊頭的驗證和對區塊體的驗證。對區塊頭的驗證主要是出塊權的檢查,例如區塊頭中包含的工作量證明是否有效;對區塊體的驗證主要是對交易有效性的檢查,確保區塊體中每一筆交易都是有效的。

全節點同步交易和區塊,對其進行驗證,並轉發有效的交易和區塊。爲了能夠進行驗證,全節點必須有完整的當前世界狀態(例如UTXO集合)。由於全節點自行進行所有的驗證,因此不需要信任其他第三方。

通常情況下,出塊節點構造新區塊時需要引用前一個有效區塊,爲了確認父塊的有效性必須對其進行驗證。此時出塊節點也做了全節點的事情,也是一種全節點。這種角色上的重合不是必然的,不影響後面的討論。

輕節點

輕節點與全節點不同:輕節點只同步和驗證區塊頭,不會同步和驗證區塊體以及其中的交易。因此,輕節點只能驗證區塊頭的有效性,無法驗證該區塊頭對應的區塊體中交易的有效性,只能相信構造這個區塊的出塊節點沒有打包無效的交易,並且相信將這個看起來合理的區塊頭髮送給自己的全節點對其進行了完整的檢查。輕節點是信任其它節點的節點。由於不同步交易,輕節點也無法得知交易處理之後的世界狀態,自然也無法驗證交易雙花或是世界狀態的變更。輕節點的驗證能力大大弱於全節點。

相信其它節點的好處是,輕節點的開銷很小:區塊頭的體積只佔區塊的很小一部分,很容易同步和存儲。因此輕節點可以運行在筆記本甚至手機等各種有限硬件環境中。

關係

這幾種角色之間的關係是一個非常有意思的問題,也是我和朋友們常常會討論的一個話題。在這樣的討論中,如果你拿出一支筆,請在場的任意一位朋友在白板上畫出他心目中的這三種節點組成的區塊鏈網絡拓撲,大概率會得到類似這樣的圖:

clipboard.png

clipboard.png

圖1. 朋友心中的節點拓撲A12856753-e57be4f7b1204b84.jpg1240×960 44 KB
圖2. 朋友心中的節點拓撲B12856753-90c0b692bf524eaf.jpg1240×960 46.5 KB
在圖1中,出塊節點在最中心的位置,全節點圍繞出塊節點形成網絡,輕節點連接在全節點上;在圖2中,出塊節點和全節點混合組成分佈式網絡位於中心,輕節點連接在全節點或者出塊節點上。哪一副圖更接近真實情況呢?

誰是守護者

人們通常認爲出塊節點是守護者(Keeper)一個區塊鏈網絡的守護者,這樣的觀點不無道理。畢竟是出塊節點驗證交易,生產新的區塊,爲用戶提供服務,這也是爲什麼人們會把出塊節點/礦工畫在網絡拓撲的中心。看上去,他們已經擁有了定義區塊鏈的權力。然而,如果我們將注意力再下降一層,從P2P網絡的觀點來看,結果卻不是這樣。

一般的P2P網絡,例如BitTorrent或是Kad Network,目的在於更快的分享數據,這些網絡中的節點並不關心自己轉發的數據包包含的是什麼樣的數據。這些節點不需要理解數據,只需要轉發數據,幫助數據從網絡中的一點流動到另外一個點。它們只是數據的搬運工。

區塊鏈的P2P網絡則不僅僅是數據的搬運工,還是數據的驗證者。P2P網絡由全節點構成,全節點在接收到新的交易或者新的區塊時,首先做的事情是驗證。這裏的驗證不僅僅是驗證數據本身的完整性(Integrity),還要驗證數據在業務邏輯中的有效性,例如這筆交易是否和賬本中已經有的交易衝突(雙花),或者這個新區塊是否包含了無效的交易。驗證交易是否雙花是業務層(賬本)的邏輯,不是網絡層的邏輯。在區塊鏈的P2P網絡中,節點不僅僅要轉發數據,還需要理解數據。數據轉發在區塊鏈節點中是一個提升到業務層的概念,而不只是一個網絡層的概念。

這種設計所導致的結果就是,全節點組成的網絡形成了一道“防火牆”,有效阻止了無效交易和區塊的傳播。出塊節點如果產生一個包含無效交易的區塊,這個區塊只能夠傳播到與其相鄰的全節點,無法穿透這些相鄰節點形成的防火牆傳播到更遠的地方,無法進入全節點網絡維護的區塊鏈主分叉,無效交易也就無法被依賴全節點的輕節點或是錢包接受。

因此,出塊節點只是新的區塊的提議者,並不能讓全節點網絡接受無效的區塊或是交易。挖出一個新的區塊並不是共識的結束,而是共識的開始。如果套用Paxos共識裏面的詞彙,出塊節點是Proposer,全節點是Acceptor。出塊節點持續打包交易,提交新的區塊,全節點驗證新的區塊提案,保證新區塊和其中交易的正確性。從這個角度看,作爲驗證者的全節點更應該被稱作守護者(Keeper)

按照這樣的理解,我們可以畫出這樣一個圖:

clipboard.png

在圖3中,全節點網絡位於中心,形成一個相互驗證的去中心化網絡,一道安全屏障。輕節點連接這個網絡中的全節點,使用全節點提供的服務。輕節點之間也可以形成自己的網絡,但需要注意的是,輕節點網絡沒有驗證功能,轉發在這裏更多的是網絡層的概念。輕節點網絡和全節點網絡是不同的網絡。出塊節點連接全節點提交新的區塊,出塊節點之間也可以形成自己的網絡,以更好的提供服務,例如比特幣的FIBRE就是一個礦池之間的專用網絡。

全節點網絡對區塊鏈的安全至關重要。全節點數量越多,網絡越可靠,加密經濟的基礎越穩固。全節點的運行成本和長期數量這兩個指標在未來的區塊鏈價值評估中應該會扮演越來越重要的作用。區塊鏈發展面臨的一個關鍵問題是,如何激勵全節點?這個問題看上去簡單,實際上會觸及一些非常深層次的(也許是不可調和的)矛盾,例如data availability problem,這裏就不展開說了,以後有時間再寫文章討論。

案例分析

當我們理解了全節點的重要性,在腦海中建立了正確的網絡拓撲後,就可以用這個框架來分析實際的問題了。這裏舉兩個例子。

FIBRE

FIBRE是比特幣快速網絡中繼引擎(Fast Internet Bitcoin Relay Engine)的縮寫,是一個專門給礦工提供服務的區塊傳輸網絡。FIBRE在全球不同的位置部署了6個節點,相互之間通過高速網絡連接,使用UDP+ForwardErrorCorrection傳送數據,幾乎實現了無延遲的傳輸。在FIBRE註冊過的礦工可以連接到離自己最近的FIBRE節點,以最短的時間獲得新的區塊數據。FIBRE和比特幣P2P網絡傳輸協議的一系列優化使得比特幣的新區塊幾乎可以在瞬間被全世界的礦工接收,非常有效的降低了孤塊率,保證了網絡安全。

FIBRE是由Matt Corallo維護的一個需要註冊使用的網絡,因此是一箇中心化管理的系統。這也是FIBRE常爲人所詬病的地方。但是如果我們按照圖3的拓撲來分析,就會發現FIBRE的中心化對比特幣網絡並沒有負面影響:無論礦工是用中心化還是去中心化的網絡加速新區塊的傳播,這個行爲都不會影響全節點對新區塊的驗證。FIBRE也不是整個網絡的單點,如果FIBRE崩潰或者作惡,礦工隨時可以切換回比特幣自己的P2P網絡。

思考題:同樣的出塊節點間專用加速網絡,如果用於提升網絡吞吐量解決scalability問題,上述結論依然成立嗎?

clipboard.png

EOS

EOS的目標是百萬級的TPS,爲了實現這個目標,EOS使用投票的方式由全網選出21個出塊節點(以及一定數量的候選節點),並要求出塊節點使用最好的硬件來支撐高性能。EOS是否真的實現了百萬級TPS並不重要,重要的是,通過這種方式來提升性能不僅僅要求出塊節點付出不菲的成本,也要求全節點付出同樣的成本。然而與出塊節點不同,EOS網絡中的全節點並沒有得到網絡的補貼,因此用戶很難有足夠的動力真的去支付幾乎與出塊節點相同的成本去運行一個全節點。在這種情況下,網絡最終會演化成一個沒有全節點的結構:

clipboard.png

ByteMaster對21個節點合理性的論證是,比特幣的算力也是集中在<10個礦池手中,21個節點其實比10個礦池更加去中心化。我們通過比較網絡拓撲應該容易看出,這個辯護並不成立,因爲兩者的網絡結構有很大區別,無法這樣直接比較。在EOS網絡中,由於去中心化全節點網絡的缺失,出塊節點缺乏監督,用戶只能完全相信出塊節點不會作惡。出塊和驗證的工作最終都集中到出塊節點的角色上,出塊節點既是運動員,又是裁判。而在比特幣的網絡中,大量的全節點承擔了裁判的角色,礦池僅僅是運動員。用戶可以相信大量的全節點,不需要相信礦池。

需要指出的是,這個問題實際上不僅僅是EOS的問題,也是其他要在Layer 1擴容的項目會遇到的問題。

對CKB的啓示

出塊節點,全節點,輕節點形成了一個動態的網絡,網絡中的各類角色都可以自由進出(額,出塊節點實際上在很多區塊鏈中無法自由進出,這個也不展開了,以後有時間再寫文章討論…),這些角色形成的拓撲結構(例如節點比例、誰和誰連接等等等等)決定了網絡的性質,包括性能、安全、中心化程度等各個方面。不同的設計可能會導致網絡最終形成不同的結構,而這個最終結構所展現的性質有可能和設計初衷是相違背的。

全節點爲了能夠不信任任何第三方,選擇自行驗證所有交易歷史。這種做法使全節點不僅僅滿足了自己的需求,也爲網絡安全貢獻了力量,體現出一種正外部性。區塊鏈需要這種安全保證,因此全節點對於一個去中心化的網絡至關重要。如何內部化這種正外部性是一個需要重視的課題,在這個課題還沒有解決的情況下,我們能做的只能是保證全節點可以運行在一個較低的成本,以促進網絡保有儘可能多的全節點。

對於希望成爲未來加密經濟的基礎設施的Nervos CKB來說,必須在設計之初就把這些因素考慮在內,以理想中的網絡結構爲目標,並通過經濟激勵和其他機制設計來實現。這並不是一件容易的事情,還需要大量的研究和探索。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章