代理合约Delegatecall

  1. Delegatecall 简介
    1. 1.1.什么是 delegatecall

.delegatecall() 是 Solidity 中的一个方法,用于从一个原始合约中调用目标合约中的一个函数。然而,与其他方法不同的是,当使用.delegatecall()在目标合约中执行函数时,上下文从原始合约中传递,即代码在目标合约中执行,但变量在原始合约中被修改。

 

  1. Delegatecall 实例
    1. 2.1.部署Calculator合约?
pragma solidity ^0.8.4;

contract Calculator {
    uint public result;
    address public user;
    function add(uint a, uint b) public returns (uint) {
        result = a + b;
        user = msg.sender;
        return result;
    }
}

 

合约:0x7764f7c51347723c70e0a11f5f58d7feaa19346a

 

 

    1. 2.2.部署Student合约?
pragma solidity ^0.8.4;

contract Student {

    uint public mySum;

    address public studentAddress;



    function addTwoNumbers(address calculator, uint a, uint b) public returns (uint)  {

        (bool success, bytes memory result) = calculator.delegatecall(abi.encodeWithSignature("add(uint256,uint256)", a, b));

        require(success, "The call to calculator contract failed");

        return abi.decode(result, (uint));

    }

}

 

合约:0x731b202063e2b1b58834bbc36b9fd94bf83a5478

 

 

    1. 2.3.调用student合约:使用Calculator老?

在student合约0x731b202063e2b1b58834bbc36b9fd94bf83a5478中调试:

填入Calculator:0x7764f7c51347723c70e0a11f5f58d7feaa19346a 

    1. 2.4.调用student的合约:使用Calculator新?

 

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol



// SPDX-License-Identifier: MIT

// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)



pragma solidity ^0.8.4;

contract Calculator {

    uint public result;

    address public user;



    function add(uint a, uint b) public returns (uint) {

        result = a + b + 2;

        user = msg.sender;

        return result;

    }



    function add2(uint a, uint b) public pure returns (uint) {

        uint result2 = a + b;

        return result2;

    }



    function add3(uint a, uint b) public view returns (uint) {

        uint result3 = a + b;

        return result3;

    }

}

 

在student合约0x731b202063e2b1b58834bbc36b9fd94bf83a5478中调试:

填入Calculator:0xaf81d1a40a0d7be67287e0531efdccffb00ef56d

调用完就变成4了:

 

实现了合约的变更

posted @ 2025-02-20 10:47  若-飞  阅读(24)  评论(0)    收藏  举报