共識協議是當前區塊鏈網絡最重要的部分之一,並已經由最早的 PoW 衍生出 PoS 與 DPoS 等諸多共識協議。

不過當前行業所面臨的問題是,技術的不斷進步與用戶需求的提升會要求區塊鏈共識協議做出一定的改進,但這往往相當困難,以太坊就是最典型的案例。在這種情況下,如何設計出一種可以自我調整的共識協議越來越成爲行業的內在需求。

近日,Nervos 社區經理 Ryan Chen 向鏈捕手投稿談及該話題,深入闡述了共識協議的特性與行業進展,提出共識協議自我調整的可能方案,希望對大家有所啓發。

原文標題:《如何設計自我調整的共識協議?| 硬核系列》
作者:Ryan Chen

探索共識協議的自我調整方案

新的基礎設施湧現出新的技術,而新技術中所帶來的慾望則孕育着技術的自否定。原有的基礎設施終因無法再滿足慾望所需而被遺棄,在新的技術與慾望的共同推動下實現變革。

人類本身就是在不斷迭代的環境中自我進化,不斷適應新的技術和掌握新的技能,若無法學習和成長,自然被淘汰。而技術本身也是,若技術無法跟上時代發展的步伐,技術本身也會被超越、被淘汰。

公鏈和圍繞公鍊形成的生態就如同一個社會體系,很多時候整個社會不是不想快速前進,而是需要一個保守的方式,以穩定和安全爲第一優先級,儘量用最小化的變動完成對新情況的適應。

我們必須承認區塊鏈是類似硬件的軟件,回顧這項技術並不長的歷史,我們已經明顯感受到它這一項弱點:每一次分叉都是對整個社區的一種衝擊。比如,以太坊從 2015 年至今,經歷了三次分叉:

  • Homestead 分叉,通過了 3 個 EIP;
  • Byzantium 分叉,通過了 8 個 EIP;
  • Constantinople 分叉,通過了 5 個 EIP。

而 GitHub 中的正在討論的 EIP 還有上千個。

每次分叉都是在千萬個需求中艱難地做抉擇,找到當下最必要的幾個需求做出改進,並在社區進行大規模的探討。以太坊的核心開發者要清楚智能合約平臺目前面臨的情況,調查開發者們的需求,評估每一個協議改進對以太坊本身的影響;而且在一個開源的體系中,每一次改進都會有諸多的安全問題。

如最新的君士坦丁堡分叉,SSTORE 指令的改進在最後關頭被 Chain Security 團隊發現漏洞,是一個原本不會出現、但是改進之後牽扯到其他代碼帶來的可重入漏洞問題。對於一個如此龐大的開源生態,在不斷權衡升級的利弊之後,你還不得不在升級之前在測試網反覆進行測試來確保安全性,確保任何指令不會由於本次對代碼的修改造成其他後果。

但是現實情況就是,技術是不斷進步的,不斷會有新的硬件設施、軟件技術,會有全新的需求,要求區塊鏈協議做出一定的改進。最理想的方式是區塊鏈能夠足夠的底層、足夠靈活、足夠簡單,在需要升級的時候能夠儘可能避免過多的變動。

1、協議是否能夠自我調整?

若協議能夠自動適應環境的變化,擁有某種類似自我進化的能力,是否能夠極大程度改善這一點?在這其中,共識的設計關係到網絡和計算能力,是其中關鍵的一個部分。

比特幣是目前運行最久的區塊鏈,已經運行了十年,而十年前和十年後,帶寬水平發生了巨大的變化。

探索共識協議的自我調整方案

如同上圖中這個研究所指出的,鏈接到網絡中的比特幣 IPv4 節點在 2016 年時帶寬中位數爲 33 Mbit/s,在 2017 年 2 月,這個數字達到了 56 Mbit/s。而比特幣的最大吞吐量至今沒有太大的改觀。

那是否有能力來讓共識算法能夠根據環境調節自己的吞吐量,而不需要通過分叉等方式進行升級呢?這裏有兩個規律我們需要去了解,雖然規律是對歷史的總結,但是某種程度上我們可以用這些規律預測未來。

  1. 摩爾定律 Moore’s Law:也就是集成電路性能 18-24 個月翻倍,同樣的,存儲器也是遵循同樣的規律。也有表述稱每年增長 60%。
  2. Nielsen\’s Law:這是一個和帶寬水平有關的定律,大致意思是用戶的帶寬每年增長 50%。相對於摩爾定律每年 60% 的計算速度增長速率,帶寬增長速率慢大約 10 %。

探索共識協議的自我調整方案_ 圖片來自:Nielsen Norman Group_

上圖是 1983 年到 2018 年帶寬的變化曲線,注意豎軸是 Log10,所以我們也能夠看到帶寬的增長也是指數形式增長的。

在 Nervos 共識研究員韌博士之前的 分析 中,我們知道衡量區塊鏈共識協議的一個標準是帶寬利用率。帶寬提高是節點間通信水平的提升,意味着共識會更加高效。

而共識協議是一開始就寫死的,如果需要修改則要進行分叉。比特幣、以太坊如果需要根據網絡情況提高自己的吞吐量,需要的是開發者對網絡情況進行估計,權衡效率和安全,然後採用一種保守的方案對協議進行升級。

升級又是一件痛苦的事情,最好的情況是:設計一種共識機制能夠根據帶寬水平的提升「自我進化」,來適應帶寬增長帶來的變化。

