- Delegatecall 简介
- 1.1.什么是 delegatecall ?
.delegatecall() 是 Solidity 中的一个方法,用于从一个原始合约中调用目标合约中的一个函数。然而,与其他方法不同的是,当使用.delegatecall()在目标合约中执行函数时,上下文从原始合约中传递,即代码在目标合约中执行,但变量在原始合约中被修改。
- Delegatecall 实例
- 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
- 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
- 2.3.调用student合约:使用Calculator老?
在student合约0x731b202063e2b1b58834bbc36b9fd94bf83a5478中调试:
填入Calculator:0x7764f7c51347723c70e0a11f5f58d7feaa19346a
- 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了:
实现了合约的变更