EpicDice因为被掏空而暂停 & 简单分析一下来龙去脉
昨天看了刘美女@deanliu的帖子[EpicDice] 內心不夠亂,暫時停止營業,我不由得想起了一首老歌《我的心太乱》。
(图源 :pexels.com)
我的心太乱
要一些空白
你若是明白
让我暂时的离开
我的心太乱
不敢再贪更多爱
想哭的我
却怎么哭也哭不出来
扯远了,不知道EpicDice的人 @epicdice是不是想哭,是不是想哭却怎么也哭不出来?😳
综合一下刘美女的帖子以及@themarkymark 的帖子Epic Dice shut down due to witness cheating 还有@mys 自辩贴How 'Above 99' player outplayed Epic Dice 我大致理清了来龙去脉。
漏洞原理
首先,一定是EpicDice为了可证明的公平(Provably-fair)公布了验证程序,这很正常,如果投注和开奖不可验证,那么服务提供商就有可能在后台控制开奖结果,就没有所谓的公平可言了。
而这整个开奖/验证机制呢,都是基于区块链上一个不可更改的条目,就是操作的transaction ID,简称txid,举例说我发文章或者投票等操作,都会生成一个txid,当广播到区块链上,这个东西被写入区块就再也无法修改了。并且txid的生成具有一定的随机性,所以看起来很适合做掷色子应用。
不过问题就出在这里,尽管txid的生成有一定的随机性,但是txid这个东西是在广播到网络之前就被生成的,也就是说是在本地生成的。
举例说做一个猜大小游戏,规则是我生成一个10以内的随机数,然后告诉你,然后大于等于5我赢,小于5你赢。但是我生成随机数之前过滤一下,生成小的我再重新生成一次,再告诉你,那这样我就稳赢。
来龙去脉
@mys 就是用的类似操作,在本地构造转账(投注)交易,然后去生成transaction,然后去判断生成的txid是否符合中奖规则,符合中奖规则就广播,否则就重新生成,这样就是稳赚了。
至于生成txid的原理,我在之前的一篇文章中曾经有过介绍:如何从steem transaction 获取txid?。
也就是说,将Signed_Transaction的签名部分清空,序列号后生成摘要,取摘要的前20个字节,并转换成16进制字符串形式(40个字节)。
尽管我的文章中说的是从transaction中计算出txid,但是自己构造transaction并计算txid其实是一样的,至于同样的transaction为什么可以生成不同的txid,这个其实也很简单,只要修改expiration这个时间因素就可以。
@mys的文章中公布了代码,是用beem实现的,非常简单。
所以简单总结一下就是:
- EpicDice 使用txid作为计算中奖的依据
- txid可以本地生成,生成符合中奖条件的txid再广播,就会稳中
- @mys利用这个漏洞稳赚了一笔
- 任何人都可以这样操作
至于@mys这么做是否厚道,本文不做评论。
我只想说的是,这事真的和见证人没有一毛钱关系,见证人不背这锅。
安全性的思索
受@john371911提问的启发,我想了一下,怎样才能更安全?
或许把算法中f(txid)
改成f(next_block_hash+txid)
,其中next_block_hash
为投注区块的下一区块的块hash,这样见证人想作弊也要傻眼吧?
比如hash(next_block_hash+txid)
替代以前的txid
。
就算见证人想利用出块作弊,你能控制得了自己的出块,还能控制下一个块不成? 不过换个角度,前一个块广播txid,我这个块再生成指定hash就有机会了。😏
看来我这想法还是不成熟,抛砖引玉吧。
相关链接
- [EpicDice] 內心不夠亂,暫時停止營業
- Epic Dice shut down due to witness cheating
- How 'Above 99' player outplayed Epic Dice
https://steemit.com/~witnesses type in
oflyhigh
and click VOTE
Vote @oflyhigh via Steemconnect
Thank you!
這個問題蠻有趣的。我上網查閱一些隨機的資料,結合我以前大學當幹部時搞得線上數支做法,也提出我的建議。
可以由epidice給一個字串,例如: abcde, epidice 20190901,加密後每天開始時鏈上發佈,每天結束時解密以公証證明公平性。epidice 20190901可作為驗證用,無論前面字串多亂數,後面解出來有這個簽章為真。然後每次下注就用已經規定好的方式對abcde進行規定好次數的雜湊(例如公布加密資料後,第一次賭雜湊一次,第二次賭時雜湊兩次),加入作為隨機種子,這個我叫ED_nonce.
除了epidice, 也可以規定其他人聯絡epidice,發佈nonce到鏈上摻入隨機種子,用多久後解密。
這樣一來,隨機種子就有block_hash+txid+ED_nonce+xxx_nonce+ooo_nonce+……
這時,要攻破隨機種子,要能盜到epidice保有的各個nonce.
如果還不夠亂,還可以再加上各家交易所要開骰子前一刻的幣價,例如 幣安BTC/TUSD, BF_ETH/USDT...關於這些隨機種子要不要再雜湊一下增加亂度,我就不清楚了。甚至除了幣價,匯率也可以加進去。重點就是這些是難以控制,事後又能公共驗證證明Epidice的公平性。這樣隨機種子有
block_hash+txid+ED_nonce+xxx_nonce+ooo_nonce+…+幣安BTC/TUSD, BF_ETH/USDT+…
要能影響,作弊的難度應該增加很多了。
这是个好主意,呼叫 @deanliu @fr3eze
John哥威武!
确实是个好主意,其实 ED 很快就推出了结合 Server seed + Transaction ID 的乱数产生方法。这套方案和上述的概念其实是一样的,就是在自家后台产生一个私人乱数结合 TXID 作为 nonce ,那么除非后台被攻破,否则是破解不了的。其实很多区块链游戏也是利用这样的方案,对我个人而言,其实不是很喜欢这样的方式。可以 100% 使用线上产生的乱数那就是最好最干净。但目前这样也算是不错了,安全有效,也算是这样了。
Thank you so much for participating in the Partiko Delegation Plan Round 1! We really appreciate your support! As part of the delegation benefits, we just gave you a 3.01% upvote! Together, let’s change the world!