鏈化未來共識(shí)協(xié)議詳解(下)

本系列分上下兩篇,對鏈化未來共識(shí)協(xié)議進(jìn)行詳細(xì)介紹。文章首先介紹了常見共識(shí)協(xié)議的PoW,PoS,DPoS,從而引出了鏈化未來基于BFT的隨機(jī)PoS共識(shí)算法(RPoS),隨后詳細(xì)介紹了鏈化未來共識(shí)協(xié)議的架構(gòu)、消息類型、詳細(xì)流程以及節(jié)點(diǎn)狀態(tài)圖等內(nèi)容。文章最后對鏈化未來共識(shí)協(xié)議用到的關(guān)鍵技術(shù)進(jìn)行了總結(jié)說明。

2.4.分階段詳解

2.4.1.ba0階段

提塊驗(yàn)證并第一次投票階段

1. 系統(tǒng)根據(jù)隨機(jī)數(shù)合約提供的真隨機(jī)數(shù),在所有committee中選擇主備2個(gè)proposer節(jié)點(diǎn)負(fù)責(zé)本輪提塊。主、備proposer節(jié)點(diǎn)提的塊有優(yōu)先級區(qū)分,主節(jié)點(diǎn)優(yōu)先級高。這里之所以選擇主備2個(gè)節(jié)點(diǎn)提塊而不是1個(gè),是為了防止被選中的節(jié)點(diǎn)出現(xiàn)異常無法發(fā)送propose提塊消息,從而導(dǎo)致本輪無法正常出塊的情況。

2. 2個(gè)proposer節(jié)點(diǎn)分別發(fā)送各自的propose消息廣播到全網(wǎng)voter節(jié)點(diǎn),voter節(jié)點(diǎn)執(zhí)行propose消息塊中的交易進(jìn)行驗(yàn)證,并通過消息中的簽名對proposer的身份進(jìn)行驗(yàn)證,驗(yàn)證通過后,voter發(fā)送攜帶自己簽名的echo消息(第一次投票)廣播到全網(wǎng)。

3. ba0階段5秒結(jié)束后,每個(gè)節(jié)點(diǎn)統(tǒng)計(jì)在此期間收到的第一輪投票情況(echo消息),有以下幾種情況:

只有一個(gè)propose消息的voter簽名數(shù)超過2/3委員會(huì)成員,則將該propose消息中的塊作為候選塊,即ba1階段的投票目標(biāo)

2個(gè)propose消息的voter簽名均超過2/3委員會(huì)成員,選擇優(yōu)先級高(主proposer節(jié)點(diǎn)發(fā)出的)的propose消息中的塊作為候選塊,即ba1階段的投票目標(biāo)

沒有任何一個(gè)propose消息的voter簽名超過2/3委員會(huì)成員,則在ba1階段投票產(chǎn)生空塊,即本輪出空塊。

圖2 ba0流程圖


2.4.2.ba1階段

第二次投票確認(rèn)階段

1. 每個(gè)commiittee成員根據(jù)ba0結(jié)束階段的選擇,進(jìn)行2次投票,將帶有自己簽名的echo消息廣播到全網(wǎng)。

2. 5秒結(jié)束時(shí),ba1階段結(jié)束,每個(gè)節(jié)點(diǎn)各自統(tǒng)計(jì)收到的第二輪票數(shù),有以下2種情況

對某個(gè)塊(包括空塊)的voter簽名票數(shù)超過2/3 commiittee成員,則節(jié)點(diǎn)以該塊作為本輪最終確認(rèn)塊上鏈并更新世界狀態(tài)。

未有任何塊的voter簽名票數(shù)超過2/3 commiittee成員,系統(tǒng)未能10秒正常出塊,進(jìn)入bax輪次。

圖3 ba1流程圖


2.4.3.bax階段

各種異常情況會(huì)導(dǎo)致共識(shí)系統(tǒng)進(jìn)入bax階段,例如超過1/3commiittee成員故障、網(wǎng)絡(luò)不可達(dá)等。

1. 節(jié)點(diǎn)以5秒為一個(gè)輪次重復(fù)ba1階段的操作,每隔5秒發(fā)送一次echo消息,進(jìn)行投票,投票不允許變更。

