EOS智能合约的功与防-拒绝转账

从World Conquest 被攻击说起

World Conquest的游戏规则采用了FOMO模式,如果你是最后一位购买者,那么你可以获得奖池里面大部分的钱。

假如你是普通玩家,你肯定是一只盯着网页,到了最后10s左右,如果没有人购买的话,你就只好买入…

然后希望在后续10分钟内,所有的玩家都不要买入,这样你就能获得了大奖…

那如果你是一位技术流玩家的话,你会怎么做呢?

World Conquest 有一个缴税规则,所有购买地图的玩家,都需要向世界领主缴税(也就是每当有人购买某个地图后,合约都会给世界领主 这个玩家打一笔钱。

因为EOS内,所有的账号都可以部署合约,那么假如 我先用我的小号成为最后一位购买者,然后我用世界领主这个账号 部署合约

拒绝合约账号给我打钱,那么我只要默默等待时间结束,我就成为了最后一位玩家。(因为别人购买的时候 会触发给你打钱的动作,但是因为这个动作被拒绝了,所以导致整个交易失败,然后也就购买不成功…

攻击再优化一点

在前面说了,世界账号是部署了合约,拒绝了 World Conquest 这个合约给他打钱.

但是其实这样是有一些问题的,假如说 游戏结束后,系统是自动发奖的…那么因为你拒绝了该合约给你打钱..。

那么你也就拿不到奖…(当然现实是 手动打钱,因为合约时间到了后,只能手动打,你需要在开发者给你打钱之前 把合约重新部署下,就可以了)

当然这个方法不怎么好,如何把细节完善好呢…

一个简单的方法 就是判断打进来的钱的金额(因为缴税的金额肯定是比较低的,而大奖金额是比较多的…

或者通过memo来判断,也是一样的…

快神话被攻击

昨天上线一款新的资金盘类游戏…

游戏有个规则是 最后奖池的20%分给最低价值英雄的玩家…

那么 如何成为拥有最低价值英雄的玩家呢…

  1. 在标语里面写上 买我这个英雄的都是SX 之类的
  2. 技术流当然是使用上面攻击World Conquest相同的方法了…

如何防止这种攻击呢?

World Conquest是怎么做的呢?

World Conquest在新开第二盘的时候,使用了记账的方式 来避免被攻击…

正常来说,有人购买你的地后,你就能拿到赚的钱,这笔钱会直接转到你的账号上(上面说的攻击就是拒绝这笔转账汇入)

World Conquest是在有人购买你的地后,不给你转钱,而是帮你记一笔账…

当然你可以随时来提取你的奖金…

当然这种方式肯定是被玩家喷了…不能立马复投的资金盘还叫资金盘么…

有没有更好的办法

防止这种攻击的方法其实很简单…就是把购买动作和转钱分开…

那么只要在购买成功后,发起一笔延时交易,给用户打钱.这样购买与转钱的动作就分开了…

而且还有个好处是,假如用户恶意拒绝合约给他转钱的话,那么这笔钱会留在你的合约…(算是惩罚了 恶意用户)

当然不是所有的方法都是完美的…

这个方法有一个问题是…因为延时交易是需要 合约出CPU的…

目前我还没有测试 到底是在发出延时的时候 扣CPU,还是延时发生的时候才扣

假如是第一种情况…还好,毕竟用户无法买入了…(可能会去你群里与你沟通

假如是第二种情况…正常用户买入了,而合约却没有把钱给上一个玩家…那么你肯定要被用户喷死…

当然解决方法也不是很难

  1. 你可以提前多去租点CPU,就能避免CPU不足的问题了
  2. 可以参考系统解除质押发出的延时 如果出错怎么处理的…

总结

目前EOS上,各种斗智斗勇的故事在发生…

欢迎来EOS上玩…

推荐文章