Skip to content

代理模式:部署可升级智能合约的关键

Posted on:April 13, 2023 at 09:07 AM

Table of contents

Open Table of contents

代理模式

虽然已部署的智能合约不能直接升级代码,但可以使用代理合约架构来实现重定向到新部署的合约。

代理架构模式的原理是,所有的调用都会经过代理合约,重定向到最新部署的合约逻辑。如果想升级,只需部署新版本的合约,并更新代理以引用新的合约地址即可。

透明代理(Transparent Proxy)

透明代理 EIP-1967 引入了 ProxyAdmin 合约作为管理员来解决“函数选择器冲突”的问题

UUPS 代理 (Universal Upgradeable Proxy Standard)

这种代理模式也称为通用可升级代理标准,相对于透明代理更加轻巧且通用,UUPS 的名称来自 EIP-1822,它首先记录了该模式。

UUPS 把升级函数放在了逻辑合约中,所以代理合约本身部署成本会低于透明代理,除此之外,由于 UUPS Proxy 的升级逻辑由逻辑合约执行,不需要额外部署 Admin 合约完成升级逻辑,因此 UUPS Proxy 的部署成本比 Transparent Proxy 低。升级由逻辑合约控制,随时可以停止合约的可升级性。

Beacon Proxy

Beacon 模式是一种更加灵活的合约升级方式,实现方式是将 Implementation 地址存放在 Beacon 合约里,Proxy 合约中只保存 Beacon 合约的地址。在合约交互时,Proxy 合约需要先访问 Beacon 合约获取 Implementation 地址,然后再通过 delegatecall 调用 Implementation。

而在合约升级时,管理员不需要和 Proxy 合约打交道,只需要通过交互 Beacon 合约将新的 Implementation 地址存储到 Beacon 合约中即可。这个过程中,Proxy 合约的代码不需要改变,只需要改变 Beacon 合约中保存的 Implementation 地址即可实现合约升级。

Beacon 模式与其他两种模式不同,Implementation 地址不直接存储在 Proxy 合约中,可能看起来有些麻烦。然而,在多个 Proxy 共享同一 Implementation 并需要批量升级的场景中,该模式具有优势。在这种情况下,升级 Beacon 自然地实现了所有代理的升级效果。如果使用透明模式或 UUPS 模式,则每个代理必须单独升级。

Transparent VS UUPS VS Beacon

代理模式升级合约逻辑位置Gas可终止升级
透明代理Proxy不可
UUPSLogic单 Proxy 代理时最低
BeaconBeacon多 Proxy 代理时最低不可