以太坊蜜罐智能合約之新穎的賭博游戲區(qū)塊鏈
區(qū)塊鏈的去中心化給博彩行業(yè)帶來(lái)了新的機(jī)遇,然而久賭必輸這句話也不無(wú)道理。
1. 加密輪盤(pán)賭輪
合約關(guān)鍵代碼如下:
該合約設(shè)置了一個(gè) 1-20 的隨機(jī)數(shù)
secretNumber, 玩家通過(guò)調(diào)用 play() 去嘗試競(jìng)猜這個(gè)數(shù)字,如果猜對(duì),就可以取走合約中所有的錢(qián)并重新設(shè)置隨機(jī)數(shù) secretNumber。這里存在兩層貓膩。第一層貓膩就出在這個(gè) play()。play() 需要滿足兩個(gè)條件才會(huì)運(yùn)行:msg.value >= betPrice,也就是每次競(jìng)猜都需要發(fā)送至少 0.1 個(gè)以太幣。number <= 10,競(jìng)猜的數(shù)字不能大于 10。
由于生成的隨機(jī)數(shù)在 1-20 之間,而競(jìng)猜的數(shù)字不能大于 10, 那么如果隨機(jī)數(shù)大于 10 呢?將不會(huì)有人能競(jìng)猜成功!所有被用于競(jìng)猜的以太幣都會(huì)一直存儲(chǔ)在智能合約中。最終合約擁有者可以通過(guò) kill() 函數(shù)取出智能合約中所有的以太幣。
在實(shí)際的場(chǎng)景中,我們還遇到過(guò)生成的隨機(jī)數(shù)在 1-10 之間,競(jìng)猜數(shù)字不能大于 10 的智能合約。這樣的合約看似保證了正常的競(jìng)猜概率,但卻依舊是蜜罐智能合約!
1.2 開(kāi)放地址彩票
合約關(guān)鍵代碼如下:
OpenAddressLottery 的邏輯很簡(jiǎn)單,每次競(jìng)猜,都會(huì)根據(jù)競(jìng)猜者的地址隨機(jī)生成 0 或者 1,如果生成的值和 LuckyNumber 相等的話(LuckyNumber 初始值為 1),那么競(jìng)猜者將會(huì)獲得 1.9 倍的獎(jiǎng)金。對(duì)于安全研究人員來(lái)說(shuō),這個(gè)合約可能是這些蜜罐智能合約中價(jià)值最高的一個(gè)。在這里,我們將會(huì)使用一個(gè) demo 來(lái)說(shuō)一說(shuō) Solidity 編譯器的一個(gè) bug:
在運(yùn)行 test() 之前,addr、b、c、d 的值如下圖所示:
在運(yùn)行了 test() 之后,各值均被覆蓋。
這個(gè) bug 已經(jīng)被提交給官方,并將在 Solidity 0.5.0 中被修復(fù)。
截止筆者發(fā)文,Solidity 0.5.0 依舊沒(méi)有推出。這也就意味著,目前所有的智能合約都可能會(huì)受到該 bug 的影響。我們將會(huì)在 3.2.2 節(jié) 中說(shuō)一說(shuō)這個(gè) bug 可能的影響面。想了解蜜罐智能合約而非 bug 攻擊面的讀者可以跳過(guò)這一小節(jié)
對(duì)于該蜜罐智能合約而言,當(dāng) forceReseed() 被調(diào)用后,s.component4 = tx.gasprice*7; 將會(huì)覆蓋掉 LuckyNumber 的值,使之為 7。而用戶生成的競(jìng)猜數(shù)字只會(huì)是 1 或者 0,這也就意味著用戶將永遠(yuǎn)不可能贏得彩票。
1.3 以太幣競(jìng)爭(zhēng)游戲
合約關(guān)鍵代碼如下:
這個(gè)智能合約有趣的地方在于它設(shè)置了最大轉(zhuǎn)賬上限是 50 finney,最小轉(zhuǎn)賬下限是 2 wei(條件是大于 1 wei,也就是最小 2 wei)。每次轉(zhuǎn)賬之后,最大轉(zhuǎn)賬上限都會(huì)縮小成原來(lái)的一半,當(dāng)總轉(zhuǎn)賬數(shù)量大于等于 100 finney,那就可以取出莊家在初始化智能合約時(shí)放進(jìn)的錢(qián)。
假設(shè)我們轉(zhuǎn)賬了 x 次,那我們最多可以轉(zhuǎn)的金額如下:50 50(1/2)^1 50(1/2)^2 50(1/2)^3 ...... 50(1/2)^x
根據(jù)所學(xué)的知識(shí)我們可以知道,該數(shù)字將會(huì)永遠(yuǎn)小于 100
50(1/2)^0 50(1/2)^1 50(1/2)^2 50(1/2)^3 ...... < 50*2
該智能合約中設(shè)置的贏取條件就是總轉(zhuǎn)賬數(shù)量大于等于 100 finney。這也就意味著,沒(méi)有人可以達(dá)到贏取的條件!
1.TMT觀察網(wǎng)遵循行業(yè)規(guī)范,任何轉(zhuǎn)載的稿件都會(huì)明確標(biāo)注作者和來(lái)源;
2.TMT觀察網(wǎng)的原創(chuàng)文章,請(qǐng)轉(zhuǎn)載時(shí)務(wù)必注明文章作者和"來(lái)源:TMT觀察網(wǎng)",不尊重原創(chuàng)的行為T(mén)MT觀察網(wǎng)或?qū)⒆肪控?zé)任;
3.作者投稿可能會(huì)經(jīng)TMT觀察網(wǎng)編輯修改或補(bǔ)充。