2. 每個(gè)5秒輪次結(jié)束統(tǒng)計(jì)voter票數(shù),如果有對某個(gè)塊的voter簽名票數(shù)超過2/3 commiittee成員,則結(jié)束bax階段,節(jié)點(diǎn)以該塊作為本輪確認(rèn)塊上鏈并更新世界狀態(tài)。

3. 在投票間隙,本節(jié)點(diǎn)詢問周圍鄰居節(jié)點(diǎn),是否已經(jīng)有比本節(jié)點(diǎn)的更高的塊。如果有鄰居節(jié)點(diǎn)比本節(jié)點(diǎn)塊高,認(rèn)為本節(jié)點(diǎn)已經(jīng)落后于整個(gè)共識(shí)網(wǎng)絡(luò),放棄共識(shí),啟動(dòng)塊同步流程,通過拉塊結(jié)束bax階段,進(jìn)入下一輪共識(shí)。如果沒有鄰居節(jié)點(diǎn)比本節(jié)點(diǎn)塊高,則只能通過持續(xù)共識(shí)結(jié)束bax階段。

4. 當(dāng)總輪次達(dá)到20輪后,節(jié)點(diǎn)仍然無法結(jié)束bax階段,則認(rèn)為commiittee所有成員在ba1階段的投票是分裂的(典型情況是一半支持主proposer節(jié)點(diǎn),另一半支持備proposer節(jié)點(diǎn)),即按照當(dāng)前投票情況永遠(yuǎn)無法達(dá)成2/3共識(shí),則所有節(jié)點(diǎn)不論在ba1階段投的是什么票,從第21輪次開始,統(tǒng)一投空塊票,本輪只能出空塊。

圖4 bax流程圖


如上幾個(gè)階段和步驟,可確保只要有超過2/3 commiittee委員會(huì)成員在線且通訊可達(dá),系統(tǒng)總能持續(xù)出塊。


2.5.節(jié)點(diǎn)狀態(tài)介紹

共識(shí)節(jié)點(diǎn)有5種狀態(tài):

Init ???節(jié)點(diǎn)處于創(chuàng)世前的初始態(tài)

ba0 ??節(jié)點(diǎn)處于共識(shí)ba0階段

ba1 ??節(jié)點(diǎn)處于共識(shí)ba1階段

bax ??節(jié)點(diǎn)處于共識(shí)bax階段

sync 節(jié)點(diǎn)處于塊同步狀態(tài)

?圖5 節(jié)點(diǎn)狀態(tài)遷移圖

狀態(tài)遷移路徑

1. 創(chuàng)世后啟動(dòng)共識(shí),init—>ba0

2. ba0 5秒結(jié)束,ba0—>ba1

3. ba1 5秒結(jié)束,有超過2/3 commiittee成員達(dá)成一致,正常出塊后進(jìn)入下一塊共識(shí),ba1—>ba0

4. ba1 5秒結(jié)束,commiittee成員未達(dá)成一致,ba1—>bax

5. bax 5秒結(jié)束,commiittee成員達(dá)成一致,bax—>ba0

6. bax 5秒結(jié)束,commiittee成員未達(dá)成一致,節(jié)點(diǎn)繼續(xù)停留在bax階段,輪次++

7. bax 5秒結(jié)束,commiittee成員未達(dá)成一致,有鄰居可以提供塊同步服務(wù) bax—>sync

8. 同步完成后,再次進(jìn)入共識(shí),sync—>ba0


2.6.鏈化未來共識(shí)協(xié)議關(guān)鍵技術(shù)

2.6.1.塊同步

當(dāng)有新節(jié)點(diǎn)想要加入共識(shí)網(wǎng)絡(luò),或有節(jié)點(diǎn)因故障(重啟、網(wǎng)絡(luò)不可達(dá)等)一段時(shí)間內(nèi)無法正常出塊,本節(jié)點(diǎn)的最高塊已經(jīng)比整個(gè)網(wǎng)絡(luò)的最高塊落后很多,此時(shí)進(jìn)入塊同步流程。目的是讓新節(jié)點(diǎn)或者故障節(jié)點(diǎn)通過從鄰居節(jié)點(diǎn)拉塊,快速追平當(dāng)前最新塊高,盡早加入到共識(shí)體系中。

