Cover photo

Solidity - 理解call和delegatecall

理解call和delegatecall

使用ABI编码的方式调用合约函数, 为函数调用提供了抽象能力。

使用合约地址进行底层调用:

  1. 底层调用失败不是发生异常(revert), 而是用返回值表示

  2. call()调用切换上下文

  3. delegatecall()调用保持上下文**(只是使用了目标合约的代码逻辑,数据还是调用方的数据)**

call和delegatecall的区别
call和delegatecall的区别

delegatecall 的应用场景:

  1. 代理合约(Proxy Contract):将智能合约的存储合约和逻辑合约分开; 代理合约存储所有相关的变量,并且保存逻辑合约的地址;逻辑合约存储所有函数,通过delegatecall执行。当升级时,只需要将代理合约指向新的逻辑合约即可。

  2. EIP-2535 Diamonds(钻石):钻石是一个支持构建可在生产中扩展的模块化智能合约系统的标准。钻石是具有多个实施合同的代理合同。