在以太坊智能合约的世界里,delegatecall 是一个相对高级但功能极其强大的 Solidity 内置函数,它允许一个合约将其调用(包括消息调用和值传递)“委托”给另一个合约,但关键在于,被调用合约的代码是在调用合约的上下文中执行的,这意味着被调用合约可以访问和修改调用合约的存储、状态变量,并以其身份发送交易,而不仅仅是执行其自身的代码,理解 delegatecall 对于构建可升级合约、代理模式和复杂的合约架构至关重要。

delegatecall 的工作原理

要理解 delegatecall,首先需要区分它与普通调用(如 address.call())的核心差异:

  1. 执行上下文

    • 普通调用:被调用合约的代码在被调用合约自己的存储、上下文和 msg.sender/msg.value 中执行。
    • delegatecall:被调用合约的代码在调用合约的存储、上下文和 msg.sender/msg.value 中执行,借用”另一个合约的代码来操作自己的数据。
  2. 数据位置

    • 当使用 delegatecall 时,被调用合约接收的参数(内存中的数据)和返回的数据(内存中的数据)都是相对于调用合约的内存而言的,如果被调用合约修改了存储,它修改的是调用合约的存储。
  3. msg.sender 和 msg.value

    • delegatecall随机配图