以節(jié)點(diǎn)A為例簡述流

1. A加入網(wǎng)絡(luò)后,啟動(dòng)定時(shí)器timer1,向所有鄰居節(jié)點(diǎn)詢問最新塊高,等待回復(fù)

2. 鄰居節(jié)點(diǎn)通過身份認(rèn)證后,向節(jié)點(diǎn)A返回各自當(dāng)前最新塊高

3. timer1超時(shí)后,A統(tǒng)計(jì)周邊鄰居的最新塊高,并從中選擇拉塊源,有以下幾種情況:

無鄰居響應(yīng),重置定時(shí)器timer1,返回步驟1繼續(xù)嘗試

有鄰居響應(yīng),最新塊高均小于等于本節(jié)點(diǎn)塊高,結(jié)束快同步流程,啟動(dòng)共識(shí)

有鄰居響應(yīng),且多個(gè)節(jié)點(diǎn)的最新塊高大于本節(jié)點(diǎn)塊高,則選擇塊高最高的節(jié)點(diǎn)作為拉塊源節(jié)點(diǎn),進(jìn)入步驟4


4. 啟動(dòng)定時(shí)器timer2,發(fā)消息給源節(jié)點(diǎn)請求同步本機(jī)當(dāng)前塊至最新塊

5. 源節(jié)點(diǎn)按照順序發(fā)送塊給節(jié)點(diǎn)A,直至最高塊

6. 如果在傳輸過程中消息中斷,且中斷時(shí)間超過定時(shí)器timer2,則本次塊同步流程結(jié)束,本次同步到已經(jīng)確認(rèn)的塊不用回退,返回步驟1繼續(xù)嘗試塊同步。


2.6.2.時(shí)序同步機(jī)制

在現(xiàn)網(wǎng)運(yùn)行環(huán)境中,各節(jié)點(diǎn)性能參差不齊,運(yùn)行一段時(shí)間后,性能差的慢速節(jié)點(diǎn)會(huì)逐漸落后,當(dāng)時(shí)間累積,出現(xiàn)慢速節(jié)點(diǎn)落后快速節(jié)點(diǎn)一個(gè)輪次甚至更多時(shí),整網(wǎng)節(jié)點(diǎn)的同步性會(huì)逐步裂化。


當(dāng)落后的節(jié)點(diǎn)越來越多,超過1/3commiittee成員時(shí),保持同步并能參與共識(shí)的節(jié)點(diǎn)不足2/3 commiittee成員,無法達(dá)到共識(shí)的投票門檻,整個(gè)網(wǎng)絡(luò)會(huì)被迫全部進(jìn)入bax階段,等待慢速節(jié)點(diǎn)追趕。當(dāng)有足夠多的節(jié)點(diǎn)追趕上后,參與共識(shí)的節(jié)點(diǎn)又會(huì)超過2/3 commiittee,整個(gè)網(wǎng)絡(luò)會(huì)恢復(fù)并繼續(xù)正常出塊。

當(dāng)然在現(xiàn)實(shí)環(huán)境中,我們并不希望上述整個(gè)網(wǎng)絡(luò)進(jìn)入bax等待的情況出現(xiàn),出塊效率和用戶使用。鏈化未來共識(shí)采用同步機(jī)制,避免上述極端情況發(fā)生,使整個(gè)網(wǎng)絡(luò)的節(jié)點(diǎn)能夠自治的趨于輪次同步。


慢速節(jié)點(diǎn)通過緩存比自己當(dāng)前輪次高的消息,當(dāng)慢速節(jié)點(diǎn)落后整網(wǎng)節(jié)點(diǎn)時(shí),這個(gè)機(jī)制非常有用。當(dāng)節(jié)點(diǎn)檢測到已經(jīng)落后,并且緩存中收集到的下個(gè)輪次的消息超過2/3 commiittee成員(確保安全),則節(jié)點(diǎn)可以快速結(jié)束本輪次進(jìn)入下一輪,而不必等待本輪5秒的固定結(jié)束時(shí)間。

這個(gè)機(jī)制可以使得網(wǎng)絡(luò)中那些慢速節(jié)點(diǎn),追趕至少一個(gè)輪次(5s)的落后。鏈化未來最多可以緩存200個(gè)輪次的消息,使得理論上可以在一個(gè)輪次中追趕上100個(gè)塊高的差距。

