不可篡改的区块链之可更新的智能合约怎么玩

当前位置:首页 > 币圈百科 > 不可篡改的区块链之可更新的智能合约怎么玩

不可篡改的区块链之可更新的智能合约怎么玩

2023-01-01币圈百科307

如果你熟悉以太坊(或区块链),也许你听说过“防篡改”这个词。当我们想到区块链时,我们大多会将区块链与书籍和系统的功能状态不可更改或删除这一事实联系在一起。尤其是想到智能合约,我会把这个定义和“不可变对象”做比较。

smart contract

在面向对象的函数式程序中,不可变对象是指生成后状态不能改变的对象。

这意味着一旦我们的合同被部署到区块链,它就注定要消亡。我们不能改变预设内容以外的状态,但最重要的是,我们不能修改代码。

为了解决这个问题,我们将讨论基于去中心化契约存储和逻辑到不同契约的解决方案之一,同时通过注册表引导命令。最后,我们将讨论优点和缺点。

2018-04-09 12_19_37-Upgradeable Smart Contracts – Hacker Noon - Internet Explorer - __Remote蓑衣网小编2022

用合同管理合同(CMC)

该模型将基于Monax的五步模型,并针对最新的Solidity语言功能进行了更新,更易于理解和阅读。我们将实现以下契约:

1 CMC- registry 2用于跟踪系统中的契约的控制器-在我们存储的契约下运行的契约3存储-具有必要的getters和setter的数据存储契约4 ALC-具有应用程序逻辑的智能契约,用户入口点

如果您有Web应用程序的经验,那么操作流看起来就像一个名称。

用户ALC控制器基本级存储

ALC,控制器和存储

我们加入注册中心的每一个契约都会从基本级开始,在这里我们为我们的注册中心设置和限制以太坊地址,在修改器上设置契约准入控制,给注册中心添加一个接口从契约中获取地址,以及添加和删除契约的选项。

pragma solidity ^0.4.19;interface contract provider { function contracts(bytes 32 _ name)外部返回(address);} pragma solidity ^0.4.19;“导入”。/contract provider . sol '/** *每个合同的基类(数据库、控制器、ALC),*一旦我们新添加的合同所使用的CMC地址被设置,则除了我们的CMC合同* */contract CMC enabled { address public CMC;修饰符iscmc enabled(bytes 32 _ name){ require(msg . sender==contract provider(CMC)。合同(_名称));_;} function()external { revert();}函数setcmcadaddress(address _ CMC)外部{ if (CMC!=0x0消息发送者!=CMC){ revert();} else { CMC=_ CMC} } function changeCMCAddress(address _ new CMC)external { require(CMC==msg . sender);CMC=_ newCMC} function kill()external { assert(msg . sender==CMC);自毁装置;} }

合同注册中心

我们的合同注册中心将跟踪系统现在在映射中使用的合同地址。我们将使用32字节变量,因为我们不能使用动态类型(字符串)作为键。然后我们可以添加需要添加的功能,从现有的注册表中删除一些功能,并更新我们要部署的契约中的注册表。

pragma solidity ^0.4.19;“导入”。/cmcenabled . sol '“导入”。/own able . sol '合同CMC是可拥有的{ mapping (bytes32=address)公共合同;函数addContract(bytes32 _name,address _address)外部only owner { CMCEnabled _ CMCEnabled=CMCEnabled(_ address);_CMCEnabled.setCMCAddress(地址(this));合同[_名称]=_地址;}函数getContract(bytes32 _name)外部视图returns(address){ return contracts[_ name];} function remove contract(bytes 32 _ name)external only owner returns(bool){ require(contracts[_ name]!=0x 0);CMCEnabled _ CMCEnabled=CMCEnabled(contracts[_ name]);_ cmcenabled . kill();contracts[_ name]=0x 0;} function changecontractcm(bytes 32 _ name,address _ new CMC)external only owner { CMCEnabled _ CMCEnabled=CMCEnabled(contracts[_ name]);_ cmcenabled . changecmcaddress(_ new CMC);} }

非常好!现在是演示它如何工作的时候了。为了完成它,我们需要创建一个简单的工作流,其中变量X通过ALC和控蓑衣网小编2022制器存储在我们的存储契约中。 每个合同将被单独部署并添加到新创建的注册中心。可能习惯上给你的合同取和以前一样的名字。

pragma solidity ^0.4.19;“导入”。/cmcenabled . sol '合同存储已启用{ uint public x;函数setX(uint _ x)external iscmc enabled(' Storage '){ x=_ x;} }合同控制器是CMCEnabled { function setX(uint _ x)external iscmc enabled(' user entry '){ Storage(contract provider(CMC)。合同(“存储”)。setX(_ x);} } contract UserEntry是CMC enabled { function setX(uint _ x)external { Controller(contract provider(CMC))。合同(“控制人”)。setX(_ x);} }

Test

在github上的报告中,可以找到包含一些基本单元测试的测试文件。如果要运行,需要确保安装了truffle和Ganache run。启动测试命令运行测试单元:

2018-04-09 12_26_39-Upgradeable Smart Contracts – Hacker Noon - Internet Explorer - __Remote

优缺点

蓑衣网小编2022这种设置的两个优点当然是代码的可维护性和可更新性。现在我们可以在现有的内存上构建一个新的控制器或ALC,这样用户的数据就可以完好无损。

最大的缺点就是消耗燃料成本。部署这样一个系统将比简单地部署一个合同花费更多,特别是因为这里的工作流程如此简单。不仅如此,在改变状态时,用户需要花费超过10%的燃油费用。

我理解可能会有一些用户的信任问题。我不希望看到这样的纠纷,因为其实他们很容易就能查注册表找到跑分合同。

不可篡改的区块链之可更新的智能合约怎么玩 | 分享给朋友: