欢迎订阅专栏:3分钟Solidity--Web3区块链技术必学
如需获取本内容的最新版本,请参见 Cyfrin.io 上的Delegatecall(代码示例)
delegatecall是一种类似于call的低级函数。
当合约A对合约B执行delegatecall时,B的代码会在合约A的存储空间、msg.sender和msg.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 尝试一下
END