通過上述機(jī)制,可以有效避免整個(gè)網(wǎng)絡(luò)無法正常出塊的情況。


2.6.3.聚合簽名

對于輕客戶端,PoW通過nonce值計(jì)算hash驗(yàn)證塊的正確性,而鏈化未來是基于BFT的共識(shí)算法,需要2/3Voter的Echo消息確認(rèn)塊。

聚合簽名能夠把這些Voter的Echo消息的簽名聚合成一個(gè)最終的簽名,大小只有原來的1/100。減少主側(cè)鏈互投的網(wǎng)絡(luò)帶寬。假設(shè)節(jié)點(diǎn)的BLS私鑰sk[i],公鑰pk[i],對相同的摘要h(m)進(jìn)行簽名,sk[i] + h(m) => sign[i], 通過聚合簽名算法生成最后的簽名sign[1] + sign[2] + ... + sign[n] => signX,對聚合簽名的驗(yàn)證,(pk[1], pk[2], ... pk[n]) + signX => true/false。所以,聚合簽名的塊頭里面只需要保存參加聚合的賬號和signX。在100個(gè)委員會(huì)成員的情況下,內(nèi)存只需要原來的1/100。

鏈化未來對聚合簽名的使用如下:

1. 節(jié)點(diǎn)在N塊時(shí),收到足夠的Echo消息,并生成第N塊

2. 進(jìn)入N+1塊共識(shí),如果節(jié)點(diǎn)被選成proposer,那么它對第N塊時(shí)的Echo進(jìn)行聚合,并把聚合后的信息放到N+1的塊頭擴(kuò)展字段,那么在輕客戶端在收到N+1塊之后就可以通過驗(yàn)證聚合簽名確認(rèn)第N塊的真實(shí)性。


2.6.4.隨機(jī)數(shù)

區(qū)塊鏈中的隨機(jī)數(shù),不僅運(yùn)用在開發(fā)DAPP的智能合約中,還運(yùn)用在PoS共識(shí)協(xié)議的角色抽簽,直接涉及到DAPP和區(qū)塊鏈網(wǎng)絡(luò)的安全,挖礦的公平性。目前鏈上隨機(jī)數(shù)獲取主要有3種:


1. 通過鏈上信息,如塊hash。

2. 通過Oracle去獲取中心化的真隨機(jī)數(shù)。

3. 分布式的隨機(jī)數(shù)協(xié)議,如RANDOM。


????????但是,這些協(xié)議那么存在可預(yù)測,中心化或串謀操控的問題?;谀壳艾F(xiàn)實(shí),我們采用VRF(可驗(yàn)證隨機(jī)函數(shù)),雙層隨機(jī)數(shù)架構(gòu),并用經(jīng)濟(jì)手段鼓勵(lì)用戶參與,設(shè)計(jì)了一種新的隨機(jī)數(shù)生成器。流程如下:


1. 礦工通過抵押代幣成為main角色,普通用戶通過抵押代幣成為waiter角色

2. 在一個(gè)投票周期中,main和waiter通過計(jì)算vrf值分別投到隨機(jī)數(shù)合約中main和waiter pool,投票周期是重疊的也就是流水線投票

3. 合約根據(jù)權(quán)重用main和waiter pool中vrf隨機(jī)數(shù)生成最終的隨機(jī)數(shù),投票者可以獲得獎(jiǎng)勵(lì),而不投票這將被扣除一定數(shù)量的抵押代幣。


鏈化未來隨機(jī)數(shù)方案的優(yōu)點(diǎn):

有效解決“成員拒絕提交”,“setup過程復(fù)雜”,“成員串謀操縱”等多種困擾隨機(jī)數(shù)生成的問題。

解決了proposer數(shù)量不確定導(dǎo)致的網(wǎng)絡(luò)風(fēng)暴問題,極大的增強(qiáng)了共識(shí)的安全性,公平性和性能。


2.6.5.共識(shí)安全

在無需認(rèn)證即可加入(permissionless)的網(wǎng)絡(luò)中,很難只用技術(shù)手段做到網(wǎng)絡(luò)的安全。鏈化未來通訊層在節(jié)點(diǎn)接入時(shí)要做身份認(rèn)證,只有符合認(rèn)證規(guī)則的節(jié)點(diǎn)可以接入網(wǎng)絡(luò)。

