這篇文章試圖討論全節點對於區塊鏈的意義。安全
咱們都知道,區塊鏈網絡中的節點有不一樣的角色。例如:網絡
出塊節點負責打包交易,生產區塊。出塊節點在不一樣的地方有不一樣的名字,例如比特幣和以太坊中的礦工/礦池,Bitshares的Delegator,EOS的Producer, Cardarno的Stakeholder,Tendermint和Casper中的Validator,以及CITA中的共識節點等等。 在這些網絡中,出塊節點的角色每每與全節點角色重合。最接近純粹出塊節點的例子應該是使用getblocktemplate協議參與挖礦的比特幣礦機,他們不驗證區塊,可是擁有選擇交易打包和封裝完整區塊的權力。框架
出塊節點相對於其餘節點每每須要付出更多的資源,包括算力(不管是用於PoW仍是用於交易計算),磁盤,網絡帶寬等等。這些資源要求擡高了出塊節點的門檻,容易形成出塊節點分佈的中心化。分佈式
區塊鏈中的區塊由兩個部分組成,區塊頭和區塊體。區塊頭中存放包括區塊見證(例如工做量證實或是投票)在內的元數據,區塊體中包含交易數據。區塊的驗證由此也能夠分爲兩部分,對區塊頭的驗證和對區塊體的驗證。對區塊頭的驗證主要是出塊權的檢查,例如區塊頭中包含的工做量證實是否有效;對區塊體的驗證主要是對交易有效性的檢查,確保區塊體中每一筆交易都是有效的。性能
全節點同步交易和區塊,對其進行驗證,並轉發有效的交易和區塊。爲了可以進行驗證,全節點必須有完整的當前世界狀態(例如UTXO集合)。因爲全節點自行進行全部的驗證,所以不須要信任其餘第三方。區塊鏈
一般狀況下,出塊節點構造新區塊時須要引用前一個有效區塊,爲了確認父塊的有效性必須對其進行驗證。此時出塊節點也作了全節點的事情,也是一種全節點。這種角色上的重合不是必然的,不影響後面的討論。優化
輕節點與全節點不一樣:輕節點只同步和驗證區塊頭,不會同步和驗證區塊體以及其中的交易。所以,輕節點只能驗證區塊頭的有效性,沒法驗證該區塊頭對應的區塊體中交易的有效性,只能相信構造這個區塊的出塊節點沒有打包無效的交易,而且相信將這個看起來合理的區塊頭髮送給本身的全節點對其進行了完整的檢查。輕節點是信任其它節點的節點。因爲不一樣步交易,輕節點也沒法得知交易處理以後的世界狀態,天然也沒法驗證交易雙花或是世界狀態的變動。輕節點的驗證能力大大弱於全節點。網絡傳輸協議
相信其它節點的好處是,輕節點的開銷很小:區塊頭的體積只佔區塊的很小一部分,很容易同步和存儲。所以輕節點能夠運行在筆記本甚至手機等各類有限硬件環境中。加密
這幾種角色之間的關係是一個很是有意思的問題,也是我和朋友們經常會討論的一個話題。在這樣的討論中,若是你拿出一支筆,請在場的任意一位朋友在白板上畫出他心目中的這三種節點組成的區塊鏈網絡拓撲,大機率會獲得相似這樣的圖:spa
圖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)。
按照這樣的理解,咱們能夠畫出這樣一個圖:
在圖3中,全節點網絡位於中心,造成一個相互驗證的去中心化網絡,一道安全屏障。輕節點鏈接這個網絡中的全節點,使用全節點提供的服務。輕節點之間也能夠造成本身的網絡,但須要注意的是,輕節點網絡沒有驗證功能,轉發在這裏更多的是網絡層的概念。輕節點網絡和全節點網絡是不一樣的網絡。出塊節點鏈接全節點提交新的區塊,出塊節點之間也能夠造成本身的網絡,以更好的提供服務,例如比特幣的FIBRE就是一個礦池之間的專用網絡。
全節點網絡對區塊鏈的安全相當重要。全節點數量越多,網絡越可靠,加密經濟的基礎越穩固。全節點的運行成本和長期數量這兩個指標在將來的區塊鏈價值評估中應該會扮演愈來愈重要的做用。區塊鏈發展面臨的一個關鍵問題是,如何激勵全節點?這個問題看上去簡單,實際上會觸及一些很是深層次的(也許是不可調和的)矛盾,例如data availability problem,這裏就不展開說了,之後有時間再寫文章討論。
當咱們理解了全節點的重要性,在腦海中創建了正確的網絡拓撲後,就能夠用這個框架來分析實際的問題了。這裏舉兩個例子。
FIBRE是比特幣快速網絡中繼引擎(Fast Internet Bitcoin Relay Engine)的縮寫,是一個專門給礦工提供服務的區塊傳輸網絡。FIBRE在全球不一樣的位置部署了6個節點,相互之間經過高速網絡鏈接,使用UDP+ForwardErrorCorrection傳送數據,幾乎實現了無延遲的傳輸。在FIBRE註冊過的礦工能夠鏈接到離本身最近的FIBRE節點,以最短的時間得到新的區塊數據。FIBRE和比特幣P2P網絡傳輸協議的一系列優化使得比特幣的新區塊幾乎能夠在瞬間被全世界的礦工接收,很是有效的下降了孤塊率,保證了網絡安全。
FIBRE是由Matt Corallo維護的一個須要註冊使用的網絡,所以是一箇中心化管理的系統。這也是FIBRE常爲人所詬病的地方。可是若是咱們按照圖3的拓撲來分析,就會發現FIBRE的中心化對比特幣網絡並無負面影響:不管礦工是用中心化仍是去中心化的網絡加速新區塊的傳播,這個行爲都不會影響全節點對新區塊的驗證。FIBRE也不是整個網絡的單點,若是FIBRE崩潰或者做惡,礦工隨時能夠切換回比特幣本身的P2P網絡。
思考題:一樣的出塊節點間專用加速網絡,若是用於提高網絡吞吐量解決scalability問題,上述結論依然成立嗎?
EOS的目標是百萬級的TPS,爲了實現這個目標,EOS使用投票的方式由全網選出21個出塊節點(以及必定數量的候選節點),並要求出塊節點使用最好的硬件來支撐高性能。EOS是否真的實現了百萬級TPS並不重要,重要的是,經過這種方式來提高性能不只僅要求出塊節點付出不菲的成本,也要求全節點付出一樣的成本。然而與出塊節點不一樣,EOS網絡中的全節點並無獲得網絡的補貼,所以用戶很難有足夠的動力真的去支付幾乎與出塊節點相同的成本去運行一個全節點。在這種狀況下,網絡最終會演化成一個沒有全節點的結構:
ByteMaster對21個節點合理性的論證是,比特幣的算力也是集中在<10個礦池手中,21個節點其實比10個礦池更加去中心化。咱們經過比較網絡拓撲應該容易看出,這個辯護並不成立,由於二者的網絡結構有很大區別,沒法這樣直接比較。在EOS網絡中,因爲去中心化全節點網絡的缺失,出塊節點缺少監督,用戶只能徹底相信出塊節點不會做惡。出塊和驗證的工做最終都集中到出塊節點的角色上,出塊節點既是運動員,又是裁判。而在比特幣的網絡中,大量的全節點承擔了裁判的角色,礦池僅僅是運動員。用戶能夠相信大量的全節點,不須要相信礦池。
須要指出的是,這個問題實際上不只僅是EOS的問題,也是其餘要在Layer 1擴容的項目會遇到的問題。
出塊節點,全節點,輕節點造成了一個動態的網絡,網絡中的各種角色均可以自由進出(額,出塊節點實際上在不少區塊鏈中沒法自由進出,這個也不展開了,之後有時間再寫文章討論…),這些角色造成的拓撲結構(例如節點比例、誰和誰鏈接等等等等)決定了網絡的性質,包括性能、安全、中心化程度等各個方面。不一樣的設計可能會致使網絡最終造成不一樣的結構,而這個最終結構所展示的性質有可能和設計初衷是相違背的。
全節點爲了可以不信任任何第三方,選擇自行驗證全部交易歷史。這種作法使全節點不只僅知足了本身的需求,也爲網絡安全貢獻了力量,體現出一種正外部性。區塊鏈須要這種安全保證,所以全節點對於一個去中心化的網絡相當重要。如何內部化這種正外部性是一個須要重視的課題,在這個課題尚未解決的狀況下,咱們能作的只能是保證全節點能夠運行在一個較低的成本,以促進網絡保有儘量多的全節點。
對於但願成爲將來加密經濟的基礎設施的Nervos CKB來講,必須在設計之初就把這些因素考慮在內,以理想中的網絡結構爲目標,並經過經濟激勵和其餘機制設計來實現。這並非一件容易的事情,還須要大量的研究和探索。