2、如何設計可以自我調整的共識協議?

那麼我們需要去思考,有沒有一個區塊鏈能夠感知的指標,同時這個指標能夠體現當前網絡的情況。根據這個指標協議能夠動態調節自己的吞吐量?在 PoW 共識協議的研究中,有一個很重要的概念是孤塊。

百度百科的定義是:在比特幣協議中,最長的鏈被認爲是絕對的正確。如果一個塊不是最長鏈的一部分,那麼它被稱爲是「孤塊」。一個孤立的塊是一個塊,它也是合法的,但是發現的稍晚,或者是網絡傳輸稍慢,而沒有能成爲最長的鏈的一部分。在比特幣中,孤塊沒有意義,隨後將被拋棄,發現這個孤塊的礦工也拿不到採礦相關的獎勵。

以比特幣爲例,一個在中國的礦工很幸運的在上個區塊出塊之後的 9 分鐘的時候挖到了區塊,然後他很開心地開始廣播這個區塊。但是這個區塊花了幾十秒還是沒有廣播到美國的礦工,十分鐘的時候美國的礦工發現了同樣高度的區塊,也開始廣播。

隨着兩個區塊通過比特幣的 P2P 協議不斷廣播開來,這時候大家會發現網絡裏有兩個相同高度的區塊,這時候比拼的就是全網算力的支持,一部分算力認可北美礦工的區塊,根據這個區塊所在的鏈進行挖礦,另一個則在中國礦工所在鏈上挖礦,這時候就是產生了分叉。

在隨後的幾個區塊競爭中,雙方陣營的礦工必然有一個先搶出塊權,成爲最長鏈,而後根據最長鏈原則,最後只能有一條最長鏈被所有礦工接受,結束分叉。另一條被遺棄的鏈上面的區塊就是孤塊。

孤塊就是因爲帶寬限制產生的延遲,礦工沒有收到新的區塊而自己出塊產生了競爭,而這個競爭必然帶來一方礦工的損失。並且短暫的分叉其實也是損害了網絡的安全性,這也是我們應該避免的。如果我們能夠假設帶寬無限好,區塊出塊能夠瞬間無縫廣播出去,那麼就不會存在這樣的競爭出現孤塊,沒有人損失,也不會產生安全上的問題。

而孤塊是區塊鏈能夠感知的,我們可以用全網的孤塊率作爲指標,來評估目前網絡帶寬情況。孤塊率低的時候意味着網絡情況良好,沒有太多的出塊競爭,高的時候則表示網絡情況太差,需要調高出塊難度,提高出塊間隔避免密集的出塊產生競爭。因此設置一個合理的孤塊率作爲指標,協議根據當前孤塊率,對比這個指標評估網絡情況動態調節出塊難度會是一個不錯的選擇。

帶寬利用率是評估共識效率的重要指標。在孤塊率較低的時候,這意味着網絡情況良好,能夠承載更多的吞吐量。因此這時候可以降低出塊難度,降低出塊間隔,提高吞吐量,更好地利用網絡帶寬。

孤塊率較高的時候,意味着網絡情況比較差,這時候可以提高出塊難度,提高出塊間隔,降低吞吐量。

這樣,通過設定孤塊率調節吞吐量,隨着未來帶寬水平的提升,協議也能夠根據網絡情況的優化提高吞吐量來適應未來的發展和變化,在保證一定安全性的同時,充分利用網絡帶寬。

在張韌博士的設計中,就採用了這樣的設計思路。

在他的設計中,在每一個難度週期根據網絡中的孤塊率(孤塊的信息會被打包到區塊中用於統計和計算)動態調節難度,從而調節出塊間隔。這個共識協議的設計在比特幣 Nakamoto Consensus (即中本聰共識) 的基礎上進行修改,能夠在不損失安全性的同時提高網絡的吞吐量 —— 我們稱這個共識算法爲 NC-Max,我們希望它能夠突破 Nakamoto Consensus 的吞吐量極限。

當然細心的讀者可能會想到兩個問題:

  • 出塊獎勵如何計算?
    出塊間隔是變化的,出塊獎勵其實也是變化的。但是在一個難度調節週期,總出塊獎勵保持不變。
  • 吞吐量提高之後,是否有存儲的問題?
    交易速度提高了,交易產生的存儲需求也會增加。很巧的是,根據之前提到的 Moore’s Law 以及 Nielsen\’s Law,帶寬增長速度略慢於存儲水平的提升。因此,在帶寬提升、吞吐量提升的同時,計算能力和儲存能力會不斷跟上甚至超越,不會出現由於 TPS 過高對計算能力的要求而需要更強的超級計算機,損失去中心化。

另外,在 NC-Max 的設計中,除了採用動態調整出塊間隔和區塊獎勵來提升帶寬利用率以外,還有兩個設計亮點:

  1. 採用兩步交易確認來降低孤塊率:交易首先會提交交易的編號(編號是完整交易的 hash 值,和交易一一對應)在區塊的交易提案區進行共識,之後只有經過提案的交易才能完整發送,從而能夠一定程度降低孤塊率;
  2. 在難度調整的時候考慮週期中所有的區塊,包括孤塊,來抵禦「自私挖礦」攻擊。

總的來看,共識協議的自我調整會受到行業越來越多的關注,其解決方案也會越來越多,我會持續保持關注並與大家分享。