Skip to content

Delegatecall(委托调用)

Delegatecall(委托调用) 是 Solidity 中一种强大的功能,它允许一个合约调用另一个合约的函数,并且使用调用合约的存储。这意味着被调用的合约可以修改调用合约的存储,从而实现一些有趣和有用的功能。

简单的看个demo

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

contract TestDelegateCall{
    uint public num;
    address public sender;
    uint public value;
    function setVars(uint _num) external payable {
        num = _num;
        sender = msg.sender;
        value = msg.value;
    }
}
contract DelegateCall {
    uint public num;
    address public sender;
    uint public value;

// 委托调用 调用别的合约方法来修改自己的状态变量
    function setVars(address _test, uint _num) external payable {
        // _test.delegatecall(abi.encodeWithSignature("setVars(uint256)", _num));
       (bool success, bytes memory data) = _test.delegatecall(abi.encodeWithSelector(TestDelegateCall.setVars.selector, _num));
       require(success, "delegatecall failed");
    }
}

这个demo的结果是,调用TestDelegateCall合约的setVars方法,但是改变的却并不是TestDelegateCall的状态变量,而是DelegateCall合约的状态变量。