场景简介
对于合约来说,一般来说都是先被部署,然后才会才会发生相关的交易行为,进而产生数据和余额。但是有一种特殊情况,就是通过提前计算合约的地址,往里面转账。这样的话,如果合约创建后误以为自己的余额是零,以ether 余额去做一些逻辑处理,就会出错。
合约地址计算逻辑:通过合约部署账户和交易nonce,依次经过 rlp 和 sha3加密算法,截图如下
攻击场景
如果有这样一个抽奖合约,通过计算当前的账户余额是否达到设定值决定获奖用户,则可能出现问题,截图如下:
该合约每次只允许用户转账0.5,首先达到 1ether的话该用户就会成为幸运用户,正常情况下,第二个用户就会成为幸运用户。测试代码逻辑如下:
但是如果一开始就有人绕过合约规则,在合约产生前就给合约转账,那就永远没人可以中奖了,测试代码逻辑如下:
解决方式
解决方式其实也很简单,就是合约逻辑中尽量不要以 ether余额做相关逻辑处理,可以用自己申明的一个变量代替。