3分钟Solidity: 5.5 delegatecall 委托调用

28 阅读1分钟

欢迎订阅专栏3分钟Solidity--Web3区块链技术必学

如需获取本内容的最新版本,请参见 Cyfrin.io 上的Delegatecall(代码示例)

delegatecall是一种类似于call的低级函数。

当合约A对合约B执行delegatecall时,B的代码会在合约A的存储空间、msg.sendermsg.value环境下执行。

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.26;

// NOTE: 先部署此合约
contract B {
    // NOTE: 存储布局必须与合约A相同
    uint256 public num;
    address public sender;
    uint256 public value;

    function setVars(uint256 _num) public payable {
        num = _num;
        sender = msg.sender;
        value = msg.value;
    }
}

contract A {
    uint256 public num;
    address public sender;
    uint256 public value;

    event DelegateResponse(bool success, bytes data);
    event CallResponse(bool success, bytes data);

    // 使用委托调用的函数
    function setVarsDelegateCall(address _contract, uint256 _num)
        public
        payable
    {
        // A的存储已设置;B的存储未修改。
        (bool success, bytes memory data) = _contract.delegatecall(
            abi.encodeWithSignature("setVars(uint256)", _num)
        );

        emit DelegateResponse(success, data);
    }

    // 使用调用的函数
    function setVarsCall(address _contract, uint256 _num) public payable {
        // B的存储已设置;A的存储未修改。
        (bool success, bytes memory data) = _contract.call{value: msg.value}(
            abi.encodeWithSignature("setVars(uint256)", _num)
        );

        emit CallResponse(success, data);
    }
}

Remix Lite 尝试一下

solidity-delegatecall


END