比特幣是目前執行最久的區塊鏈,已經執行了十年,而十年前和十年後,頻寬水平發生了巨大的變化。
如同上圖中這個研究所指出的,連結到網路中的比特幣 IPv4 節點在 2016 年時頻寬中位數為 33 Mbit/s,在 2017 年 2 月,這個數字達到了 56 Mbit/s。而比特幣的最大吞吐量至今沒有太大的改觀。
那是否有能力來讓共識演算法能夠根據環境調節自己的吞吐量,而不需要透過分叉等方式進行升級呢?這裡有兩個規律我們需要去了解,雖然規律是對歷史的總結,但是某種程度上我們可以用這些規律預測未來。
1)摩爾定律 Moore’s Law:也就是積體電路效能18-24個月翻倍,同樣的,儲存器也是遵循同樣的規律。也有表述稱每年增長 60%。
2) Nielsen's Law:這是一個和頻寬水平有關的定律,大致意思是使用者的頻寬每年增長 50%。相對於摩爾定律每年 60% 的計算速度增長速率,頻寬增長速率慢大約 10 %。
上圖是 1983 年到 2018 年頻寬的變化曲線,注意豎軸是 Log10,所以我們也能夠看到頻寬的增長也是指數形式增長的。
在 Nervos 共識研究員張韌之前的分析中,我們知道衡量區塊鏈共識協議的一個標準是頻寬利用率。頻寬提高是節點間通訊水平的提升,意味著共識會更加高效。
而共識協議是一開始就寫死的,如果需要修改則要進行分叉。比特幣、以太坊如果需要根據網路情況提高自己的吞吐量,需要的是開發者對網路情況進行估計,權衡效率和安全,然後採用一種保守的方案對協議進行升級。
升級又是一件痛苦的事情,最好的情況是:設計一種共識機制能夠根據頻寬水平的提升「自我進化」,來適應頻寬增長帶來的變化。
如何設計可以自我調整的共識協議
那麼我們需要去思考,有沒有一個區塊鏈能夠感知的指標,同時這個指標能夠體現當前網路的情況。根據這個指標協議能夠動態調節自己的吞吐量?
在 PoW 共識協議的研究中,有一個很重要的概念是孤塊。
百度百科的定義是:在比特幣協議中,最長的鏈被認為是絕對的正確。如果一個塊不是最長鏈的一部分,那麼它被稱為是「孤塊」。一個孤立的塊是一個塊,它也是合法的,但是發現的稍晚,或者是網路傳輸稍慢,而沒有能成為最長的鏈的一部分。在比特幣中,孤塊沒有意義,隨後將被拋棄,發現這個孤塊的礦工也拿不到採礦相關的獎勵。
以比特幣為例,一個在中國的礦工很幸運的在上個區塊出塊之後的 9 分鐘的時候挖到了區塊,然後他很開心地開始廣播這個區塊。但是這個區塊花了幾十秒還是沒有廣播到美國的礦工,十分鐘的時候美國的礦工發現了同樣高度的區塊,也開始廣播。
隨著兩個區塊透過比特幣的 P2P 協議不斷廣播開來,這時候大家會發現網路裡有兩個相同高度的區塊,這時候比拼的就是全網算力的支援,一部分算力認可北美礦工的區塊,根據這個區塊所在的鏈進行挖礦,另一個則在中國礦工所在鏈上挖礦,這時候就是產生了分叉。
在隨後的幾個區塊競爭中,雙方陣營的礦工必然有一個先搶出塊權,成為最長鏈,而後根據最長鏈原則,最後只能有一條最長鏈被所有礦工接受,結束分叉。另一條被遺棄的鏈上面的區塊就是孤塊。
孤塊就是因為頻寬限制產生的延遲,礦工沒有收到新的區塊而自己出塊產生了競爭,而這個競爭必然帶來一方礦工的損失。並且短暫的分叉其實也是損害了網路的安全性,這也是我們應該避免的。如果我們能夠假設頻寬無限好,區塊出塊能夠瞬間無縫廣播出去,那麼就不會存在這樣的競爭出現孤塊,沒有人損失,也不會產生安全上的問題。
而孤塊是區塊鏈能夠感知的,我們可以用全網的孤塊率作為指標,來評估目前網路頻寬情況。孤塊率低的時候意味著網路情況良好,沒有太多的出塊競爭,高的時候則表示網路情況太差,需要調高出塊難度,提高出塊間隔避免密集的出塊產生競爭。因此設定一個合理的孤塊率作為指標,協議根據當前孤塊率,對比這個指標評估網路情況動態調節出塊難度會是一個不錯的選擇。
頻寬利用率是評估共識效率的重要指標。在孤塊率較低的時候,這意味著網路情況良好,能夠承載更多的吞吐量。因此這時候可以降低出塊難度,降低出塊間隔,提高吞吐量,更好地利用網路頻寬。
孤塊率較高的時候,意味著網路情況比較差,這時候可以提高出塊難度,提高出塊間隔,降低吞吐量。
這樣,透過設定孤塊率調節吞吐量,隨著未來頻寬水平的提升,協議也能夠根據網路情況的最佳化提高吞吐量來適應未來的發展和變化,在保證一定安全性的同時,充分利用網路頻寬。
在張韌博士的設計中,就採用了這樣的設計思路。
張韌因為對 Bitcoin Unlimited 漏洞的研究,被 Blockstream 邀請實習,實習期間和 Pieter Wuille 和 Greg Maxwell 對目前所有的 PoW 共識機制作出研究。目前張韌在魯汶大學 COSIC 實驗室師從 Bart Preneel ,並和導師完成了研究論文《Lay Down the Common Metrics: Evaluating Proof-of-Work Consensus Protocols’ Security》,近期該論文被頂級會議 IEEE S&P 收錄。
在他的設計中,在每一個難度週期根據網路中的孤塊率(孤塊的資訊會被打包到區塊中用於統計和計算)動態調節難度,從而調節出塊間隔。這個共識協議的設計在比特幣 Nakamoto Consensus(即中本聰共識) 的基礎上進行修改,能夠在不損失安全性的同時提高網路的吞吐量 —— 我們稱這個共識演算法為NC-Max,我們希望它能夠突破 Nakamoto Consensus 的吞吐量極限。
當然細心的讀者可能會想到兩個問題:
1)出塊獎勵如何計算?
出塊間隔是變化的,出塊獎勵其實也是變化的。但是在一個難度調節週期,總出塊獎勵保持不變。
2)吞吐量提高之後,是否有儲存的問題?交易速度提高了,交易產生的儲存需求也會增加。
很巧的是,根據之前提到的 Moore’s Law 以及 Nielsen's Law ,頻寬增長速度略慢於儲存水平的提升。因此,在頻寬提升、吞吐量提升的同時,計算能力和儲存能力會不斷跟上甚至超越,不會出現由於 TPS 過高對計算能力的要求而需要更強的超級計算機,損失去中心化。
另外,在 NC-Max 的設計中,除了採用動態調整出塊間隔和區塊獎勵來提升頻寬利用率以外,還有兩個設計亮點:
1)採用兩步交易確認來降低孤塊率:交易首先會提交交易的編號(編號是完整交易的 hash 值,和交易一一對應)在區塊的交易提案區進行共識,之後只有經過提案的交易才能完整傳送,從而能夠一定程度降低孤塊率;
2)在難度調整的時候考慮週期中所有的區塊,包括孤塊,來抵禦「自私挖礦」攻擊。
總的來看,共識協議的自我調整會受到行業越來越多的關注,其解決方案也會越來越多。