為何說區(qū)塊鏈彩票是一個(gè)糟糕的主意區(qū)塊鏈
為什么從區(qū)塊鏈中導(dǎo)出公平的、不可操縱的隨機(jī)數(shù)是困難的,因而像福利彩票這樣的彩票并不適合用區(qū)塊鏈來實(shí)現(xiàn)。
(圖片來自:MyRichFuture.com)
在今天的文章當(dāng)中,我會(huì)通過一個(gè)警示性的故事,來解釋為什么在區(qū)塊鏈上運(yùn)行彩票是一個(gè)糟糕的主意[1]。
場(chǎng)景是這樣的:Bitcoin Core開發(fā)者 Eric Lombrozo昨天秉著圣誕節(jié)的精神,決定贈(zèng)送1個(gè)BTC,他將其分成了10份,每份為0.1BTC,規(guī)則是:轉(zhuǎn)發(fā)他的推文,就有機(jī)會(huì)得到這筆獎(jiǎng)金。每份禮物的價(jià)值大約為1500美元[2](譯者注:文章創(chuàng)作時(shí)間為2017年12月25日)
為了證明這次贈(zèng)送活動(dòng)是公平的,他在推文中描述了自己提出的算法。我不會(huì)去討論其具體的技術(shù)細(xì)節(jié),你只需要明白,本質(zhì)上,他想要選擇一個(gè)隨機(jī)數(shù),比如說17,然后他會(huì)把這10份獎(jiǎng)勵(lì)分發(fā)給每一位得到隨機(jī)數(shù)17的人。為此,他組合了其預(yù)先確定的區(qū)塊高度的兩個(gè)區(qū)塊哈希,并導(dǎo)出與轉(zhuǎn)發(fā)數(shù)量相互質(zhì)的16位(bit)數(shù)字(H),所謂的互質(zhì)數(shù),僅僅意味著中獎(jiǎng)彩票號(hào)碼H和轉(zhuǎn)推文的數(shù)量沒有除1之外的公因數(shù)。然后,他索引操作了轉(zhuǎn)發(fā)列表10次,然后獎(jiǎng)勵(lì)每一個(gè)得到 (H)結(jié)果的推文轉(zhuǎn)發(fā)者。
現(xiàn)在,這個(gè)計(jì)劃是非常華麗和復(fù)雜的。但是,下面發(fā)生的關(guān)鍵操作很簡(jiǎn)單:他從兩個(gè)區(qū)塊哈希中導(dǎo)出了一個(gè)隨機(jī)數(shù)。我至少看到過十幾個(gè)以太坊Dapp使用了這種模式,如果你覺得自己已經(jīng)理解了這個(gè)問題,你可能會(huì)選擇停止閱讀。但請(qǐng)繼續(xù),因?yàn)檫@里面存在著多個(gè)問題,并且實(shí)際的漏洞并不是顯而易見的,即使一開始看起來是這樣的。
讓我們深入研究這個(gè)方案,并記錄下有趣的觀察和思考:
關(guān)于礦工攻擊的擔(dān)憂
這個(gè)計(jì)劃,表明上需要相當(dāng)擔(dān)心礦工對(duì)彩票操縱的可能。
每一個(gè)從區(qū)塊哈希導(dǎo)出隨機(jī)數(shù)的人,都應(yīng)該擔(dān)心礦工攻擊的問題。假想一下,一名礦工希望讓這個(gè)彩票變得不公平,他可以通過計(jì)算一個(gè)區(qū)塊并查看其哈希是否會(huì)給礦工帶來好的結(jié)果。如果不是好結(jié)果,這名礦工可以丟棄掉區(qū)塊,選擇不去公開。
但實(shí)際上,礦工攻擊并不是問題
但在這種情況下,對(duì)礦工的擔(dān)憂完全被夸大了,假設(shè)一名礦工為了這個(gè)特別的彩票,他必須放棄一個(gè)完好的比特幣區(qū)塊,因此他要失去超過20BTC (約合30萬美元)的獎(jiǎng)勵(lì),而得到的彩頭卻只有0.1BTC(1500美元)。
無論如何,有些人會(huì)過于偏執(zhí)于那些不會(huì)發(fā)生的事情。我們聽到過不少關(guān)于"中國礦工"[3]的消息,還有專門詆毀他們的紅迪子版塊。Core開發(fā)者總是不斷提醒我們要警惕中國礦工。也許額外的偏執(zhí)是被要求的。但至少,中國礦工們可能是無害的。
當(dāng)我們?cè)噲D關(guān)注礦工的時(shí)候,我們可能完全錯(cuò)過了其他更大的問題,對(duì)吧?
在這一點(diǎn)上,事情變得非常哲學(xué),所以我會(huì)放棄這一思路,我不認(rèn)為礦工是邪惡的。這里有一個(gè)充滿信息和模因的subreddit。
那么,這種方法能夠很好地牽制住礦工嗎?一點(diǎn)也不。該方案從兩個(gè)哈希的組合中導(dǎo)出隨機(jī)數(shù),分別在高度H和H 5。它無法確保這些區(qū)塊來自兩個(gè)獨(dú)立的礦工。如果兩個(gè)數(shù)字來自同一個(gè)礦工的話,那么挑選它們有什么意義嗎?
即使區(qū)塊H和區(qū)塊H 5來自不同的礦工,我們?cè)趺粗浪鼈儾皇且换锏模窟@似乎是一個(gè)不可逾越的問題。
好吧,無論如何它都是有問題的
但不管怎樣,這個(gè)方案都可以通過可預(yù)測(cè)的方式進(jìn)行破壞。挖掘第二個(gè)區(qū)塊的礦工,會(huì)知道第一個(gè)區(qū)塊是被誰挖到的,所以他完全控制了彩票的結(jié)果。所以,兩個(gè)礦工之間甚至不需要串通,因?yàn)榈诙€(gè)礦工已經(jīng)控制了結(jié)果。如果挑選了N個(gè)區(qū)塊的哈希,那么挖到最后一個(gè)區(qū)塊的礦工,依然可以控制結(jié)果。
但這并不重要
但是等等,在隨機(jī)性計(jì)算中的缺陷并不重要,因?yàn)槔硇缘牡V工不會(huì)發(fā)動(dòng)攻擊,因?yàn)槌杀具h(yuǎn)遠(yuǎn)高于潛在的獎(jiǎng)金。可是,假設(shè)是把一個(gè)國家級(jí)的彩票(例如福彩)放到區(qū)塊鏈上,那就是另外一回事了,但這個(gè)案例顯然不是,所以讓我們繼續(xù)前進(jìn)。
另外存在的漏洞
這就引出了一個(gè)更為根本的問題所在。這個(gè)特殊的方案選擇了一個(gè)隨機(jī)獲勝的數(shù)字,并給得到這個(gè)數(shù)字的人頒發(fā)獎(jiǎng)勵(lì)。其選取的隨機(jī)數(shù)僅受限于群體大小的互質(zhì)。組合H的選擇,并通過H*j mod N的算法限制了贏家的集合。
因此,一些數(shù)字較其它數(shù)字會(huì)更容易地被選為H。簡(jiǎn)單舉個(gè)例子來說明原因。想象一下, Eric的推文被轉(zhuǎn)發(fā)了1000次,那么與1000 互質(zhì)的潛在數(shù)字就有65534種。例如,2, 4, 5、6, 8和10不是互質(zhì)的,所以它們不是第一個(gè)被選取的數(shù)字。它們的倍數(shù)也不會(huì)被選擇。
現(xiàn)在,被選擇的數(shù)字可能是較小的,比如1,然后覆蓋前10個(gè)數(shù)字,包括2、4、5、6、8和10。
也可能會(huì)選中較大的數(shù)字,它環(huán)繞并覆蓋那些不會(huì)被覆蓋的數(shù)字。
但是,很可能有一些數(shù)字既沒有被選中的數(shù)覆蓋(即N的互質(zhì)數(shù)),也沒有被環(huán)繞的大數(shù)字所覆蓋(即mod N 互質(zhì)數(shù)的倍數(shù))。讓我們來看看這些不幸運(yùn)的數(shù)字。
有這么不幸的數(shù)字嗎?是的,事實(shí)證明,如果轉(zhuǎn)發(fā)了1000次,那么第20、25、40、50、60、75條轉(zhuǎn)發(fā)絕不可能獲勝!
更多的麻煩
我們不知道會(huì)發(fā)生多少轉(zhuǎn)發(fā),所以或許1000次轉(zhuǎn)發(fā)的不幸數(shù)字,和1001次轉(zhuǎn)發(fā)的不幸數(shù)字可能差別很大。
在這一點(diǎn)上,我們可以做一些理論分析,而現(xiàn)在是平安夜,要計(jì)算和檢驗(yàn)數(shù)字要容易得多。我們所能做的,就是對(duì)轉(zhuǎn)發(fā)的可能數(shù)量進(jìn)行迭代,看看是否有任何有利的位置和不利的數(shù)字,然后我們可以看出有多少占據(jù)優(yōu)勢(shì)的人,以及多少不幸的人。
我寫了一個(gè)小模擬器,檢查每一次轉(zhuǎn)發(fā)的結(jié)果,我把它放到了github上,任何人都可以查看,如果我錯(cuò)過了什么的話。
這里是圖形結(jié)果,用于模擬1000-4000范圍的推文轉(zhuǎn)發(fā)數(shù)。
我們可以看到,在已轉(zhuǎn)發(fā) Eric推文的1000人中,10號(hào)的轉(zhuǎn)發(fā)者中獎(jiǎng)率極高!他有641486種不同的獲勝方式。第二個(gè)有利位置是970號(hào),他有632404種獲勝的方式。而2號(hào), 8號(hào)和9號(hào)推文轉(zhuǎn)發(fā)也在前25之列。
Winners Losers ------- ------ 10 641486 143 475215 970 632404 336 473269 890 632321 672 472628 830 631763 756 470375 790 631226 528 468487 730 630904 840 464022 710 630818 780 461876 670 630004 660 455016 610 629438 420 454108 590 628902 924 440952
將高概率數(shù)字和尾部的低概率數(shù)字進(jìn)行比較,例如,第924次轉(zhuǎn)發(fā),它只有440952種獲勝的方式! 而第10次轉(zhuǎn)發(fā)的獲勝概率是第924次轉(zhuǎn)發(fā)的1.5倍!其它較低概率的數(shù)字,分別為420, 660, 780、840以及528。
更大的錯(cuò)誤
這一切看起來都很聰明。起初看這個(gè)機(jī)制是可以由礦工操縱的,但后來發(fā)現(xiàn)它們完全是不相關(guān)的,并且這個(gè)方案本身也有缺陷。其分布并不均勻,某些人獲勝的概率會(huì)大于其他人。
但是,這里還有一個(gè)更大,更明顯的錯(cuò)誤。我會(huì)給你一段時(shí)間思考。
這種彩票實(shí)際上更有利于運(yùn)行社交媒體操縱服務(wù)的人,如果你有一堆Twitter 馬甲賬號(hào),你就可以比誠實(shí)的參與者擁有更多的機(jī)會(huì)。如果你有1000個(gè)馬甲賬號(hào),并且實(shí)際轉(zhuǎn)發(fā)數(shù)只有1000條,那么上面這些花哨的數(shù)學(xué)和模擬實(shí)際上并不重要,你獲勝的幾率就是50% 。
更好的方法
那有什么更好的辦法嗎?均勻分布實(shí)際上是很難實(shí)現(xiàn)的。通常情況下,最簡(jiǎn)單的解決方案是最好的:獲取轉(zhuǎn)發(fā)列表,并基于區(qū)塊哈希導(dǎo)出的隨機(jī)數(shù)種子進(jìn)行洗牌操作(使用Knuth shuffle工具[4])然后你再把獎(jiǎng)?lì)C給前10的人。洗牌算法必須事先公布,那樣人們才不會(huì)認(rèn)為你從中作弊。當(dāng)然,即使你使用了這個(gè)計(jì)劃,你仍然可能會(huì)遭受女巫攻擊( Sybil attack)。
可Eric已經(jīng)宣布了這個(gè)特別的彩票計(jì)劃,他能夠立即改變規(guī)則嗎?如果這是一個(gè)智能合約,那就意味著一次硬分叉!
那么,我們能從這個(gè)案例中學(xué)到了什么?
從區(qū)塊鏈中導(dǎo)出公平的、不可操縱的的隨機(jī)數(shù)是困難的;
組合多個(gè)區(qū)塊哈希值無法免疫礦工攻擊,最后一名礦工可以完全控制結(jié)果;
如果你專注于不太可能的結(jié)果,你可能會(huì)錯(cuò)過更多可能的問題;
事實(shí)上,這個(gè)方案表現(xiàn)出了令人難以置信的不公平性,如果你能選擇好轉(zhuǎn)發(fā)的時(shí)機(jī),你可以擁有比其他人更大的優(yōu)勢(shì)。
這個(gè)游戲,仍然掌握在社交媒體巨魔(擁有大量馬甲賬號(hào))的手中。
1.事實(shí)上,就像現(xiàn)在每一個(gè)和比特幣相關(guān)的故事一樣,這次討論,也涉及到了區(qū)塊大小的爭(zhēng)論;
2.具體來說,在撰寫本文的時(shí)候,價(jià)值是1340美元,接受這筆資金要減去40美元的交易費(fèi),如果要使用的話,還需要花費(fèi)40美元的比特幣。
3.“中國礦工”幾乎總是被拿來和他們的國籍聯(lián)系在一起,彷佛他們都是來自同一個(gè)模子。是的,這并不合適。
4.非常感謝Nick Johnson所指出的,之前使用數(shù)百萬次交換的建議是低效的,并且只能漸進(jìn)地實(shí)現(xiàn)均勻分布。Knuth在這個(gè)主題上花費(fèi)了相當(dāng)多的時(shí)間,并提出了一個(gè)有效的解決方案。
1.TMT觀察網(wǎng)遵循行業(yè)規(guī)范,任何轉(zhuǎn)載的稿件都會(huì)明確標(biāo)注作者和來源;
2.TMT觀察網(wǎng)的原創(chuàng)文章,請(qǐng)轉(zhuǎn)載時(shí)務(wù)必注明文章作者和"來源:TMT觀察網(wǎng)",不尊重原創(chuàng)的行為TMT觀察網(wǎng)或?qū)⒆肪控?zé)任;
3.作者投稿可能會(huì)經(jīng)TMT觀察網(wǎng)編輯修改或補(bǔ)充。