跳到主要内容

Intro

从区块链的设计上来说,合约一旦部署在链上,就是不可以改变的(immutable),虽然这是一个很重要的特性,但是当合约出现了一些问题,我们需要修复啊,打补丁,优化,更新新功能的时候,这个特性就会带来一定的问题,所以我们就需要使用到Proxy。

Proxy和Proxy Delegate模式实现了这种可升级性,一般来说,代理有两种方式:

  1. 初始调用者Contract A通过Delegatecall使用的ContractB的逻辑功能
  • A将B的地址存储在里可更改的变量当中
  • 如果需要升级,新的逻辑合约C将会部署在不同的地址
  • 在A中更新,使逻辑调用被指向新的合约C。
  1. 工厂合约A,使用create2创建合约B(可被预测)
  • 合约B中包含Selfdestruct允许合约被销毁
  • 如果需要升级,则合约B被销毁,A可以使用Create2在同一个地址创建新的合约C。

除了这两种方式外,合约逻辑也可以在没有Proxy的情况下进行升级,比如使用data separation模式,或者contract migration。

  1. Data Separation
  • 该模式以主合约 A 作为入口,除了调用外部合约外,不包含复杂的逻辑。对外部合约的调用仅使用 call ,而不是 delegatecall 。
  • 外部合约的地址存储在具有限制性设置函数的状态变量中,仅允许所有者改变其状态。这允许 A 在需要升级时更新状态变量以指向新的合约地址。