掌趣电竞系统开发搭建
合约注册表
由多个合约组成的系统可能依赖合约注册中心。每当合约 A 需要与 B 进行交互时,它首先会查询注册表以获得 B 的地址。通过对注册表的修改,管理员可以将 B 替换为替代实现 B',从而改变其行为。 AAVE 的早期版本使用了这种模式。
但是,此机制在切换到 B'时不会保留 B 的状态,如果需要手动迁移,则可能会出现问题。此模式的某些版本通过将逻辑和存储合约解耦来缓解这种情况:状态保持在不变的存储合约中,并且只能根据需要更改的业务逻辑合约。我们将在本文后面部分深入探讨逻辑和存储合约分离。
这种模式的另一个缺点是,它也为外部客户端带来了额外的复杂性,这些外部客户端在与系统交互之前也需要调用注册表。可以通过添加具有不可变接口的外部包装接口来减轻这种情况,该包装接口负责管理注册表查找。
策略模式
策略模式是更改合约中部分特定功能函数的代码的简便方法。替代在调用合约中实现函数来执行特定功能,而是通过调用单独的合约来处理该任务,通过切换该合约的实现,可以有效地在不同的“策略”之间进行切换。
Compound 就是一个很好的例子,它具有不同的 RateModel 实现计算利率及其 CToken 合约可以在它们之间切换。由于已知更改仅限于系统的特定部分,这可以轻松地推出修复程序或在费率计算上改进 gas 消耗。当然,一个恶意利率模型实现可以设置为始终还原和停止系统,或为特定帐户提供任意高的利率。尽管如此,限制系统更改的范围仍使对这些更改的推理更加容易。
可插拔模块
策略模式的一个更复杂的变体是可插拔模块,其中每个模块都可以向合约添加新函数。在此模型中,主合约提供了一组核心不变的函数,并允许注册新模块。这些模块为核心合约增加了可调用的新函数。这种模式在钱包中最为常见,例如 Gnosis Safe 或 InstaDapp。用户可以选择将新模块添加到自己的电子钱包中,然后每次调用钱包合约时都要求从特定模块执行特定函数。
请记住,此模式要求核心合约没有漏洞。无法通过在此方案中添加新模块来修补管理模块本身上的任何漏洞。此外,根据实现方式的不同,新模块可能有权通过使用委托调用方式(DELEGATECALL,下面会进一步解释)代表核心合约运行任何代码,因此也应仔细检查它们。
升级模式
在前面不太简短的介绍之后,是时候进入实际的合约升级模式了。这些模式中的大多数都依赖于 EVM 原语(DELEGATECALL 操作码),因此让我们从其工作原理的简要概述开始。
评论