Page 41 - 《软件学报》2026年第1期
P. 41
38 软件学报 2026 年第 37 卷第 1 期
对系统的信任. 因此数据迁移方法在实践中面临较大的挑战, 通常并非首选.
考虑到新旧合约之间的关联性丧失问题, 如图 4, 一些项目采用同时运行多版本并存 (versioning) [49] 的模式, 让
用户选择是否升级. 多版本并存适用于长期运营、用户基础庞大的区块链项目, 它提供了更高的兼容性和安全性,
这在 2017–2018 年 DeFi 生态逐渐成熟时更常见, 特别是在去中心化交易所和借贷协议 (如 Compound、Aave) 中.
但多个版本的链上治理、身份管理和数据同步将变得复杂, 可能导致不同版本的状态不一致, 开发团队需要花费
额外精力管理多个代码库的修复漏洞、发布升级. 此外, 由于用户可以自由选择合约版本, 会造成流动性分散问题.
例如 Uniswap V2 和 V3 版本由于机制不同, 一部分用户仍选择留在 V2, 导致资金分散 [50] .
加入 合约版本 V1
用户 1
迁移更新
加入
用户 2 合约版本 V2
… 迁移跟新
加入
合约版本 V3
用户 n
图 4 多版本并存模式
显然这需要更加全面的解决方案: 如何在不更改其地址的情况下更新其核心逻辑? 以及如何最小化操作开
销? 如表 3 所示, 从这些问题中形成了代理模式 (proxy pattern).
表 3 基于代理的可升级智能合约方法小结
部署 升级 调用
模式 扩展性 安全性 优点 缺点
成本 成本 成本
人工操作敏感、Gas费用昂贵和版本
数据迁移 高 高 高 低 中 根据需求可动态调整
关联缺失
兼容性强, 历史数据保留, 支持审计与回溯 流动性分散, 管理难度大, 维护成本
多版本并存 高 高 低 高 中
分析 高, 数据同步问题
delegatecall()调用漏洞、存储布局不
代理模式 低 低 中 中 低 业务逻辑和数据存储分离
匹配和权限管理问题
多个代理合约共享相同的实现代码, 节省 合约后续不具备可升级性, 存在实现
最小代理 低 低 低 低 中
存储空间和Gas费用 合约单点故障和存储冲突问题
实现合约Gas调用消耗、权限判定复
透明代理 高 高 中 低 中 利用插槽方法解决逻辑冲突问题
杂问题和升级权限集中风险
在不改变合约地址的情况下进行升级, 保持 地址重用风险、数据在迁移风险、
变形合约 中 中 中 高 低
用户体验的连续性 用户信任问题
UUPS 低 低 低 中 中 不需要代理合约参与, 减少Gas消耗 升级逻辑漏洞和权限管理风险
模块化设计允许在多个切面以及一次交易 切面设计相对复杂, 权限边界定义和
钻石模式 高 低 中 高 中
中添加或替换多个功能 逻辑不一致问题
通过更新一个指向最新实现合约的指针来
信标代理 高 中 低 高 高 单点故障和中心化风险问题
实现升级, 消除对非结构化存储的需求
1.1 代理模式
代理本质上是充当两个对象之间的中介 [51] , 而代理模式提供一种用于更新合约逻辑而不改变其地址状态的
升级方法——数据分离 (data separation). 如图 5 所示, 将代理模式合约拆分为两部分.
(1) 代理合约 (proxy contract): 处理合约的数据存储和用户请求, 并将这些请求转发给逻辑合约.
(2) 逻辑合约 (logic contract): 包含具体的业务逻辑, 可随时替换以实现合约的升级.
数据分离的核心思想是通过代理合约进行逻辑调用, 将逻辑合约的地址存储在代理合约中. 当用户调用合约

