solidity代理合约

如何实现代理合约

代码

pragma solidity ^0.8;
import "@openzeppelin/contracts/utils/math/SafeMath.sol";

contract B{
    uint public num;
    uint public value;
    function donate(uint _num) payable public{
        num = _num;
        value = SafeMath.add(value, msg.value);
    }
}

contract A{
    uint public num;
    uint public value;
    address public b;
     function donate(uint _num) payable public{
         (bool success, bytes memory data) = b.delegatecall(
             abi.encodeWithSignature("donate(uint256)", _num)
         );
    }
    function setB(address _b) external{
        b = _b;
    }
}

1、分别部署A合约、B合约

A合约地址:0x358AA13c52544ECCEF6B0ADD0f801012ADAD5eE3
B合约地址:0x9D7f74d0C41E726EC95884E0e97Fa6129e3b5E99

2、执行A.setB

执行A.setB(0x9D7f74d0C41E726EC95884E0e97Fa6129e3b5E99)

3、执行A.donate

A.donate(45),value=123

结果

4、升级合约

只要修改B的合约,重新发布,然后再在A合约执行A.setB(address b)设置一下新的B合约地址即可

总结

A.setB(address B)将A合约代理给B合约
A.donate(uint _num)执行A.donate实际上是执行了B.donate,当时由于delegatecall的机制,B中的 执行环境 属于A,所以改变的是A的环境变量值

以上是基本实现,如要进一步学习请移步 《部署和验证代理合约》

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值