从World Conquest 被攻击说起
World Conquest的游戏规则采用了FOMO模式,如果你是最后一位购买者,那么你可以获得奖池里面大部分的钱。
假如你是普通玩家,你肯定是一只盯着网页,到了最后10s左右,如果没有人购买的话,你就只好买入…
然后希望在后续10分钟内,所有的玩家都不要买入,这样你就能获得了大奖…
那如果你是一位技术流玩家的话,你会怎么做呢?
World Conquest 有一个缴税规则,所有购买地图的玩家,都需要向世界领主缴税(也就是每当有人购买某个地图后,合约都会给世界领主 这个玩家打一笔钱。
因为EOS内,所有的账号都可以部署合约,那么假如 我先用我的小号成为最后一位购买者,然后我用世界领主这个账号 部署合约
拒绝合约账号给我打钱,那么我只要默默等待时间结束,我就成为了最后一位玩家。(因为别人购买的时候 会触发给你打钱的动作,但是因为这个动作被拒绝了,所以导致整个交易失败,然后也就购买不成功…
攻击再优化一点
在前面说了,世界账号是部署了合约,拒绝了 World Conquest 这个合约给他打钱.
但是其实这样是有一些问题的,假如说 游戏结束后,系统是自动发奖的…那么因为你拒绝了该合约给你打钱..。
那么你也就拿不到奖…(当然现实是 手动打钱,因为合约时间到了后,只能手动打,你需要在开发者给你打钱之前 把合约重新部署下,就可以了)
当然这个方法不怎么好,如何把细节完善好呢…
一个简单的方法 就是判断打进来的钱的金额(因为缴税的金额肯定是比较低的,而大奖金额是比较多的…
或者通过memo来判断,也是一样的…
快神话被攻击
昨天上线一款新的资金盘类游戏…
游戏有个规则是 最后奖池的20%分给最低价值英雄的玩家…
那么 如何成为拥有最低价值英雄的玩家呢…
- 在标语里面写上 买我这个英雄的都是SX 之类的
- 技术流当然是使用上面攻击World Conquest相同的方法了…
如何防止这种攻击呢?
World Conquest是怎么做的呢?
World Conquest在新开第二盘的时候,使用了记账的方式 来避免被攻击…
正常来说,有人购买你的地后,你就能拿到赚的钱,这笔钱会直接转到你的账号上(上面说的攻击就是拒绝这笔转账汇入)
World Conquest是在有人购买你的地后,不给你转钱,而是帮你记一笔账…
当然你可以随时来提取你的奖金…
当然这种方式肯定是被玩家喷了…不能立马复投的资金盘还叫资金盘么…
有没有更好的办法
防止这种攻击的方法其实很简单…就是把购买动作和转钱分开…
那么只要在购买成功后,发起一笔延时交易,给用户打钱.这样购买与转钱的动作就分开了…
而且还有个好处是,假如用户恶意拒绝合约给他转钱的话,那么这笔钱会留在你的合约…(算是惩罚了 恶意用户)
当然不是所有的方法都是完美的…
这个方法有一个问题是…因为延时交易是需要 合约出CPU的…
目前我还没有测试 到底是在发出延时的时候 扣CPU,还是延时发生的时候才扣
假如是第一种情况…还好,毕竟用户无法买入了…(可能会去你群里与你沟通
假如是第二种情况…正常用户买入了,而合约却没有把钱给上一个玩家…那么你肯定要被用户喷死…
当然解决方法也不是很难
- 你可以提前多去租点CPU,就能避免CPU不足的问题了
- 可以参考系统解除质押发出的延时 如果出错怎么处理的…
总结
目前EOS上,各种斗智斗勇的故事在发生…
欢迎来EOS上玩…
本文作者:高金
本文地址: https://igaojin.me/2018/11/23/EOS智能合约的功与防/
版权声明:转载请注明出处!