智能合约一经部署后代码不可变,这是保障链上安全性的重要特性。但现实中,大多数 Web3 项目需要随着协议演进、功能扩展而持续更新。为了在不丢失状态和地址的前提下迭代逻辑,Proxy(代理)升级模式逐渐成为智能合约工程的事实标准。
📚 作者:Henry 🧱 系列:《以太坊工作原理全解析》 · 第 10 篇 👨💻 受众:Web3 开发者 / 区块链学习者 👉 系列持续更新中,建议收藏专栏或关注作者
这篇文章将系统介绍合约为何需要升级、常见升级模式、Proxy
📌 在 Web2 中升级部署是家常便饭,而 Web3 中则必须绕开“不可变”限制。
模式 | 说明 | 优缺点 |
---|---|---|
重新部署 | 部署新合约,通知用户切换地址 | 简单,但兼容性差(地址变动、状态丢失) |
数据迁移 | 携带旧数据部署新合约 | 易错,成本高 |
🔥Proxy 模式 | 保留地址与存储,仅升级逻辑合约 | 实现复杂,需谨慎设计 |
Proxy 升级通过两个合约组合实现:
调用者执行:
(bool success, ) = impl.delegatecall(msg.data);
delegatecall
调用逻辑合约msg.sender
和 storage
)⚠️ 实际调用的函数体在 Logic 合约中,但读写的数据来自 Proxy 的存储区。
delegatecall
将请求转发至 逻辑 合约msg.sender
为调用 Proxy 的原始地址✅ 关键机制:逻辑代码来自逻辑合约(Implementation),状态数据来自代理合约
标准 | 特点 | 使用项目 |
---|---|---|
Transparent Proxy | Proxy 只转发普通函数,upgrade 权限给 Admin | OpenZeppelin 默认 |
UUPS Proxy ✅ | Upgrade 逻辑由 Log... |
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!