Bubbles~blog

用爱发电

solidity中的继承杂谈

原文已首发于安全客
https://www.anquanke.com/post/id/150310

这个我也懒得搬了,还是有兴趣的去链接看吧,主要是在这补充点东西,因为安全客提交后就不可更改了,想加也没法加,而且复审的时候稿子都看不见了,不知道他们后台什么鬼,我还以为稿子被吞了,就很郁闷

针对文章里提到的getter变量覆盖函数的操作,我也写了一个蜜罐合约的简单主体,如下

 
pragma solidity ^0.4.24;
 
contract A {
    address public owner;
    address p =this;
    function A(){
        owner=msg.sender;
    }
    function change()  {
        require(msg.sender==p);
        owner=tx.origin;
    }
 
}
contract B{
 
        uint public change =123;
}
 
contract C is A,B{
    uint256 value =1 ether;
    function test()public payable{
        if(msg.value>=value){
            this.change();
        }
    }
    function(){
 
    }
}

在上面的合约中我们发现可以调用change()函数来改变合约的owner,但是其限制条件仅运行合约自身去调用它,这里没有使用internal修饰符的原因是使用了internal的情况下是没法使用this.call来调用该函数的,然后我们看到test函数就可以满足我们的要求,只要你发送超过一个ether的eth就可以成为合约的主人,当然如果你真的尝试了那就被坑惨了,因为这里this.change()调用的是继承自B合约的change变量,所以事实上结果是无事发生

这里我也做一个简单的演示

我们先拿一个账户部署合约,此时合约的owner就是这个账户,然后我们切换另一个账户发送2ether过去,结果如下

可以看到合约的owner并没有改变,但是我们的钱已经被扣了