今天醒来看到eosDICE随机数居然被攻破了?
之前看过代码,觉得挺安全的。看来我还是太有味道了
随机数代码如下(来自GitHub)
uint 8 _ t random(account _ name name,uint 64 _ tgame _ id){ asset pool _ EOS=EOS io:token(n automixd=tapos _ block _ prefix()* tapos _ block _ num()name game _ id-current _ time()pool _ EOS . amount;const char * mixed char=reinterpret _ cast你可以看到生成随机数有几个特别的东西
game_id这是增量的,可以得到account_name这是玩家的用户名,可以得到pool_eos这是当前合约的余额。如果短时间没人玩,就是taposblockprefix taposblocknum,可以得到一个固定值。这两个是块内的值。如果我用契约攻击,可以得到current_time的当前时间戳(契约用的是延迟事务)当时看到这个契约的时候,其实也想过怎么攻击,但是发现变量很多,应该很难。攻击契约需要满足以下条件
。短时间内没人玩,否则gameid和pooleos会发生变化,导致你的攻击失败。你一定要把攻击契约和结果的时间控制在一个区块内,否则在taposblockprefix taposblocknum这两个数字会发生变化之前,我一直觉得是我不能攻击的时间,因为契约拿的是未来的时间(其实如果eos延迟契约运行的话,后面加上时间就好了。)如果你想明白这一点,也许我才是那个发财的人……我写了一个模拟攻击契约。不知道是不是因为本地测试的原因。taposblockprefix taposblocknum一直配不上
其实我是想直接从合同里拿到他的game_id。但是一直没有成功……
Void Charity:Hi(uint 64 _ TGAME _ ID){ Asset Pool _ EOS=EOS IO:Token(n(EOS IO。Token))。Get _ balance (n (EOS Bocai222),symbol _ type (s (4,EOS))pool _ EOS . amount=9985;uint 64 _ TT=当前时间();t=1000000automixd=tapos _ block _ prefix()* tapos _ block _ num()_ self game _ id-t pool _ EOS . amount;const char * mixed char=reinterpret _ cast进行测试截图
。可以看到除了taposblockblock,其他都是一样的。
taposblockblock每次都应该为1。Taposblockblock不知道生成规则,但是如果它在一个块中,应该可以得到相同的。事件回顾根据官方账号找到了一张黑客攻击的截图
尚力财经小编2022不知道黑客代码怎么写?他现在改了合同…把钱转到交易所
(希望可以开源。在这种情况下,其他骰子被攻击的时候就不会那么惨了。)好像是早些时候公布的。不知道自动检测功能能不能把人叫醒(哈哈哈)
总结和反思
尚力财经小编2022 B:因为开源透明代码是可见的,所以更公平。你最近玩了什么?B:菠菜对B:EOS。a:是开源的吗?b:不我一直觉得区块链合约一定是开源的。不然他们和别人有什么区别?为什么我个人会给这个游戏投票?就是因为这个游戏是开源的,符合我理想中的区块链游戏,不会黑我……
我以为他已经大到可以给整个社区起带头作用了,告诉大家开源合约没什么不好。区块链游戏只需要开源!
不过还好损失不大。
最后借用老猫的一张图
本文由专栏作家高进上传发布。未经允许,请勿转载。
本文发表于知乎专栏【区块链发展指北】
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站不拥有所有权,不承担相关法律责任。如发现有侵权/违规的内容, 请联系我们:dudu818907@gmail.com,本站将立刻清除。