EOS DICE随机数被攻破:区块链游戏需要开源吗

尚力财经 265 0

EOS DICE随机数被攻破:区块链游戏需要开源吗-第1张图片-尚力财经

今天醒来看到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(mixd);校验和256结果;sha256((char*)mixedChar,sizeof(mixedChar),result);uint 64 _ trandom _ num=*(uint 64 _ t *)(result . hash[0])*(uint 64 _ t *)(result . hash[8])*(uint 64 _ t *)(result . hash[16])*(uint 64 _ t *)(result . hash[24]);return(uint8_t)(random_num0 1);}

你可以看到生成随机数有几个特别的东西

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(mixd);校验和256结果;sha256((char*)mixedChar,sizeof(mixedChar),result);uint 64 _ trandom _ num=*(uint 64 _ t *)(result . hash[0])*(uint 64 _ t *)(result . hash[8])*(uint 64 _ t *)(result . hash[16])*(uint 64 _ t *)(result . hash[24]);print('random'random_num0 1);//return(uint 8 _ t)(random _ num % 100 1);资产支出=资产(10000,S(4,EOS));action(permission_level{_self,N(active)},N(eosio.token),N(transfer),std:make_tuple(_self,N(eosbocai2222),payout,std:string('dice-rrr-50-'))。send();}

进行测试截图

EOS DICE随机数被攻破:区块链游戏需要开源吗-第2张图片-尚力财经

。可以看到除了taposblockblock,其他都是一样的。

taposblockblock每次都应该为1。Taposblockblock不知道生成规则,但是如果它在一个块中,应该可以得到相同的。

事件回顾根据官方账号找到了一张黑客攻击的截图

EOS DICE随机数被攻破:区块链游戏需要开源吗-第3张图片-尚力财经EOS DICE随机数被攻破:区块链游戏需要开源吗-第4张图片-尚力财经尚力财经小编2022EOS DICE随机数被攻破:区块链游戏需要开源吗-第5张图片-尚力财经不知道黑客代码怎么写?他现在改了合同…把钱转到交易所

(希望可以开源。在这种情况下,其他骰子被攻击的时候就不会那么惨了。)

好像是早些时候公布的。不知道自动检测功能能不能把人叫醒(哈哈哈)

总结和反思

EOS DICE随机数被攻破:区块链游戏需要开源吗-第6张图片-尚力财经

尚力财经小编2022 B:因为开源透明代码是可见的,所以更公平。你最近玩了什么?B:菠菜对B:EOS。a:是开源的吗?b:不

我一直觉得区块链合约一定是开源的。不然他们和别人有什么区别?为什么我个人会给这个游戏投票?就是因为这个游戏是开源的,符合我理想中的区块链游戏,不会黑我……

EOS DICE随机数被攻破:区块链游戏需要开源吗-第7张图片-尚力财经我以为他已经大到可以给整个社区起带头作用了,告诉大家开源合约没什么不好。区块链游戏只需要开源!

不过还好损失不大。

最后借用老猫的一张图

本文由专栏作家高进上传发布。未经允许,请勿转载。

本文发表于知乎专栏【区块链发展指北】

标签: do 2022

抱歉,评论功能暂时关闭!

微信号已复制,请打开微信添加咨询详情!