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