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

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


                    4) 提案执行: 当提案被执行时, 通过自动调用钻石合约中的相应函数来执行与提案相关的动作. 例如当提议执
                 行钻石切割的动作, 那么       IDiamond_Cut 接口中定义的    diamond_Cut 函数将被调用, 其中的参数定义具体动作.
                    社区投票的升级方式保留智能合约的原始状态, 通过模块化设计提供更高的扩展性, 支持按需升级特定功能
                 模块, 而无需重写或替换整个实现合约, 减少对单一合约的存储依赖. 并通过社区投票机制引入去中心化治理, 允
                 许社区成员参与合约的管理和升级. 这样既增强治理的透明度, 也赋予用户更大的控制权.
                    钻石模式的灵活性伴随着一定的复杂性, 尤其在权限边界定义和业务模块升级等方面. 由于逻辑和存储的分
                 离, 多重模块化设计需要开发者明确每个             facet 的权限边界, 以确保不同模块的功能调用不会产生权限越界问题.
                 由于  Solidity  使用固定的存储槽管理变量, 不同模块若未采用明确的存储布局规划, 可能会导致关键变量                         (如管理
                 员地址、余额等) 被覆盖或篡改, 引发权限失控或功能异常. 如果在实现中发现错误并部署修复程序, 在多个切面
                 依赖共享状态的情况下, 需要同步更新业务逻辑以防止不一致问题.
                  1.7   信标代理
                    2022  年, EIP-4788 [58] 定义了信标代理  (beacon proxy), 合约本身不包含任何业务逻辑, 而是通过更新一个指向
                 最新实现合约的指针来实现升级. 因此, 不再需要在状态合约上保留任何状态, 消除对非结构化存储的需求. 如图                                15
                 展示信标代理部署过程.

                                                  信标合约
                                                 ②获取当前
                                                 实现合约地址
                                                     V3
                                                   V2
                                                V1
                                          ①
                                        传入交易                   ③
                                  用户           轻量级代理合约      delegatecall()  实现合约版本 V1
                                                  轻量级代理合约                实现合约版本 V2

                                                       轻量级代理合约                实现合约版本 V3

                                         合约工厂

                                                  图 15 Beacon  部署过程图

                    1) 实现合约   (implementation contract): 实际执行业务逻辑的合约. 实现合约的地址可以由           beacon  合约动态
                 更新.
                    2) 信标合约   (beacon proxy): Beacon  类似于指针, 通过公共函数向代理合约提供当前的实现合约的地址. 允许
                 更新实现合约的地址.
                    3) 代理合约   (proxy contract): 所有用户的交互通过代理合约进行, 代理合约本身不包含任何业务逻辑, 只负责
                 从  beacon  合约中获取当前的实现合约地址, 并将调用转发给该实现合约.
                    4) 合约工厂   (可选): 用于自动化部署和管理代理合约. 并在代理合约中设置                  beacon  合约的地址, 以便代理合
                 约可以从   beacon  合约获取逻辑地址.
                    当合约工厂的轻量级代理合约收到一个传入交易时, 根据轻量级代理合约中存储                             beacon  的地址, 首先调用
                 beacon  上的  view  函数以获取当前的实现合约地址, 然后轻量级代理合约             delegatecall() 到实现合约的地址. 这种模
                 式具有高度可扩展性, 因为每个额外的代理只需从                beacon  读取实现地址, 然后使用      delegatecall() 函数. 多个代理
                 共享一个信标, 可以一次性集中升级所有代理的逻辑. 因此它们不需要关心诸如管理员是谁或如何更改实现地址
                 等细节. 这样, 当需要升级实现合约时, 只需部署新的实现合约并更新                    beacon  合约中的地址, 无需更改代理合约或
                 用户的交互方式, 所以一般比         UUPS  或透明代理更简单和节省        Gas 费用.
   43   44   45   46   47   48   49   50   51   52   53