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

区块链技术巴比特2018-04-10 12:02:19  阅读 -评论 0  阅读原文

如果你很熟悉以太坊(或者区块链),也许你听过这个词“不可篡改”。当我们想到区块链的时候,我们大多会将区块链和账本和系统的功能状态不能改变或删除相联系。特别是想到智能合约的时候,我会把这个定义和“不可改变对象”相比较。

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

在面向对象的功能性程序中,不可变对象指的是在生成后状态不可以改变的对象。

这意味着一旦我们的合约部署在区块链上,就被限定死了。我们不能在预先设定好的内容之外对状态进行改变,但是最重要的是,我们也不能修改代码。

为了解决这个问题,我们会讨论其中一个基于分散合约存储和逻辑到不同合约的解决方案,同时通过注册表指导命令。最后我们会讨论好处和坏处分别是什么。

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

用合约管理合约(CMC)

这个模型会基于Monax的五步模型,为最新的Solidity语言功能更新,使之更容易理解和阅读。我们会实施以下合约:

1 CMC- 追踪系统里合约的注册表
2 控制器 – 合约运行在我们存储的合约之下
3 存储 – 数据存储合约并且带有必要的getters和setters
4 ALC – 带有应用逻辑的智能合约,用户切入点

如果您有Web应用程序的经验,那么动作流看起来就像命名的那样。

用户→ALC→控制器→存储

ALC的基本级别,控制器和存储器

我们加入在注册表上的每个合约都会从基本级别开始,在此级别上为我们的注册表设定和限制以太坊地址,在修改器上设定合约准入控制,同时在注册表上添加接口以便从合约上获得地址,还有添加删除合约的选项。

pragma solidity ^0.4.19; interface ContractProvider { function contracts(bytes32 _name) external returns (address); }

pragma solidity ^0.4.19; import './ContractProvider.sol'; /** * Base class for every contract (DB, Controller, ALC,) * Once the CMC address being used by our newly added contract is set it can not be set again except by our CMC contract **/ contract CMCEnabled { address public CMC; modifier isCMCEnabled(bytes32 _name) { require(msg.sender == ContractProvider(CMC).contracts(_name)); _; } function() external { revert(); } function setCMCAddress(address _CMC) external { if (CMC != 0x0 && msg.sender != CMC) { revert(); } else { CMC = _CMC; } } function changeCMCAddress(address _newCMC) external { require(CMC == msg.sender); CMC = _newCMC; } function kill() external { assert(msg.sender == CMC); selfdestruct(CMC); } } 合约注册表

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

pragma solidity ^0.4.19; import './CMCEnabled.sol'; import './Ownable.sol'; contract CMC is Ownable { mapping (bytes32 => address) public contracts; function addContract(bytes32 _name, address _address) external onlyOwner { CMCEnabled _CMCEnabled = CMCEnabled(_address); _CMCEnabled.setCMCAddress(address(this)); contracts[_name] = _address; }

function getContract(bytes32 _name) external view returns (address) { return contracts[_name]; }

function removeContract(bytes32 _name) external onlyOwner returns (bool) { require(contracts[_name] != 0x0); CMCEnabled _CMCEnabled = CMCEnabled(contracts[_name]); _CMCEnabled.kill(); contracts[_name] = 0x0; }

function changeContractCMC(bytes32 _name, address _newCMC) external onlyOwner { CMCEnabled _CMCEnabled = CMCEnabled(contracts[_name]); _CMCEnabled.changeCMCAddress(_newCMC); } }

很好!现在就是演示它如何工作的时刻了,为了完成我们需要创造一个简单的工作流程,其中在我们的存储合约中通过一个ALC和控制器存储着变量x。每个合约都会被分开部署,并且添加到新建的注册表。惯例也许是给予你的合约和之前定义时同样的名字。

pragma solidity ^0.4.19; import './CMCEnabled.sol'; contract Storage is CMCEnabled { uint public x; function setX(uint _x) external isCMCEnabled("Storage") { x = _x; } } contract Controller is CMCEnabled { function setX(uint _x) external isCMCEnabled("UserEntry") { Storage(ContractProvider(CMC).contracts("Storage")).setX(_x); } } contract UserEntry is CMCEnabled { function setX(uint _x) external { Controller(ContractProvider(CMC).contracts("Controller")).setX(_x); } } 进行测试

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

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

优势和劣势

这种设定的两种好处当然是代码的维护性和可更新性。我们现在可以在现有的存储器上搭建新的控制器或者ALC,从而用户的数据可以完好无损。

最大的缺点就是燃料费用的消耗。部署这样的系统会比单纯部署一个合约耗费更多,特别是这里的工作流程还这样简单。不仅如此,在对状态进行更改时,用户需要花费10%更多的燃料费用。

我明白对于用户来说,可能会有一些信任问题,我不想看到这样的争议,因为其实他们可以很容易地去检查注册表找到正在运行的合约。

