Delegate
Delegate.sol
- 成为合约Owner
- 当前合约作为A,
A DelegateCall B的底层逻辑:
- A 把B的合约代码整个复制到A的执行环境中
- A收到的
msg.data按照B合约逻辑执行
- A合约的参数会按照B合约函数逻辑进行更新
- 注意,A按照B的逻辑更新A合约参数是按照
slot顺序,和参数名称无关
- Delagation合约参数的存储顺序
address public owner; //slot0
Delegate delegate;//slot1
- Delegate逻辑合约参数的存储顺序
address public owner; //slot0
- Delegate逻辑合约用于更新slot0的函数
contract Delegate {
address public owner;
constructor(address _owner) {
owner = _owner;
}
function pwn() public {
owner = msg.sender; //更新slot0参数
}
}
- 部署
Delegate合约,部署 Delegation合约
Delegation合约直接发起交易,calldata数据为pwn()函数选择器
- 交易被
delegatecall到Delegate合约,按照函数选择器跳转到pwn()函数
Delegation合约按照 pwn()函数更新slot0数据,owner被更新为 msg.sender