假如合约A通过delegatecall调用合约B的test()函数
(1) 对于0.4.26版本的Solidity,delegatecall的使用语法语法如下:
ContractBAddress.delegatecall(bytes4(keccak256("test()"))); // test为函数名
(2) 对于0.6.8版本的Solidity,delegatecall的使用语法语法如下:
contract A {
bool flag;
bytes memory result;
function callLogicContract(address logicContractAddr) public {
(flag, result) = ContractAddr.delegatecall(abi.encodeWithSignature("test(address)", this));
emit Log("delegatecall return ", r); // r为true或false
uint256 result = bytesToUint(s);
emit Log2("test() return ", result);
}
}
contract B{
uint256 public num1;
uint256 public num2;
uint256 public num3; //num1, num2, num3声明的顺序和位置必须和DataContract中的一样,否则无法修改DataContract中的num3
address public caller;
address public dataContract;
event Log(string str, uint256 num);
event Log2(string str, address addr);
function test(address addr) public returns(uint256) {
dataContract = addr; // 数据合约DataContract地址
caller = msg.sender; // 运行数据合约DataContract的以太坊账号
num3 = num3*10; // DataContract通过delegatecall调用LogicContract的test函数,test函数里修改的是DataContract中的num3而不是LogicContract中的num3
emit Log("after upgrading contract, num3=", num3);
emit Log2("dataContract=", dataContract);
emit Log2("caller=", caller);
return num3;
}
}
我的csdn:powervip-CSDN博客
我的学习笔记:www.0101.vip
我的github: https://github.com/powervip
如果你觉得这篇文章写得还可以,请帮忙点个赞,谢谢!
你的鼓励,我的动力!