声明:链世界登载此文仅出于分享区块链知识,并不意味着赞同其观点或证实其描述。文章内容仅供参考,不构成投资建议。投资者据此操作,风险自担。此文如侵犯到您的合法权益,请联系我们100@7234.cn

    参与讨论 (0 人参与讨论)

    相关推荐

    区块链投资趋势报告:巨头入场布局行业趋于成熟

    区块链投资趋势报告:巨头入场布局行业趋于成熟

    来自:https://mp.weixin.qq.com/s?__biz=MzI4NzIxOTY1NA==&mid=2650632639&idx=1&sn=e6d1c29731d992a80410aaee82ec3ea6&chksm=f3d8db16c4af520097e4a64a71b1d4743ac326b9f027

    重新发明货币

    重新发明货币

    一、货币的演化过程 先简单回顾一下人类货币的演化过程,大概有以下阶段: a. 1.0版本:自然货币(贝壳、牲口、金银……) 这个阶段,货币基于一般等价物的稀有性或者实用性,货币不可能出现人为操纵的超发。 b. 2.0版本:早期纸币、银票到本位纸币 当贸易量越来越大,实物货币太不方便了,而且大家发现其实并不在意货币本身有什么价值,在意的只是这么多的货币能不能交换到足够的物品,于是纸币这种信用货

    从比特币交易看欧洲央行虚拟货币分类

    从比特币交易看欧洲央行虚拟货币分类

      互联网对传统社会的颠覆从未停止,在其完成对信息流、商流、物流、资金流的初步改造之后,或将以虚拟货币的形式打破现有货币体系   4月18日,在中国极客张沈鹏创办的比特币交易平台(42BTC.com)上,比特币对人民币的平均交易价为576元。当天,该平台完成了100个比特币的交易量。仅仅过去一周,4月25日上午,比特币对人民币的平均交易价已达到906元。据42BTC网站统计:在过去的32个月

    欧洲央行-比特币报告

    3.1 比特币 3.1.1 基本特征          比特币可能是最成功的,也可能是最有争议的虚拟货币方案,由日本程序员中本聪(译者注:事实上,中本聪是不是日本人,甚至是不是单个人无从考证)在2009年设计并实现。该计划基于一个类似于BitTorrent的P2P网络。BitTorrent是互联网上著名的共享文件协议,应用在电影,游戏和音乐领域。比特币在全球层面上运作,可用于各类货币交易(虚

    彻底玩转比特币地址和私匙

    彻底玩转比特币地址和私匙

    比特币地址和私匙是所有比特币初学者面对的一大难题,再加上那一串超长的字符串,让人更是摸不到头脑。 现在编者以问答的形式,带你一步步的揭开比特币地址和私匙的面纱。 还不知道什么是比特币地址和私匙的同学请点这里 问题一、比特币钱包由什么组成? 答 我们知道,比特币地址和私匙组成了比特币钱包,而私匙则决定了比特币地址上比特币的归属。 地址和私匙 问题二、如果只记得私匙我们还能还原比特币地址么? 答

    用GO语言实现比特币算法

    用GO语言实现比特币算法

    本节的这个例子展示一点点高精度数学包math/big、一点点散列包hash、一点点加密包crypto,还有一点点测试包testing的知识。这里不介绍bitcoin协议和算法——尽管它们很有趣,而是试图指出,Go对多种操作系统的支持,是实现这种跨平台应用的理想语言。 位钱(bitcoin)是一种使用加密手段制作的分布式电子货币。它最初于1998年由Wei Dai提出,并由中本聪(Satoshi

    详解比特币的找零机制

    详解比特币的找零机制

    比特币的找零机制一直让人有些迷惑,明明只向一个地址发送了比特币为什么 blockchain 上面的显示的有时是1个地址对多个地址,有时是多个地址对1个地址,有时又显示多个地址对多个地址? 为什么比特币资深用户要提醒大家当比特币钱包交易100次以上时再次交易后要重新备份钱包,恢复以前的钱包备份有可能会遭遇损失? 是的,这一切都是因为比特币的找零(Change)机制。本文参考 Bitcoin的维

    玩转比特币客户端之一:C盘转移和加速下载

    玩转比特币客户端之一:C盘转移和加速下载

    C盘空间不足?交易数据下载速度太慢?别着急,乐享比特币教你轻松玩转比特币官方客户端。 所有新人开始接触比特币时做的第一件事情大多数是安装比特币的官方客户端。 安全起见大家最好直接访问官方发布渠道sourceforge的地址进行下载:http://sourceforge.net/projects/bitcoin/files/Bitcoin/ 该网页列出了各版本的官方比特币客户端,目前

    麦妖榜
    更新日期 2019-01-18
    排名用户贡献值
    1等待的宿命23695
    2BitettFan23632
    3六叶树20309
    4天下无双16192
    5lizhen00214782
    6区块大康14683
    7让时间淡忘14188
    8冷风大q11188
    9momo11174
    10linjm122710644
    返回顶部 ↑