第三篇: 未知的ether

场景简介

        对于合约来说,一般来说都是先被部署,然后才会才会发生相关的交易行为,进而产生数据和余额。但是有一种特殊情况,就是通过提前计算合约的地址,往里面转账。这样的话,如果合约创建后误以为自己的余额是零,以ether 余额去做一些逻辑处理,就会出错。

        合约地址计算逻辑:通过合约部署账户和交易nonce,依次经过 rlp 和 sha3加密算法,截图如下

合约地址生成逻辑

攻击场景

            如果有这样一个抽奖合约,通过计算当前的账户余额是否达到设定值决定获奖用户,则可能出现问题,截图如下:

抽奖合约

        该合约每次只允许用户转账0.5,首先达到 1ether的话该用户就会成为幸运用户,正常情况下,第二个用户就会成为幸运用户。测试代码逻辑如下:


正常情况

但是如果一开始就有人绕过合约规则,在合约产生前就给合约转账,那就永远没人可以中奖了,测试代码逻辑如下:

异常情况下


解决方式

        解决方式其实也很简单,就是合约逻辑中尽量不要以 ether余额做相关逻辑处理,可以用自己申明的一个变量代替。   

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容