Solidity的call()与delegatecall()区别就不表了,文档写得很明白。
一般使用delegatecall()不涉及状态变量读写的,如library,基本不会出现什么差错。如果delegatecall调用涉及状态变量修改,那就问题来了,如下例子:
contract A{ //调用A的f(B合约地址, 2)
uint256 public y;
uint256 public x;
address public z;
function f(address b, uint256 a) public returns(bool rslt, bytes memory data){
y = 10;
x = 20;
//(rslt,data) = b.call(abi.encodeWithSignature("f(uint256)",a));
(rslt,data) = b.delegatecall(abi.encodeWithSignature("f(uint256)",a));
}
}
contract B{
uint256 public x=1;
uint256 public y;
address public z;
constructor() public{
y = 2;
}
function f(uint256 a) public returns(uint256, uint256, address) {
x += a;
y = 1000;
z = msg.sender;
return (x,y,z);
}
}
问题原因来自智