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): 包含具体的业务逻辑, 可随时替换以实现合约的升级.
                    数据分离的核心思想是通过代理合约进行逻辑调用, 将逻辑合约的地址存储在代理合约中. 当用户调用合约
   36   37   38   39   40   41   42   43   44   45   46