導(dǎo)讀
本文是Rebase社區(qū)的Harry在《全名挖礦月》Nervos專場活動(dòng)上做的分享。
比特幣共識(shí)也稱為中本聰共識(shí)(Nakamoto Consensus),經(jīng)歷了10年的運(yùn)行證明了它的安全性和眾多優(yōu)點(diǎn),不過中本聰共識(shí)也因?yàn)樗耐掏铝坎桓咭恢憋柺茉嵅 KB共識(shí)是中本聰共識(shí)的改進(jìn)版,通過三大創(chuàng)新,在不妥協(xié)安全性的前提下,實(shí)現(xiàn)了吞吐量的提升,并解決了自私挖礦的問題。
中本聰共識(shí)的優(yōu)點(diǎn)
1.安全性高
中本聰共識(shí)經(jīng)歷了很多的攻擊,仍然穩(wěn)定運(yùn)行了十年。而且,目前沒有任何一個(gè)工作量證明機(jī)制整體超越中本聰共識(shí)。其它的協(xié)議要么有很強(qiáng)的安全假設(shè),要么會(huì)引入新的攻擊。
?安全假設(shè): 比如使用PoS的Algorand要求持有Token的人時(shí)刻保持在線來接收消息。
?新的攻擊: PoS的Nothing-at-stake Attack,Long-range Attack,這些攻擊在PoW中是不存在的。
2.帶寬利用好
在帶寬利用方面,我們可以用一個(gè)簡單的模型來衡量共識(shí)協(xié)議的吞吐量。
最左側(cè)藍(lán)色的部分是用來同步最終確認(rèn)交易的帶寬比例,這部分是真正的TPS;中間紅色部分是被共識(shí)協(xié)議“浪費(fèi)”的帶寬比例;最右側(cè)白色部分是未被利用的帶寬。
在帶寬一定的情況下,想要提高 TPS,能夠做的只有兩件事:
1)降低共識(shí)協(xié)議“浪費(fèi)”的帶寬比例
2)降低未被利用部分的帶寬比例
為了加快區(qū)塊的傳播,中本聰共識(shí)使用了Compact block relay,Compact block中包含:
?80字節(jié)的區(qū)塊頭
?短交易id
?預(yù)測的發(fā)送方有而接收方?jīng)]有的交易
最終1MB的區(qū)塊只需要廣播13KB的區(qū)塊消息,節(jié)約傳輸?shù)拿恳粋€(gè)字節(jié)。在這一點(diǎn)上,中本聰共識(shí)已經(jīng)做得非常好了,沒有被共識(shí)協(xié)議浪費(fèi)什么帶寬。
其它很多協(xié)議,它們將珍貴的帶寬資源浪費(fèi)在成員間的通訊上,比如Algorand用一個(gè)大小為300KB的區(qū)塊證書來向用戶證明一個(gè)區(qū)塊被提交。
3.通用性好
中本聰共識(shí)可以確保在區(qū)塊生成時(shí)就能確定全局交易順序,這是和智能合約的編程模型相兼容的。而很多其他拓?fù)浣Y(jié)構(gòu)的替代協(xié)議要么放棄全局交易順序,要么需要經(jīng)過很長的時(shí)間才能確認(rèn),這極大地限制了其效率上的提升或者功能上的豐富。
中本聰共識(shí)哪些地方可以改善
1.帶寬利用不足
在比特幣隔離見證(Segwit)之后每個(gè)區(qū)塊對應(yīng)的數(shù)據(jù)增加到了4MB(1MB區(qū)塊+3MB隔離見證數(shù)據(jù));比特幣的IPv4 節(jié)點(diǎn)帶寬中位數(shù)在 2016 年時(shí)是33Mbit/s,在 2017 年 2 月,這個(gè)數(shù)字達(dá)到56Mbit/s,是2016年的1.7倍。帶寬增加了,而比特幣網(wǎng)絡(luò)的吞吐量卻沒有增加。
我們可以想到,如果能夠根據(jù)帶寬狀況來動(dòng)態(tài)調(diào)節(jié)吐吞量就好了。
2.激勵(lì)問題
中本聰共識(shí)中,自私挖礦是有利可圖的,自私挖礦會(huì)增加孤塊率,使得正常的出塊數(shù)量減少。在下一個(gè)難度調(diào)整周期,協(xié)議會(huì)認(rèn)為挖礦難度太高,會(huì)降低挖礦難度,結(jié)果會(huì)使自私挖礦一方在單位時(shí)間內(nèi)挖到的幣增加,從而獲得比正常挖礦更多的收益。
我們可以想到,如果可以避免自私挖礦就好了。
更好的中本聰共識(shí)——CKB共識(shí)
為了解決中本聰共識(shí)遇到的問題,CKB共識(shí)帶來了三個(gè)創(chuàng)新:
?兩步交易確認(rèn): 降低孤塊率
?動(dòng)態(tài)調(diào)整區(qū)塊間隔和區(qū)塊獎(jiǎng)勵(lì): 更好的利用帶寬
?難度調(diào)整考慮所有區(qū)塊: 防止自私挖礦
結(jié)果帶來了幾個(gè)方面的提升:
?性能提升
?安全提升
?公平性提升
后面我們一一解讀。
兩步交易確認(rèn)
前面提到,在帶寬條件一定的情況下,中本聰共識(shí)已經(jīng)對帶寬進(jìn)行了非常好的利用,所以提升中本聰共識(shí)的吞吐量只能做兩件事:
?更大的區(qū)塊
?更小的出塊時(shí)間
更大的區(qū)塊導(dǎo)致了在區(qū)塊廣播是需要更多的傳輸時(shí)間,在這個(gè)過程中,其它的礦工就有更大的可能發(fā)現(xiàn)一個(gè)區(qū)塊,導(dǎo)致這個(gè)區(qū)塊成為孤塊;更小的出塊時(shí)間相當(dāng)于降低了出塊難度,讓發(fā)現(xiàn)區(qū)塊更容易,也容易導(dǎo)致孤塊率的增加。當(dāng)孤塊率高到一定程度,上面兩個(gè)方法都不能讓吞吐量繼續(xù)增加。
而且孤塊還會(huì)對網(wǎng)絡(luò)的安全和性能產(chǎn)生很大的影響。
安全方面,如下圖,孤塊率高會(huì)導(dǎo)致攻擊者可以以遠(yuǎn)低于51%的算力構(gòu)造出一條最長的鏈。
性能方面,孤塊會(huì)占用帶寬資源,影響網(wǎng)絡(luò)吞吐量。
從上面的分析,要想打破吞吐量的限制,就需要降低孤塊率。
那如何降低孤塊率呢?
孤塊的出現(xiàn)是因?yàn)閰^(qū)塊廣播的延遲,而區(qū)塊廣播的延遲主要是因?yàn)橥紽resh Transaction(發(fā)送方有而接收方?jīng)]有的交易)。
CKB共識(shí)采用兩步交易確認(rèn)來緩解這個(gè)問題。下圖是CKB共識(shí)中區(qū)塊的數(shù)據(jù)結(jié)構(gòu):
?區(qū)塊確認(rèn)區(qū)(commitment zone)中是確認(rèn)的交易
?提案區(qū)(proposal zone)中會(huì)放置交易id,用于n個(gè)高度后的區(qū)塊的確認(rèn)
?叔塊頭(uncle headers)和叔塊提案區(qū)(uncles‘ proposal zones)會(huì)放置叔塊的相關(guān)信息
每個(gè)礦工只允許打包前面h-m到h-n之間提案區(qū)以及叔塊提案區(qū)的交易。
從上圖中可以看到,當(dāng)前高度為h(Height: h)的區(qū)塊只能打包從window區(qū)域內(nèi)(h-m到h-n)挑選出的提案區(qū)交易,叔塊提案區(qū)的交易也可以進(jìn)行打包。這就保證了礦工總是有足夠的交易可以打包,從而消除了同步Fresh Transaction帶來的區(qū)塊廣播的延遲,最終降低孤塊率。
而且因?yàn)樵赾ompact block中已經(jīng)包含了所有已確認(rèn)交易的id,礦工在新區(qū)塊中不會(huì)將這部分交易包含進(jìn)來,讓礦工可以很容易的為交易確認(rèn)做貢獻(xiàn),并獲得手續(xù)費(fèi)。
動(dòng)態(tài)調(diào)整區(qū)塊間隔和區(qū)塊獎(jiǎng)勵(lì)
通過設(shè)定一個(gè)固定的孤塊率,在下一個(gè)難度周期(Epoch)動(dòng)態(tài)調(diào)整難度。
如果孤塊率低于設(shè)定值,說明網(wǎng)絡(luò)可以處理更多的交易,在下一個(gè)難度周期可以繼續(xù)降低難度,這個(gè)時(shí)候出塊時(shí)間將會(huì)降低,吞吐量會(huì)增加,區(qū)塊獎(jiǎng)勵(lì)會(huì)相應(yīng)減少。
反過來,如果孤塊率高于設(shè)定值,說明網(wǎng)絡(luò)處理不了這么多交易,在下一個(gè)難度周期應(yīng)該提高難度,會(huì)使出塊時(shí)間增加,吞吐量會(huì)下降,區(qū)塊獎(jiǎng)勵(lì)也相應(yīng)增加。
在CKB區(qū)塊瀏覽器(https://explorer.nervos.org/)中,我們可以通過區(qū)塊的信息來部分驗(yàn)證上面提到的過程。
從上圖中可以看到,一個(gè)區(qū)塊包含了以下信息:
?Epoch: 0 — 當(dāng)前的難度周期序號(hào)為0
?Epoch Start Number: 0 — 當(dāng)前Epoch開始的區(qū)塊高度(block height)為0
?Epoch Length: 1250 — 當(dāng)前Epoch包含了1250個(gè)區(qū)塊,也就是區(qū)塊高度從0到1249
?Difficulty: 37522 — 當(dāng)前Epoch難度值為37522
?Block Reward: 1000 CKB — 每個(gè)區(qū)塊的獎(jiǎng)勵(lì)為1000 CKB
?Uncle Count: 0 — 叔塊數(shù)量為0
這些信息在當(dāng)前Epoch 0中的1250個(gè)區(qū)塊中都是相同的。
在下一個(gè)Epoch,也就是從區(qū)塊高度為1250開始,挖礦難度值有一定的變化(如上圖):
?Epoch: 1 — 當(dāng)前的難度周期序號(hào)為1
?Epoch Start Number: 1250 — 當(dāng)前Epoch開始的區(qū)塊高度(block height)為1250
?Epoch Length: 838 — 當(dāng)前Epoch包含了838個(gè)區(qū)塊,也就是區(qū)塊高度從1250到2088
?Difficulty: 75044 — 當(dāng)前Epoch難度值為75044
?Block Reward: 1491.64677805 CKB — 每個(gè)區(qū)塊的獎(jiǎng)勵(lì)為1491.64677805 CKB
?Uncle Count: 0 — 叔塊數(shù)量為0
Epoch 1相對于Epoch 0難度值變大,導(dǎo)致吞吐量(區(qū)塊數(shù)量)減少,區(qū)塊獎(jiǎng)勵(lì)增加,但是Epoch的獎(jiǎng)勵(lì)總和沒有變化:
Epoch 0: 1250 * 1000 CKB = 1,250,000
Epoch 0: 838 * 1491.64677805 CKB = 1,250,000.0000059
通過以上的信息可以觀測到由于孤塊率的變化引起的Epoch難度值的調(diào)整。但由于目前還無法知道整個(gè)Epoch的孤塊率是多少,所以無法觀測到孤塊率對于Epoch難度調(diào)整的影響的很直觀的聯(lián)系。
防止自私挖礦
前面提到,中本聰共識(shí)中自私挖礦是有利可圖的,研究發(fā)現(xiàn)是因?yàn)榫W(wǎng)絡(luò)難度的調(diào)整只考慮區(qū)塊數(shù)量這一個(gè)維度。那CKB是如何解決這個(gè)問題的呢?
在CKB共識(shí)中,下一個(gè)Epoch的難度調(diào)整不只是計(jì)算已確認(rèn)區(qū)塊的數(shù)量,還會(huì)將孤塊以及叔塊考慮進(jìn)來,因此攻擊者不能使用自私挖礦的方式來使得網(wǎng)絡(luò)降低難度,所以也不能使用同樣的算力獲得更多的收益,最終自私挖礦在CKB中變得無利可圖。
最后
最后再強(qiáng)調(diào)一下CKB共識(shí)的優(yōu)點(diǎn):“CKB共識(shí)是中本聰共識(shí)的改進(jìn)版,通過三大創(chuàng)新,在不妥協(xié)安全性的前提下,實(shí)現(xiàn)了吞吐量的提升,并解決了自私挖礦的問題“。但CKB共識(shí)還是一個(gè)新生事物,需要時(shí)間的驗(yàn)證,我們也會(huì)持續(xù)的關(guān)注CKB共識(shí)的最新進(jìn)展和發(fā)現(xiàn)。
評(píng)論
查看更多