Delegate

Reference

Delegate

Delegate.sol

目标

  1. 成为合约Owner

分析

DelegateCall

  1. 当前合约作为A,A DelegateCall B的底层逻辑:
    1. A 把B的合约代码整个复制到A的执行环境中
    2. A收到的msg.data按照B合约逻辑执行
    3. A合约的参数会按照B合约函数逻辑进行更新
    4. 注意,A按照B的逻辑更新A合约参数是按照slot顺序,和参数名称无关
  2. Delagation合约参数的存储顺序
    address public owner; //slot0
    Delegate delegate;//slot1
  1. Delegate逻辑合约参数的存储顺序
    address public owner; //slot0
  1. Delegate逻辑合约用于更新slot0的函数
contract Delegate {
    address public owner;

    constructor(address _owner) {
        owner = _owner;
    }

    function pwn() public {
        owner = msg.sender; //更新slot0参数
    }
}

实现步骤

  1. 部署Delegate合约,部署 Delegation合约
  2. Delegation合约直接发起交易,calldata数据为pwn()函数选择器
  3. 交易被delegatecallDelegate合约,按照函数选择器跳转到pwn()函数
  4. Delegation合约按照 pwn()函数更新slot0数据,owner被更新为 msg.sender