升级智能合约
如果您只是在寻找代码,则可以在 此处 找到存储库 。
当您熟悉以太坊 (或一般的区块 链 )时,您可能会碰到'immutable'这个词。 在考虑区块链时,我们主要将其与不可篡改或删除系统分类帐和功能状态这一事实联系起来。 在具体考虑智能合约时,我宁愿将其与“不可变对象”的定义进行比较。
在面向对象的函数式编程中, 不可变的对象是其状态在创建后无法修改的对象
这意味着一旦将我们的合同部署到区块链上,它便是一成不变的。 我们无法在其预定义范围(设置者)之外更改状态,但更重要的是, 我们无法更改代码。
为了解决此问题,我们将讨论一种基于将合同存储和逻辑拆分为单独合同,同时通过注册表定向调用的解决方案。 之后,我们将介绍一些优点和缺点。
合同管理合同(CMC)
该模型将基于Monax的“ 五种类型”模型,并针对最新的Solidity语言功能进行了更新,以使其更加易懂和易读。 我们将执行以下合同:
- CMC —跟踪我们系统中合同的注册表
- 控制器-根据我们的存储合同运行的合同
- 存储—与必要的获取者和设置者签订数据存储合同
- ALC —包含特定于应用程序的逻辑的合同,通常是用户入口点
如果您以前有Web应用程序的经验,那么操作流程看起来就像您从命名中所期望的那样。
用户→ALC→控制器→存储
ALC,控制器和存储的基类
我们添加到寄存器中的每个合约都将从基类开始,该基类设置并包含寄存器的以太坊地址,合约访问控制的修饰符,从寄存器中的合约获取地址的接口以及删除合约的选项。
合同登记处
我们的合同注册中心将跟踪系统当前在映射中使用的合同地址。 我们将使用bytes3 2变量,因为我们不能将动态类型(字符串)作为键。 我们将添加功能以从注册表中添加,获取和删除功能,并添加一个功能来更新已部署合同所使用的注册表。 (您可以从 OpenZeppelin 获取 Ownable.sol )
而已! 现在是时候说明它是如何工作的,为此,我们将创建一个简单的工作流,该工作流通过ALC和控制器将变量x存储到我们的存储合同中。 每个合同将单独部署,并在创建后添加到注册表中。 一个好的约定可能是给您的合同起一个定义的名称。
进行测试
在github仓库中,您将在test文件夹中找到包含一些基本单元测试的文件。 要运行这些程序,请确保已安装松露并且运行了Ganache 。 运行test命令以运行单元测试:
truffle test
赞成和反对
当然,这种设置的两个优点是代码的可维护性和可升级性。 现在,我们可以在现有存储之上部署新的控制器或ALC,以便我们的用户数据保持不变。
最大的弊端是天然气成本。 部署这个婴儿比部署一个合同要花费更多的钱,尤其是在工作流程非常简单的情况下。 最重要的是,您/用户在进行状态更改时将另外支付10%的燃气费用。
我知道对于用户可能会有一些信任问题,但是我并不认为这是一个论点,因为他们可以轻松地检查注册簿来检查正在使用的合同。
感谢您的阅读,我希望您喜欢它,最重要的是学到了一些新知识。 这只是一个基本模型,更大的系统当然会对CMC甚至在系统的不同部分具有不同的合同管理者具有更多的逻辑。
如果您想了解有关稳定性的更多信息,请务必查看我们的dApp教程系列和我们的令牌教程 !
如果您喜欢这篇文章,总是欢迎您提出建议并支持免费的知识共享!
ETH — 0x6d31cb338b5590adafec46462a1b095ebdc37d50
翻译自: https://hackernoon.com/upgradeable-smart-contracts-a7e9aef76fdd
升级智能合约