EpicDice因为被掏空而暂停 & 简单分析一下来龙去脉

in #cn5 years ago

昨天看了刘美女@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就有机会了。😏

看来我这想法还是不成熟,抛砖引玉吧。

相关链接


Vote For Me As Witness
https://steemit.com/~witnesses type in oflyhigh and click VOTE

Vote @oflyhigh via Steemconnect
Thank you!

Sort:  

這個問題蠻有趣的。我上網查閱一些隨機的資料,結合我以前大學當幹部時搞得線上數支做法,也提出我的建議。
可以由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!

Coin Marketplace

STEEM 0.25
TRX 0.19
JST 0.036
BTC 92920.99
ETH 3299.26
USDT 1.00
SBD 3.81