區(qū)塊鏈隨機(jī)數(shù)的安全性闡述
本文將從EOS DApp 攻擊事件出發(fā),以科普角度闡述安全隨機(jī)數(shù)的標(biāo)準(zhǔn)及現(xiàn)行公鏈上隨機(jī)數(shù)的生成機(jī)制。
自去年6月EOS主網(wǎng)上線之后,陸續(xù)發(fā)生DApp的智能合約被黑客入侵的事件,其中泛隨機(jī)數(shù)攻擊事件占了大多數(shù),以下是攻擊事件列表:
以上19起EOS DApp攻擊事件,總共造成了超過(guò)100萬(wàn)美元的損失,其中14起為隨機(jī)數(shù)攻擊,另外5起為回滾攻擊,這些攻擊都直接或間接地與隨機(jī)數(shù)有關(guān),可稱為泛隨機(jī)數(shù)攻擊。隨著這些攻擊事件的發(fā)生,區(qū)塊鏈上隨機(jī)數(shù)的安全性也越來(lái)越被廣泛關(guān)注。
什么是「安全」的隨機(jī)數(shù)?
先想想我們對(duì)隨機(jī)數(shù)的要求是什么,生活中很多地方會(huì)用到隨機(jī)數(shù),當(dāng)它至關(guān)重要時(shí),我們才會(huì)要求它「公正」、「安全」。例如樂(lè)透彩開(kāi)獎(jiǎng)時(shí),樂(lè)透公司讓大家的檢驗(yàn)方式是租一個(gè)頻道,預(yù)先讓第三方背書(shū)數(shù)組公正的彩球,公開(kāi)在頻道上取一組彩球,將彩球放到抽獎(jiǎng)箱中打亂,再一顆一顆吸出彩球得到號(hào)碼,用意就是為了讓大家相信抽簽的過(guò)程是公正的。
然而,這也未必能真正達(dá)到公正,比如說(shuō),這第三方和樂(lè)透公司共謀時(shí),可以在彩球裝上磁鐵,最后只有有磁鐵的彩球會(huì)被吸出來(lái),讓這看似隨機(jī)的過(guò)程其實(shí)并不隨機(jī)。
至此,我們先做一個(gè)小結(jié)論,一個(gè)好的隨機(jī)數(shù)應(yīng)該要滿足以下三個(gè)特質(zhì):
· 無(wú)法被操縱或預(yù)測(cè)(不能用磁鐵改變抽中的彩球)
· 可以被公眾驗(yàn)證其隨機(jī)性(大家可以相信開(kāi)球過(guò)程是真的隨機(jī))
· 無(wú)需信任第三方(不需要找律師確認(rèn)彩球沒(méi)問(wèn)題)
除了現(xiàn)實(shí)生活中的樂(lè)透開(kāi)獎(jiǎng)之外,開(kāi)發(fā)程式時(shí)也常會(huì)需要隨機(jī)數(shù),譬如競(jìng)猜、Du博、隨機(jī)分配任務(wù)等,我們先有了隨機(jī)數(shù)的概念后,再來(lái)看目前區(qū)塊鏈上的隨機(jī)數(shù)有什么問(wèn)題。
區(qū)塊鏈上的隨機(jī)數(shù)是怎么來(lái)的?
目前EOS 跟Ethereum 都沒(méi)有提供官方的隨機(jī)數(shù)生成服務(wù),如果開(kāi)發(fā)者需要在智能合約上使用隨機(jī)數(shù)的話,他們有兩個(gè)選擇 — — 自己產(chǎn)生隨機(jī)數(shù)或是仰賴第三方oracle。
Ethereum 官方推薦使用Oraclize (一個(gè)第三方的oracle 服務(wù))來(lái)產(chǎn)生隨機(jī)數(shù),但去中心化的區(qū)塊鏈要仰賴中心化的第三方提供隨機(jī)數(shù),完全就是本末倒置。而且對(duì)于一個(gè)熱門(mén)的DApp 來(lái)說(shuō),頻繁的調(diào)用第三方的oracle 是很昂貴的,可能還會(huì)增加完成步驟所需的transaction 數(shù),而造成DApp 的latency 增加,所以大多數(shù)開(kāi)發(fā)者都傾向自己產(chǎn)生隨機(jī)數(shù)。
問(wèn)題來(lái)了,在官方不提供隨機(jī)數(shù)生成服務(wù)的狀況下,公鏈上的開(kāi)發(fā)者只能自行根據(jù)公鏈上能取到的各種變量來(lái)作為隨機(jī)數(shù)種子,而這些變量往往來(lái)自于區(qū)塊的訊息,這么做很容易讓有心人士可以去預(yù)測(cè)隨機(jī)數(shù)。
舉例來(lái)說(shuō),前陣子被攻擊的EOSDice 就是采用了tapos_block_prefix() 跟tapos_block_num() 這兩個(gè)變量作為隨機(jī)數(shù)種子,而它們正是下注transacTIon的「前一個(gè)區(qū)塊」的資訊。
聰明的讀者可能已經(jīng)發(fā)現(xiàn)哪里不對(duì)勁了,隨機(jī)數(shù)的種子居然在下注前就已經(jīng)形成了!駭客正是看出了這個(gè)規(guī)則,才能預(yù)測(cè)出「必定中注」的隨機(jī)數(shù),在不公平的狀況下贏走莊家的錢(qián)。
EOSDice在第一次黑客事件后,旋即修正了隨機(jī)數(shù)生成的方式,開(kāi)發(fā)者改用雙重的deferred acTIon延遲了開(kāi)獎(jiǎng)的時(shí)間,使得reference block變成下注時(shí)還未生成的區(qū)塊,如此一來(lái)就無(wú)法事先取得區(qū)塊資訊。但道高一尺魔高一丈,駭客直接寫(xiě)了一個(gè)合約去模擬EOSDice合約的行為,只要兩種合約運(yùn)行在同一個(gè)區(qū)塊,就會(huì)refer相同的block,進(jìn)而得到相同的區(qū)塊資訊,于是乎EOSDice又被駭了第二次…
由于公鏈上的區(qū)塊資訊是公開(kāi)的,現(xiàn)行在智能合約中采用「區(qū)塊資訊」生成隨機(jī)數(shù)的做法,其安全性不管再怎么設(shè)計(jì)都會(huì)有其極限。一個(gè)好的隨機(jī)數(shù)生成方式不應(yīng)該仰賴第三方oracle ,且必須滿足「不可被預(yù)測(cè)」的特質(zhì),就這點(diǎn)看來(lái), EOS 跟Ethereum 都還還做得不夠好。
當(dāng)EOS的技術(shù)長(zhǎng)Daniel Larimer被開(kāi)發(fā)者問(wèn)到隨機(jī)數(shù)安全性的問(wèn)題時(shí),他提出了一個(gè)「信任區(qū)塊生產(chǎn)者」的方案— —區(qū)塊生產(chǎn)者在打包交易時(shí),在某個(gè)特定時(shí)機(jī)獲取特定訊息,以此作為隨機(jī)數(shù)種子來(lái)生成偽隨機(jī)數(shù)。雖說(shuō)這是一個(gè)鏈上的解決方案,但這種做法其實(shí)跟仰賴oracle的本質(zhì)并無(wú)不同,一樣都是由一個(gè)中心化的第三方來(lái)提供隨機(jī)數(shù),EOS的DPoS制度已經(jīng)賦予少數(shù)區(qū)塊生產(chǎn)者極大的權(quán)力,若他們還能直接參與隨機(jī)數(shù)生成的過(guò)程,那中心化的風(fēng)險(xiǎn)就更高了。
如果公鏈隨機(jī)數(shù)的安全性問(wèn)題一直存在,那么任何需要「公平隨機(jī)數(shù)」的程式邏輯就無(wú)法安心地運(yùn)行在公鏈上,這對(duì)整個(gè)區(qū)塊鏈生態(tài)系的發(fā)展都有不利的影響。





