Don't Trust, Verify
Jan 又帶來了一篇對區塊鏈節點的思考,文字簡潔,沒有數學公式,沒有計算機演算法,更沒有玄學,對於大家來說,這篇文章可以作為理解區塊鏈的試金石。
1
角色
我們都知道,區塊鏈網路中的節點有不同的角色。例如:
出塊節點
出塊節點負責打包交易,生產區塊。出塊節點在不同的地方有不同的名字,例如比特幣和以太坊中的礦工/礦池,Bitshares 的 Delegator,EOS 的 Producer, Cardarno 的 Stakeholder,Tendermint 和 Casper 中的 Validator,以及 CITA[1] 中的共識節點等等。在這些網路中,出塊節點的角色往往與全節點角色重合。最接近純粹出塊節點的例子應該是使用 getblocktemplate[2] 協議參與挖礦的比特幣礦機,他們不驗證區塊,但是擁有選擇交易打包和封裝完整區塊的權力。
出塊節點相對於其他節點往往需要付出更多的資源,包括算力(無論是用於 PoW 還是用於交易計算),磁碟,網路頻寬等等。這些資源要求擡高了出塊節點的門檻,容易造成出塊節點分佈的中心化。
全節點
區塊鏈中的區塊由兩個部分組成,區塊頭和區塊體。區塊頭中存放包括區塊見證(例如工作量證明或是投票)在內的元資料,區塊體中包含交易資料。區塊的驗證由此也可以分為兩部分,對區塊頭的驗證和對區塊體的驗證。對區塊頭的驗證主要是出塊權的檢查,例如區塊頭中包含的工作量證明是否有效;對區塊體的驗證主要是對交易有效性的檢查,確保區塊體中每一筆交易都是有效的。
全節點同步交易和區塊,對其進行驗證,並轉發有效的交易和區塊。為了能夠進行驗證,全節點必須有完整的當前世界狀態(例如 UTXO 集合)。由於全節點自行進行所有的驗證,因此不需要信任其他第三方。
通常情況下,出塊節點構造新區塊時需要引用前一個有效區塊,為了確認父塊的有效性必須對其進行驗證。此時出塊節點也做了全節點的事情,也是一種全節點。這種角色上的重合不是必然的,不影響後面的討論。
輕節點
輕節點與全節點不同:輕節點只同步和驗證區塊頭,不會同步和驗證區塊體以及其中的交易。因此,輕節點只能驗證區塊頭的有效性,無法驗證該區塊頭對應的區塊體中交易的有效性,只能相信構造這個區塊的出塊節點沒有打包無效的交易,並且相信將這個看起來合理的區塊頭髮送給自己的全節點對其進行了完整的檢查。輕節點是信任其它節點的節點。由於不同步交易,輕節點也無法得知交易處理之後的世界狀態,自然也無法驗證交易雙花或是世界狀態的變更。輕節點的驗證能力大大弱於全節點。
相信其它節點的好處是,輕節點的開銷很小:區塊頭的體積只佔區塊的很小一部分,很容易同步和儲存。因此輕節點可以執行在筆記本甚至手機等各種有限硬體環境中。
關係
這幾種角色之間的關係是一個非常有意思的問題,也是我和朋友們常常會討論的一個話題。在這樣的討論中,如果你拿出一支筆,請在場的任意一位朋友在白板上畫出他心目中的這三種節點組成的區塊鏈網路拓撲,大概率會得到類似這樣的圖:
圖 1. 朋友心中的節點拓撲 A
圖 2. 朋友心中的節點拓撲 B
在圖1中,出塊節點在最中心的位置,全節點圍繞出塊節點形成網路,輕節點連線在全節點上;在圖 2 中,出塊節點和全節點混合組成分散式網路位於中心,輕節點連線在全節點或者出塊節點上。哪一副圖更接近真實情況呢?
誰是守護者
人們通常認為出塊節點是守護者(Keeper)[3]一個區塊鏈網路的守護者,這樣的觀點不無道理。畢竟是出塊節點驗證交易,生產新的區塊,為使用者提供服務,這也是為什麼人們會把出塊節點/礦工畫在網路拓撲的中心。看上去,他們已經擁有了定義區塊鏈的權力。然而,如果我們將注意力再下降一層,從 P2P 網路的觀點來看,結果卻不是這樣。
一般的 P2P 網路,例如 BitTorrent 或是 Kad Network,目的在於更快的分享資料,這些網路中的節點並不關心自己轉發的資料包包含的是什麼樣的資料。這些節點不需要理解資料,只需要轉發資料,幫助資料從網路中的一點流動到另外一個點。它們只是資料的搬運工。
區塊鏈的 P2P 網路則不僅僅是資料的搬運工,還是資料的驗證者。P2P 網路由全節點構成,全節點在接收到新的交易或者新的區塊時,首先做的事情是驗證。這裡的驗證不僅僅是驗證資料本身的完整性(Integrity),還要驗證資料在業務邏輯中的有效性,例如這筆交易是否和賬本中已經有的交易衝突(雙花),或者這個新區塊是否包含了無效的交易。驗證交易是否雙花是業務層(賬本)的邏輯,不是網路層的邏輯。在區塊鏈的 P2P 網路中,節點不僅僅要轉發資料,還需要理解資料。資料轉發在區塊鏈節點中是一個提升到業務層的概念,而不只是一個網路層的概念。
這種設計所導致的結果就是,全節點組成的網路形成了一道“防火牆”,有效阻止了無效交易和區塊的傳播。出塊節點如果產生一個包含無效交易的區塊,這個區塊只能夠傳播到與其相鄰的全節點,無法穿透這些相鄰節點形成的防火牆傳播到更遠的地方,無法進入全節點網路維護的區塊鏈主分叉,無效交易也就無法被依賴全節點的輕節點或是錢包接受。
因此,出塊節點只是新的區塊的提議者,並不能讓全節點網路接受無效的區塊或是交易。挖出一個新的區塊並不是共識的結束,而是共識的開始。如果套用 Paxos 共識裡面的詞彙,出塊節點是 Proposer,全節點是 Acceptor。出塊節點持續打包交易,提交新的區塊,全節點驗證新的區塊提案,保證新區塊和其中交易的正確性。從這個角度看,作為驗證者的全節點更應該被稱作守護者(Keeper)。
按照這樣的理解,我們可以畫出這樣一個圖:
圖 3. 以全節點為屏障的節點拓撲
在圖 3 中,全節點網路位於中心,形成一個相互驗證的去中心化網路,一道安全屏障。輕節點連線這個網路中的全節點,使用全節點提供的服務。輕節點之間也可以形成自己的網路,但需要注意的是,輕節點網路沒有驗證功能,轉發在這裡更多的是網路層的概念。輕節點網路和全節點網路是不同的網路。出塊節點連線全節點提交新的區塊,出塊節點之間也可以形成自己的網路,以更好的提供服務,例如比特幣的 FIBRE 就是一個礦池之間的專用網路。
全節點網路對區塊鏈的安全至關重要。全節點數量越多,網路越可靠,加密經濟的基礎越穩固。全節點的執行成本和長期數量這兩個指標在未來的區塊鏈價值評估中應該會扮演越來越重要的作用。區塊鏈發展面臨的一個關鍵問題是,如何激勵全節點?這個問題看上去簡單,實際上會觸及一些非常深層次的(也許是不可調和的)矛盾,例如 data availability problem,這裡就不展開說了,以後有時間再寫文章討論。
2
案例分析
當我們理解了全節點的重要性,在腦海中建立了正確的網路拓撲後,就可以用這個框架來分析實際的問題了。這裡舉兩個例子。
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 問題,上述結論依然成立嗎?
圖4. 出塊節點專用網路(虛線)
EOS
EOS 的目標是百萬級的 TPS,為了實現這個目標,EOS 使用投票的方式由全網選出 21 個出塊節點(以及一定數量的候選節點),並要求出塊節點使用最好的硬體來支撐高效能。EOS 是否真的實現了百萬級 TPS 並不重要,重要的是,通過這種方式來提升效能不僅僅要求出塊節點付出不菲的成本,也要求全節點付出同樣的成本。然而與出塊節點不同,EOS 網路中的全節點並沒有得到網路的補貼,因此使用者很難有足夠的動力真的去支付幾乎與出塊節點相同的成本去執行一個全節點。在這種情況下,網路最終會演化成一個沒有全節點的結構:
圖5. 沒有全節點的網路
ByteMaster 對 21 個節點合理性的論證是,比特幣的算力也是集中在 <10 個礦池手中,21 個節點其實比 10 個礦池更加去中心化。我們通過比較網路拓撲應該容易看出,這個辯護並不成立,因為兩者的網路結構有很大區別,無法這樣直接比較。在 EOS 網路中,由於去中心化全節點網路的缺失,出塊節點缺乏監督,使用者只能完全相信出塊節點不會作惡。出塊和驗證的工作最終都集中到出塊節點的角色上,出塊節點既是運動員,又是裁判。而在比特幣的網路中,大量的全節點承擔了裁判的角色,礦池僅僅是運動員。使用者可以相信大量的全節點,不需要相信礦池。
需要指出的是,這個問題實際上不僅僅是 EOS 的問題,也是其他要在 Layer 1 擴容的專案會遇到的問題。
對 CKB 的啟示
出塊節點,全節點,輕節點形成了一個動態的網路,網路中的各類角色都可以自由進出(額,出塊節點實際上在很多區塊鏈中無法自由進出,這個也不展開了,以後有時間再寫文章討論…),這些角色形成的拓撲結構(例如節點比例、誰和誰連線等等等等)決定了網路的性質,包括效能、安全、中心化程度等各個方面。不同的設計可能會導致網路最終形成不同的結構,而這個最終結構所展現的性質有可能和設計初衷是相違背的。
全節點為了能夠不信任任何第三方,選擇自行驗證所有交易歷史。這種做法使全節點不僅僅滿足了自己的需求,也為網路安全貢獻了力量,體現出一種正外部性。區塊鏈需要這種安全保證,因此全節點對於一個去中心化的網路至關重要。如何內部化這種正外部性是一個需要重視的課題,在這個課題還沒有解決的情況下,我們能做的只能是保證全節點可以執行在一個較低的成本,以促進網路保有儘可能多的全節點。
對於希望成為未來加密經濟的基礎設施的 Nervos CKB 來說,必須在設計之初就把這些因素考慮在內,以理想中的網路結構為目標,並通過經濟激勵和其他機制設計來實現。這並不是一件容易的事情,還需要大量的研究和探索。
感謝
謝謝 Kevin Wang 和李家蓀老師參與討論並提供寶貴意見! <3<3<3
內容來源 : NervosNetwork
作者:Jan
以下是我們的社群介紹,歡迎各種合作、交流、學習:)