星系共識(shí)的隨機(jī)數(shù)生成算法對(duì)共識(shí)協(xié)議的作用
一、隨機(jī)數(shù)對(duì)于區(qū)塊鏈系統(tǒng)的重要作用
在正式談隨機(jī)數(shù)的作用之前,我們需要了解一個(gè)概念,那就是“熵”(entropy)。熵對(duì)于物理學(xué)領(lǐng)域的朋友一定不會(huì)陌生,它是體系混亂程度的度量。在1948年,香農(nóng)(Claude Elwood Shannon)提出了信息熵的概念,去描述信源的不確信度。簡(jiǎn)而言之,熵就是不確定性的度量。舉一個(gè)簡(jiǎn)單的例子:“北京明天的天氣狀況”,可能是晴天,也可能是陰天或者下雨,結(jié)果是不確定的,因此熵為正數(shù);“地球明天要?dú)纭保覀冎赖厍蛎魈觳粫?huì)毀滅,這是確定的結(jié)果,因此熵為零。
那么熵和區(qū)塊鏈系統(tǒng)有何關(guān)系呢?可以說(shuō),熵對(duì)于區(qū)塊鏈系統(tǒng)是至關(guān)重要的,是整個(gè)系統(tǒng)運(yùn)行的安全保障。以比特幣系統(tǒng)為例,它采取PoW作為共識(shí)算法,礦工進(jìn)行大量哈希計(jì)算去爭(zhēng)奪出塊權(quán),任何高度區(qū)塊的出塊者身份都無(wú)法提前預(yù)測(cè),這就是熵在比特幣系統(tǒng)中的體現(xiàn)。試想如果熵為0,即每個(gè)區(qū)塊的出塊者都是事先確定的或者人為可控,那么必然會(huì)出現(xiàn)合謀、分叉等攻擊。因此任何區(qū)塊鏈系統(tǒng)都需要一種安全有效的方式為系統(tǒng)引入熵。基于PoW共識(shí)的區(qū)塊鏈系統(tǒng)由于挖礦的隨機(jī)性,以天然的方式為系統(tǒng)引入了熵,然而對(duì)于PoS和DPoS共識(shí)的區(qū)塊鏈系統(tǒng),就需要單獨(dú)設(shè)計(jì)一種方式去引入熵,那就是隨機(jī)數(shù)生成算法??梢哉f(shuō)隨機(jī)數(shù)生成算法是設(shè)計(jì)共識(shí)機(jī)制的主要挑戰(zhàn)之一,也是衡量共識(shí)機(jī)制優(yōu)劣的重要標(biāo)準(zhǔn)之一。
二、隨機(jī)數(shù)生成算法優(yōu)劣的衡量標(biāo)準(zhǔn)
既然隨機(jī)數(shù)生成算法這么重要,那么一個(gè)好的隨機(jī)數(shù)生成算法應(yīng)該是什么樣子呢?從安全和實(shí)用角度而言,它應(yīng)當(dāng)滿足以下六大性質(zhì):
1. 去中心化(Distributed):隨機(jī)數(shù)的生成過(guò)程要是去中心化的,不能依賴(lài)或者借助可信第三方完成。
2. 不可預(yù)測(cè)(Unpredictable):根據(jù)歷史產(chǎn)生的隨機(jī)數(shù)或其他信息無(wú)法預(yù)測(cè)未來(lái)的隨機(jī)數(shù),這是“隨機(jī)”的基本要求。
3. 無(wú)偏性(Unbiased):任何人都無(wú)法通過(guò)計(jì)算能力或者后發(fā)優(yōu)勢(shì)去針對(duì)性左右隨機(jī)數(shù)的生成結(jié)果。
4. 均勻分布(Uniformity):輸出的隨機(jī)數(shù)在其值域內(nèi)是均勻分布的。
5. 保證輸出(Guaranteed Output Delivery):隨機(jī)數(shù)生成算法的參與者無(wú)法通過(guò)違背算法的方式使得無(wú)法輸出隨機(jī)數(shù),即必然會(huì)有隨機(jī)數(shù)輸出。
6. 公開(kāi)可驗(yàn)證(Publicly Verifiable):沒(méi)參與隨機(jī)數(shù)生成的節(jié)點(diǎn)可以以后驗(yàn)的方式,監(jiān)督協(xié)議的執(zhí)行,驗(yàn)證隨機(jī)數(shù)是可信和無(wú)偏的。
以上六大性質(zhì)對(duì)于隨機(jī)數(shù)生成算法至關(guān)重要,違背其中任意一條都可能會(huì)導(dǎo)致嚴(yán)重的安全漏洞。據(jù)區(qū)塊鏈安全公司PeckShield披露,EOS上有超過(guò)8個(gè)競(jìng)猜項(xiàng)目遭受黑客攻擊并獲利幾百萬(wàn)美元,嚴(yán)重威脅到了EOS正常生態(tài)秩序,而大部分攻擊成功的原因都與隨機(jī)數(shù)生成漏洞有關(guān)。我們以EOS.WIN項(xiàng)目為例,剖析其隨機(jī)數(shù)算法漏洞根源。
EOS.WIN支持的一個(gè)游戲是猜數(shù)字,即用戶輸入某個(gè)數(shù)字并壓大或者壓小,然后系統(tǒng)隨機(jī)生成一個(gè)數(shù)字,如果用戶壓對(duì)大小,則視為中獎(jiǎng)并獲取收益。顯然如果能夠控制系統(tǒng)隨機(jī)生成的數(shù)字,就可以左右游戲的結(jié)果。而決定EOS.WIN系統(tǒng)隨機(jī)數(shù)生成的因素為交易哈希ID、成交區(qū)塊高度、成交區(qū)塊前綴、全局開(kāi)獎(jiǎng)序號(hào)等。其中成交區(qū)塊高度、成交區(qū)塊前綴雖然是未來(lái)某區(qū)塊信息,但是在實(shí)施過(guò)程系統(tǒng)指定使用當(dāng)前同步到的最新塊信息,因而是確定的;同時(shí),交易哈希ID能夠通過(guò)交易內(nèi)action結(jié)合塊信息預(yù)先計(jì)算。于是隨機(jī)數(shù)的生成僅依賴(lài)于全局開(kāi)獎(jiǎng)序號(hào)了。攻擊者利用不斷制造錯(cuò)誤交易,造成交易狀態(tài)回滾,控制全局開(kāi)獎(jiǎng)序號(hào),從而控制隨機(jī)數(shù)的生成,直到中獎(jiǎng)。顯而易見(jiàn),EOS.WIN的隨機(jī)數(shù)生成算法不滿足上述的第二條性質(zhì)(不可預(yù)測(cè)性)和第三條性質(zhì)(無(wú)偏性),因此存在漏洞,最終被攻擊者有效攻擊。
三、星系共識(shí)隨機(jī)數(shù)生成算法
星系共識(shí)中的RNP星群借助承諾、零知識(shí)證明、門(mén)限秘密分享、門(mén)限簽名、橢圓曲線序?qū)Φ榷喾N密碼學(xué)手段,實(shí)現(xiàn)了安全高效的隨機(jī)數(shù)生成算法,為整個(gè)共識(shí)過(guò)程安全提供了數(shù)據(jù)基礎(chǔ)。為了能夠形象介紹隨機(jī)數(shù)生成算法的設(shè)計(jì)初衷以及其精妙之處,我們將其類(lèi)比一個(gè)簡(jiǎn)單的游戲:
紙牌游戲
Alice和Bob玩紙牌游戲,兩人分別秘密選一張撲克牌放在桌面下方,選定之后,同時(shí)將紙牌亮在桌面上。如果兩張紙牌的點(diǎn)數(shù)和為偶數(shù),則Alice獲勝;否則,為Bob獲勝。
這個(gè)游戲看似簡(jiǎn)單,但是在區(qū)塊鏈上公平的進(jìn)行并不容易,要通過(guò)多種手段防止Alice或者Bob作弊。我們接下來(lái)一步一步分析:
問(wèn)題1:Alice和Bob選定之后就不能再更換撲克牌,否則就可以根據(jù)對(duì)方撲克牌的點(diǎn)數(shù)決定自己撲克牌點(diǎn)數(shù),從而獲取勝利。例如,Alice如果可以更換撲克牌,那么只要保證自己所選撲克牌和Bob的撲克牌點(diǎn)數(shù)具有相同奇偶性,那么點(diǎn)數(shù)和總為偶數(shù),Alice便可以獲勝。
星系共識(shí)通過(guò)使用“承諾”(Commitment,在配圖中用CM指代Commitment)的方式來(lái)保證不會(huì)發(fā)生以上作弊行為?!俺兄Z”是一種密碼學(xué)工具,能夠保證在不暴露原始數(shù)據(jù)的基礎(chǔ)上,將其進(jìn)行“證據(jù)留存”,它和明文是一一對(duì)應(yīng)的,任何人都可以驗(yàn)證二者的對(duì)應(yīng)關(guān)系是否成立。
結(jié)合我們的例子形象理解就是,Alice和Bob將自己選定撲克牌撕一個(gè)小角下來(lái),放在桌面上,這個(gè)小角不會(huì)暴露撲克的點(diǎn)數(shù),而且只與撕壞的另一部分才能夠拼接為一張完整的撲克牌。在星系共識(shí)協(xié)議中,這是Random Beacon的DKG1(Decentralized Key GeneraTIon)階段,每個(gè)RNP(Random Number Proposer)節(jié)點(diǎn)計(jì)算其所選數(shù)據(jù)的承諾并發(fā)送到鏈上進(jìn)行存證。
問(wèn)題2:Alice和Bob在選好撲克牌之后,在正式亮牌之前要對(duì)自己的撲克牌保密,不能讓對(duì)方看到。同時(shí)在亮牌時(shí)候要證明這張牌確實(shí)是之前選定的牌,而不是新選的另一張牌。
星系共識(shí)通過(guò)公鑰加密算法加密原始數(shù)據(jù),之后將加密結(jié)果發(fā)送到鏈上,保證了數(shù)據(jù)的機(jī)密性;同時(shí)使用零知識(shí)證明保證上鏈的加密數(shù)據(jù)與承諾完全匹配。結(jié)合我們的例子形象理解就是,Alice和Bob將被撕過(guò)角的牌從桌下取出,扣在桌面上,并且二者都驗(yàn)證扣在桌面上的牌與之前放在桌上的小角能夠拼接為一張完整的紙牌。在星系共識(shí)協(xié)議中,這是Random Beacon的DKG2階段,每個(gè)RNP節(jié)點(diǎn)將其給其他節(jié)點(diǎn)的數(shù)據(jù)通過(guò)對(duì)方公鑰加密之后發(fā)送到鏈上(下圖中S1,S2,Sn為經(jīng)公鑰加密后的鏈上數(shù)據(jù)),同時(shí)發(fā)送到鏈上的還有DLEQ-Proof(非交互零知識(shí)證明),用于證明加密內(nèi)容與承諾CM是匹配的。這個(gè)階段之后,所有節(jié)點(diǎn)都可以從鏈上獲取其他節(jié)點(diǎn)發(fā)送的數(shù)據(jù),并且在本地解密為明文。
問(wèn)題3:開(kāi)牌之后,需要計(jì)算兩張撲克牌的點(diǎn)數(shù)。我們要保證Alice和Bob都要計(jì)算出同一正確結(jié)果。這個(gè)問(wèn)題看似很荒唐,但是卻非常重要。因?yàn)槟澄煌婕铱赡軙?huì)裝瘋賣(mài)傻,故意計(jì)算錯(cuò)數(shù)字,從而降低游戲進(jìn)行的效率。
星系共識(shí)通過(guò)使用分布式密鑰生成的算法解決了問(wèn)題3,即所有RNP節(jié)點(diǎn)通過(guò)交互生成一個(gè)共同的組密鑰(group secret key),這個(gè)密鑰不會(huì)完整出現(xiàn),而是分割為密鑰碎片,每一個(gè)RNP節(jié)點(diǎn)掌握一個(gè)密鑰碎片。之后,RNP節(jié)點(diǎn)能夠合成組密鑰簽名,而簽名的哈希值即為最終的隨機(jī)數(shù)輸出。由于組密鑰是公共確定的,因此組密鑰簽名也是唯一固定的。結(jié)合我們的例子形象理解就是,Alice和Bob會(huì)計(jì)算得到共同的點(diǎn)數(shù)。
問(wèn)題4:此時(shí),無(wú)論是Alice還是Bob都不能夠終止游戲的進(jìn)行。也就是一旦游戲開(kāi)始,就一定要正常結(jié)束,不能因?yàn)槟骋煌婕揖芙^配合游戲規(guī)則而導(dǎo)致游戲流產(chǎn)。
星系共識(shí)通過(guò)門(mén)限簽名的方式解決了問(wèn)題4,即只要超過(guò)門(mén)限值數(shù)量的RNP節(jié)點(diǎn)參與計(jì)算,就能夠合成組密鑰簽名。個(gè)別RNP節(jié)點(diǎn)拒絕參與計(jì)算并不會(huì)影響結(jié)果的生成。結(jié)合我們的例子形象理解就是,即使Alice不想亮牌,Bob也有能力將兩張牌亮出,從而完成游戲。
以上過(guò)程對(duì)應(yīng)于星系共識(shí)協(xié)議中Random Beacon的SIGN階段,在這一階段中RNP節(jié)點(diǎn)合作生成組密鑰簽名并計(jì)算得到隨機(jī)數(shù)輸出。
現(xiàn)在我們把上述過(guò)程梳理一下:1. Alice和Bob撲克牌的點(diǎn)數(shù)之和是二者共同決定的;2. 每一局游戲的點(diǎn)數(shù)和都是獨(dú)立的,不存在相互依賴(lài)的關(guān)系,因此歷史游戲數(shù)據(jù)沒(méi)有預(yù)測(cè)作用;3. Alice和Bob都無(wú)法提前知道對(duì)方的撲克牌點(diǎn)數(shù),因此沒(méi)有后發(fā)優(yōu)勢(shì)去左右點(diǎn)數(shù)之和;4. Alice和Bob可以選擇任何一張撲克牌,因此點(diǎn)數(shù)分布是均勻的;5. Alice和Bob都無(wú)法中斷游戲的進(jìn)行;6. 任何第三方都可以對(duì)游戲過(guò)程進(jìn)行審計(jì),因?yàn)樗袛?shù)據(jù)都在鏈上存證。
由以上分析可知,星系共識(shí)的隨機(jī)數(shù)算法滿足前文提到的六大性質(zhì),是安全高效的隨機(jī)數(shù)生成算法。