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