智能合约一经部署后代码不可变,这是保障链上安全性的重要特性。但现实中,大多数 Web3 项目需要随着协议演进、功能扩展而持续更新。为了在不丢失状态和地址的前提下迭代逻辑,Proxy(代理)升级模式逐渐成为智能合约工程的事实标准。
这篇文章将系统介绍合约为何需要升级、常见升级模式、Proxy 模式的执行原理、主流实现(Transparent、UUPS)、安全陷阱以及实际应用建议。
📌 在 Web2 中升级部署是家常便饭,而 Web3 中则必须绕开“不可变”限制。
| 模式 | 说明 | 优缺点 |
|---|---|---|
| 重新部署 | 部署新合约,通知用户切换地址 | 简单,但兼容性差(地址变动、状态丢失) |
| 数据迁移 | 携带旧数据部署新合约 | 易错,成本高 |
| 🔥Proxy 模式 | 保留地址与存储,仅升级逻辑合约 | 实现复杂,需谨慎设计 |
Proxy 升级通过两个合约组合实现:
调用者执行:
(bool success, ) = impl.delegatecall(msg.data);
delegatecall 调用逻辑合约msg.sender 和 storage)