共識協(xié)議是當前區(qū)塊鏈網(wǎng)絡最重要的部分之一,并已經(jīng)由最早的PoW衍生出PoS與DPoS等諸多共識協(xié)議。
不過當前行業(yè)所面臨的問題是,技術的不斷進步與用戶需求的提升會要求區(qū)塊鏈共識協(xié)議做出一定的改進,但這往往相當困難,以太坊就是最典型的案例。
本文闡述了共識協(xié)議的特性與行業(yè)進展,提出共識協(xié)議自我調整的可能方案,希望對大家有所啟發(fā)。
新的基礎設施涌現(xiàn)出新的技術,而新技術中所帶來的欲望則孕育著技術的自否定。原有的基礎設施終因無法再滿足欲望所需而被遺棄,在新的技術與欲望的共同推動下實現(xiàn)變革。
人類本身就是在不斷迭代的環(huán)境中自我進化,不斷適應新的技術和掌握新的技能,若無法學習和成長,自然被淘汰。而技術本身也是,若技術無法跟上時代發(fā)展的步伐,技術本身也會被超越,被淘汰。
公鏈和圍繞公鏈形成的生態(tài)就如同一個社會體系,很多時候整個社會不是不想快速前進,而是需要一個保守的方式,以穩(wěn)定和安全為第一優(yōu)先級,盡量用最小化的變動完成對新情況的適應。
我們必須承認區(qū)塊鏈是類似硬件的軟件,回顧這項技術并不長的歷史,我們已經(jīng)明顯感受到它這一項弱點:每一次分叉都是對整個社區(qū)的一種沖擊。比如,以太坊從 2015 年至今,經(jīng)歷了三次分叉:
· Homestead 分叉,通過了 3 個 EIP;
· Byzantium 分叉,通過了 8 個 EIP;
· Constantinople 分叉,通過了 5 個 EIP。
而 GitHub 中的正在討論的 EIP 還有上千個。
每次分叉都是在千萬個需求中艱難地做抉擇,找到當下最必要的幾個需求做出改進,并在社區(qū)進行大規(guī)模的探討。以太坊的核心開發(fā)者要清楚智能合約平臺目前面臨的情況,調查開發(fā)者們的需求,評估每一個協(xié)議改進對以太坊本身的影響;而且在一個開源的體系中,每一次改進都會有諸多的安全問題。
如最新的君士坦丁堡分叉,SSTORE 指令的改進在最后關頭被 ChainSecurity 團隊發(fā)現(xiàn)漏洞,是一個原本不會出現(xiàn)、但是改進之后牽扯到其他代碼帶來的可重入漏洞問題。對于一個如此龐大的開源生態(tài),在不斷權衡升級的利弊之后,你還不得不在升級之前在測試網(wǎng)反復進行測試來確保安全性,確保任何指令不會由于本次對代碼的修改造成其他后果。
但是現(xiàn)實情況就是,技術是不斷進步的,不斷會有新的硬件設施、軟件技術,會有全新的需求,要求區(qū)塊鏈協(xié)議做出一定的改進。最理想的方式是區(qū)塊鏈能夠足夠的底層、足夠靈活、足夠簡單,在需要升級的時候能夠盡可能避免過多的變動。
協(xié)議是否能夠自我調整?
若協(xié)議能夠自動適應環(huán)境的變化,擁有某種類似自我進化的能力,是否能夠極大程度改善這一點?在這其中,共識的設計關系到網(wǎng)絡和計算能力,是其中關鍵的一個部分。
比特幣是目前運行最久的區(qū)塊鏈,已經(jīng)運行了十年,而十年前和十年后,帶寬水平發(fā)生了巨大的變化。
如同上圖中這個研究所指出的,鏈接到網(wǎng)絡中的比特幣 IPv4 節(jié)點在 2016 年時帶寬中位數(shù)為 33 Mbit/s,在 2017 年 2 月,這個數(shù)字達到了 56 Mbit/s。而比特幣的最大吞吐量至今沒有太大的改觀。
那是否有能力來讓共識算法能夠根據(jù)環(huán)境調節(jié)自己的吞吐量,而不需要通過分叉等方式進行升級呢?這里有兩個規(guī)律我們需要去了解,雖然規(guī)律是對歷史的總結,但是某種程度上我們可以用這些規(guī)律預測未來。
1)摩爾定律 Moore’s Law:也就是集成電路性能18-24個月翻倍,同樣的,存儲器也是遵循同樣的規(guī)律。也有表述稱每年增長 60%。
2) Nielsen‘s Law:這是一個和帶寬水平有關的定律,大致意思是用戶的帶寬每年增長 50%。相對于摩爾定律每年 60% 的計算速度增長速率,帶寬增長速率慢大約 10 %。
上圖是 1983 年到 2018 年帶寬的變化曲線,注意豎軸是 Log10,所以我們也能夠看到帶寬的增長也是指數(shù)形式增長的。
在 Nervos 共識研究員張韌之前的分析中,我們知道衡量區(qū)塊鏈共識協(xié)議的一個標準是帶寬利用率。帶寬提高是節(jié)點間通信水平的提升,意味著共識會更加高效。
而共識協(xié)議是一開始就寫死的,如果需要修改則要進行分叉。比特幣、以太坊如果需要根據(jù)網(wǎng)絡情況提高自己的吞吐量,需要的是開發(fā)者對網(wǎng)絡情況進行估計,權衡效率和安全,然后采用一種保守的方案對協(xié)議進行升級。
升級又是一件痛苦的事情,最好的情況是:設計一種共識機制能夠根據(jù)帶寬水平的提升「自我進化」,來適應帶寬增長帶來的變化。
如何設計可以自我調整的共識協(xié)議
那么我們需要去思考,有沒有一個區(qū)塊鏈能夠感知的指標,同時這個指標能夠體現(xiàn)當前網(wǎng)絡的情況。根據(jù)這個指標協(xié)議能夠動態(tài)調節(jié)自己的吞吐量?
在 PoW 共識協(xié)議的研究中,有一個很重要的概念是孤塊。
百度百科的定義是:在比特幣協(xié)議中,最長的鏈被認為是絕對的正確。如果一個塊不是最長鏈的一部分,那么它被稱為是「孤塊」。一個孤立的塊是一個塊,它也是合法的,但是發(fā)現(xiàn)的稍晚,或者是網(wǎng)絡傳輸稍慢,而沒有能成為最長的鏈的一部分。在比特幣中,孤塊沒有意義,隨后將被拋棄,發(fā)現(xiàn)這個孤塊的礦工也拿不到采礦相關的獎勵。
以比特幣為例,一個在中國的礦工很幸運的在上個區(qū)塊出塊之后的 9 分鐘的時候挖到了區(qū)塊,然后他很開心地開始廣播這個區(qū)塊。但是這個區(qū)塊花了幾十秒還是沒有廣播到美國的礦工,十分鐘的時候美國的礦工發(fā)現(xiàn)了同樣高度的區(qū)塊,也開始廣播。
隨著兩個區(qū)塊通過比特幣的 P2P 協(xié)議不斷廣播開來,這時候大家會發(fā)現(xiàn)網(wǎng)絡里有兩個相同高度的區(qū)塊,這時候比拼的就是全網(wǎng)算力的支持,一部分算力認可北美礦工的區(qū)塊,根據(jù)這個區(qū)塊所在的鏈進行挖礦,另一個則在中國礦工所在鏈上挖礦,這時候就是產(chǎn)生了分叉。
在隨后的幾個區(qū)塊競爭中,雙方陣營的礦工必然有一個先搶出塊權,成為最長鏈,而后根據(jù)最長鏈原則,最后只能有一條最長鏈被所有礦工接受,結束分叉。另一條被遺棄的鏈上面的區(qū)塊就是孤塊。
孤塊就是因為帶寬限制產(chǎn)生的延遲,礦工沒有收到新的區(qū)塊而自己出塊產(chǎn)生了競爭,而這個競爭必然帶來一方礦工的損失。并且短暫的分叉其實也是損害了網(wǎng)絡的安全性,這也是我們應該避免的。如果我們能夠假設帶寬無限好,區(qū)塊出塊能夠瞬間無縫廣播出去,那么就不會存在這樣的競爭出現(xiàn)孤塊,沒有人損失,也不會產(chǎn)生安全上的問題。
而孤塊是區(qū)塊鏈能夠感知的,我們可以用全網(wǎng)的孤塊率作為指標,來評估目前網(wǎng)絡帶寬情況。孤塊率低的時候意味著網(wǎng)絡情況良好,沒有太多的出塊競爭,高的時候則表示網(wǎng)絡情況太差,需要調高出塊難度,提高出塊間隔避免密集的出塊產(chǎn)生競爭。因此設置一個合理的孤塊率作為指標,協(xié)議根據(jù)當前孤塊率,對比這個指標評估網(wǎng)絡情況動態(tài)調節(jié)出塊難度會是一個不錯的選擇。
帶寬利用率是評估共識效率的重要指標。在孤塊率較低的時候,這意味著網(wǎng)絡情況良好,能夠承載更多的吞吐量。因此這時候可以降低出塊難度,降低出塊間隔,提高吞吐量,更好地利用網(wǎng)絡帶寬。
孤塊率較高的時候,意味著網(wǎng)絡情況比較差,這時候可以提高出塊難度,提高出塊間隔,降低吞吐量。
這樣,通過設定孤塊率調節(jié)吞吐量,隨著未來帶寬水平的提升,協(xié)議也能夠根據(jù)網(wǎng)絡情況的優(yōu)化提高吞吐量來適應未來的發(fā)展和變化,在保證一定安全性的同時,充分利用網(wǎng)絡帶寬。
在張韌博士的設計中,就采用了這樣的設計思路。
張韌因為對 Bitcoin Unlimited 漏洞的研究,被 Blockstream 邀請實習,實習期間和 Pieter Wuille 和 Greg Maxwell 對目前所有的 PoW 共識機制作出研究。目前張韌在魯汶大學 COSIC 實驗室?guī)煆?Bart Preneel ,并和導師完成了研究論文《Lay Down the Common Metrics: Evaluating Proof-of-Work Consensus Protocols’ Security》,近期該論文被頂級會議 IEEE S&P 收錄。
在他的設計中,在每一個難度周期根據(jù)網(wǎng)絡中的孤塊率(孤塊的信息會被打包到區(qū)塊中用于統(tǒng)計和計算)動態(tài)調節(jié)難度,從而調節(jié)出塊間隔。這個共識協(xié)議的設計在比特幣 Nakamoto Consensus(即中本聰共識) 的基礎上進行修改,能夠在不損失安全性的同時提高網(wǎng)絡的吞吐量 —— 我們稱這個共識算法為NC-Max,我們希望它能夠突破 Nakamoto Consensus 的吞吐量極限。
當然細心的讀者可能會想到兩個問題:
1)出塊獎勵如何計算?
出塊間隔是變化的,出塊獎勵其實也是變化的。但是在一個難度調節(jié)周期,總出塊獎勵保持不變。
2)吞吐量提高之后,是否有存儲的問題?交易速度提高了,交易產(chǎn)生的存儲需求也會增加。
很巧的是,根據(jù)之前提到的 Moore’s Law 以及 Nielsen’s Law ,帶寬增長速度略慢于存儲水平的提升。因此,在帶寬提升、吞吐量提升的同時,計算能力和儲存能力會不斷跟上甚至超越,不會出現(xiàn)由于 TPS 過高對計算能力的要求而需要更強的超級計算機,損失去中心化。
另外,在 NC-Max 的設計中,除了采用動態(tài)調整出塊間隔和區(qū)塊獎勵來提升帶寬利用率以外,還有兩個設計亮點:
1)采用兩步交易確認來降低孤塊率:交易首先會提交交易的編號(編號是完整交易的 hash 值,和交易一一對應)在區(qū)塊的交易提案區(qū)進行共識,之后只有經(jīng)過提案的交易才能完整發(fā)送,從而能夠一定程度降低孤塊率;
2)在難度調整的時候考慮周期中所有的區(qū)塊,包括孤塊,來抵御「自私挖礦」攻擊。
總的來看,共識協(xié)議的自我調整會受到行業(yè)越來越多的關注,其解決方案也會越來越多。
評論
查看更多