在區(qū)塊鏈的世界,通過經(jīng)濟(jì)激勵(lì)機(jī)制,對誠實(shí)節(jié)點(diǎn)進(jìn)行激勵(lì),對作惡節(jié)點(diǎn)進(jìn)行處罰,保證網(wǎng)絡(luò)中大多數(shù)節(jié)點(diǎn)是誠實(shí)節(jié)點(diǎn),維護(hù)網(wǎng)絡(luò)的安全。

基于BFT的RPOS算法,通過投票機(jī)制來確認(rèn)塊,并不消耗算力,對于作惡節(jié)點(diǎn)需要被顯示的踢出committee,甚至要扣除挖礦押金。

若干典型攻擊的防護(hù)策略:

1. 長程攻擊:

鏈化未來共識(shí)把BLS簽名固化到塊頭,攻擊者無法偽造一條鏈。

2. 賄賂攻擊:

鏈的委員會(huì)是變化的,攻擊者可以賄賂已經(jīng)退出委員會(huì)的節(jié)點(diǎn),然后偽造一條鏈。通過在配置文件中固化塊hash發(fā)現(xiàn)賄賂攻擊。

3. 離線攻擊:

對于長時(shí)間不出塊的節(jié)點(diǎn),我們假定已經(jīng)離線了,因?yàn)闀?huì)影響網(wǎng)絡(luò)的安全,所以被踢出委員會(huì)。

4. DDoS攻擊:

系統(tǒng)檢測到被DDOS攻擊后,不傳播DDOS消息,確保只影響單節(jié)點(diǎn)而不會(huì)影響整個(gè)網(wǎng)絡(luò)。


3.參考文獻(xiàn)

[1] L. Lamport, R. Shostak, and M. Pease. The Byzantine Generals Problem. ACM Transactions on Programming Languages andvSystems, 4(3), 1982

[2] Miguel Castro and Barbara Liskov. Practical Byzantine Fault Tolerance. http://pmg.csail.mit.edu/papers/osdi99.pdf,1999

[3] Bitcoin: A Peer-to-Peer Electronic Cash System(2008). URL https://bitcoin.org/ bitcoin.pdf.

[4] https://www.chainnews.com/articles/637745801429.htm

[5] Ethereum, https://github.com/ethereum/

[6] https://en.bitcoin.it/wiki/ASIC

[7] https://www.theverge.com/2019/7/4/20682109/bitcoin-energy-consumption-annual-calculation-cambridge-index-cbeci-country-comparison

[8] https://www.buybitcoinworldwide.com/mining/pools/

[9] Kwon, J. Tendermint: Consensus without mining (2014). URL https://tendermint.com/static/ docs/tendermint.pdf

[10]Chen,J.&Micali,S.ALGORAND:theefficientanddemocraticledger.CoRRabs/1607.01341(2016). URL http://arxiv.org/abs/1607.01341.

[11] Vitalik Buterin and Virgil Griffith. Casper the friendly finality gadget. CoRR, abs/1710.09437, 2017.

[12] Andrew Miller, Yu Xia, Kyle Croman, etc. The honey badger of BFT protocols. In Proceedings of the 2016 ACM SIGSAC Conference on Computer and Communications Security, Vienna, Austria, October 24-28, 2016, pages 31–42, 2016.

?[13] Introducing?dfinity crypto techniques (2017). URL https://dfinity.org/static/dfinity-consensus-0325c35128c72b42df7dd30c22c41208.pdf

?[14] https://docs.bitshares.org/en/master/technology/dpos.html

[15] https://github.com/EOSIO/Documentation/blob/master/TechnicalWhitePaper.md

[16] https://github.com/ethereum/wiki/wiki/Proof-of-Stake-FAQ#what-are-the-benefits-of-proof-of-stake-as-opposed-to-proof-of-work

[17] https://thenextweb.com/hardfork/2018/11/01/eos-blockchain-benchmark/

[18] Buterin, V. Minimal slashing conditions (2017). URL https://medium.com/@VitalikButerin/ minimal-slashing-conditions-20f0b500fc6c.

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容