Page 46 - 《软件学报》2026年第1期
P. 46

郭涛 等: 智能合约可升级技术综述                                                                 43


                 在代理存储空间中特定插槽中实现地址所需的代码. 这种方式简化部署者在管理代理和实现合约方面的操作流
                 程. 如图  12, UUPS  代理需要部署   3  个合约.

                                                              通用可代理合约
                                                                地址: V1             现实合约地址 V1
                                          代理合约
                                   ①                  ç                               权限验证
                                 升级调用              delegatecall()                   ③ upgradeTo
                           部署者            存储数据
                                                                             ④
                                                                地址: V2             现实合约地址 V2
                                                                         proxiableUUID
                                                                          升级校验
                                                       图 12 UUPS

                    1) 代理合约   (proxy contract): 存储数据的合约. 代理合约接收并处理部署者所有传入的升级调用, 通过                delegate-
                 call() 将这些调用委托给实现合约.
                    2) 实现合约   (implementation contract): 包含代理合约使用逻辑的合约. 实现合约包含实际的业务逻辑和功能.
                    3) 可代理合约    (proxiable contract): 在实现合约中继承此功能以提供升级能力. 该合约提供升级所需的标准接
                 口, 同时确保升级操作符合安全性要求. 通常称为              upgradeTo  的功能, 它允许授权实体     (例如管理员或治理机制) 升
                 级实现合约. 此函数将代理合约的指针更新为新实现合约的地址. 每次升级实现合约时, 需要部署一个新的实现合
                 约, 并通过  upgradeTo  函数进行切换.
                    首先部署代理合约, 并设置初始的实现合约地址. 可代理合约编写包含业务逻辑的实现合约, 并确保其实现
                 upgradeTo  和  proxiableUUID  函数. 所有对合约功能的调用都通过代理合约进行, 代理合约将调用委托给当前的实
                 现合约. 当需要升级时, 通过调用实现合约的            upgradeTo  函数, 更新代理合约中存储的实现合约地址.
                    UUPS  模式通过将升级逻辑放在实现合约中而不是代理合约中, 消除对                     proxy admin  合约的需要, 只需在实现
                 合约内进行权限检查逻辑, 从而减少每次调用时的                Gas 消耗. UUPS  模式的另一个优势在于灵活性, 由于升级逻辑
                 位于实现合约中, 因此它本身也可以升级, 提供更大的灵活性. UUPS                  模式还允许通过停止继承可代理合约、删除
                 authorizeUpgrade 等逻辑来实现永久性锁定不可升级状态, 这是透明代理模式无法做到的.
                    在  UUPS  模式中, 所有的升级逻辑都集中在实现合约中, 每次升级实现合约时, 都可能改变授权升级逻辑. 这
                 意味着如果实现合约内升级函数被意外删除或修改, 可能导致合约永久锁死. 此外, 升级权限管理不当被攻击者
                 利用或存在漏洞, 整个系统的安全性可能会受到威胁                  [33] . 每次升级实现合约时, 都可能改变授权升级逻辑, 从而
                 增加安全风险. 为避免此类问题, 开发者需要在实现合约中自定义实现                      authorizeUpgrade 函数, 以严格限制升级权
                 限. 即便如此, 用户权限管理会增加代码实现的复杂性, 并需要仔细的权限管理和审计管理以防止未经授权的
                 升级.
                  1.6   钻石模式

                    2020  年, 以太坊的  EIP-2535 [56] 提案定义了一种称为钻石合约      (diamond contract) 的模块化智能合约开发架构,
                 以解决智能合约的可拓展性挑战. 钻石模式允许在多个切面中添加或替换功能, 同时支持在一次交易中完成多个
                 功能的升级, 这一过程称为“钻石切割            (diamond cut)”. 如图  13  所示, 单个钻石和核心面孔可以构建一个分散的、
                 可升级的治理框架      [57] .
                    1) 钻石合约   (diamond contract): 合约本身不包含业务逻辑, 而是通过代理模式调用其他合约的逻辑.
                    2) 切面  (facet): 切面包含实际业务逻辑的合约, 可以被钻石合约调用. 每个切面合约实现特定的功能, 并且可
                 以独立升级或替换, 而不会影响其他切面合约的运行.
                    3) 放大镜  (loupe): 特殊的切面合约, 提供查询功能, 外部用户可以查询钻石合约所包含的所有切面合约以及
                 其提供的函数选择器       (function selector).
                    4) 钻石切割   (diamond cut): 管理钻石合约功能的一组函数, 支持添加、替换或删除切面合约及其函数选择器
   41   42   43   44   45   46   47   48   49   50   51