风险提示:理性看待区块链,提高风险意识!
不可篡改的区块链之可更新的智能合约怎么玩?
首页 > 币界资讯 > 区块链知识 2018-04-10 08:35
摘要
如果你很熟悉以太坊(或者区块链),也许你听过这个词“不可篡改”。当我们想到区块链的时候,我们大多会将区块链和账本和系统的功能状态不能改变或删除相联系。特别是想到智能合约的时候,我会把这个定义和“不可改变对象”相比较。在面向对象的功能性程序中,不可变对象指的是在生成后状态不可以改变的对象。这意味着一旦 。
币界网报道:

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

smart contract

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

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

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

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

用合约管理合约(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运行。启动测试命令从而运行测试单元:

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

优势和劣势

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

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

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

发表评论
发表评论
暂无评论
    相关阅读
    未来一年可以说是最难以预测的一年。地缘政治错综复杂、美国监管政策不确定。尽管美国股市似乎无法停止上涨,利率也只能下降,但我们知道,这两件事都不是板上钉钉的事。
    区块链
    2025-01-08 11:31:18
    周一,比特币和以太坊 ETF 共计流入 11 亿美元,在现货基金年初出现 3.2 亿美元流入后,形成了积极的势头。
    比特币
    2025-01-08 10:31:17
    Ripple宣布已集成Chainlink,为用户提供实时RLUSD定价数据,增强了稳定币在DeFi上的实用性和访问权限。DeFi开发人员还可以将RLUSD支持集成到他们的应用程序中,用于贷款和交易等多种用例。
    区块链
    2025-01-08 10:03:08
    莱特币在看涨突破后一周内上涨12%——282美元的目标现在就在眼前!
    区块链
    2025-01-08 09:41:19
    除了 Twitter 之外,还有其他地方可以追踪 AI 代理。
    区块链
    2025-01-08 09:31:18
    推荐专栏
    Boss Wallet Web3 Econom Pass
    Fully On-Chain & AI-Powered Meme Trading | #Xbit #DEX #Web3 | English: @XBITDEX | Chinese 华语 : @XBITDEX_ZH | Support: @XbitHelpDesk
    一位相信价值投资的币圈KOL。稳定盈利的缠论野生交易员 #BTC行情分析师 #价值投资 #链上数据分析
    爱Web 3,爱生活,爱科技,爱炒币的老韭菜
    热门币种
    更多
    币种
    美元价格
    24H涨跌幅
    BTC比特币
    120,062.48 USDT
    ¥879,631.76
    +1.3%
    ETH以太坊
    4,312.70 USDT
    ¥31,596.78
    +2.1%
    BNB币安币
    570.68 USDT
    ¥4,073.00
    -0.28%
    USDT泰达币
    1.02 USDT
    ¥7.25
    -0.19%
    SOL
    179.23 USDT
    ¥1,313.12
    -1.35%
    USDC
    1.00 USDT
    ¥7.15
    -0.01%
    TON
    3.41 USDT
    ¥24.95
    +2.07%
    XRP瑞波币
    0.47720 USDT
    ¥3.41
    +0.48%
    DOGE狗狗币
    0.12210 USDT
    ¥0.87140
    +2.43%
    ADA艾达币
    0.39050 USDT
    ¥2.79
    +3.88%
    热搜币种
    更多
    币种
    美元价格
    24H涨跌幅
    狗狗币
    0.3541 USDT
    ¥2.59
    -9.65%
    Filecoin
    5.3381 USDT
    ¥39.11
    -10.48%
    比特币
    120,062.48 USDT
    ¥879,631.76
    +1.3%
    Gatechain Token
    17.9689 USDT
    ¥131.65
    -2.85%
    Horizen
    8.37 USDT
    ¥61.32
    -2.22%
    dYdX
    1.4038 USDT
    ¥10.28
    -13.8%
    Solana
    179.23 USDT
    ¥1,313.12
    -1.35%
    柚子
    0.814 USDT
    ¥5.96
    -10.6%
    Shiba Inu
    2.174E-5 USDT
    ¥0.00
    -9.45%
    艾达币
    0.998 USDT
    ¥7.31
    -8.29%
    FTX Token
    2.9131 USDT
    ¥21.34
    -13.97%
    火币积分
    0.9291 USDT
    ¥6.81
    -29.01%
    最新快讯
    更多
    美国现货比特币ETF昨日净流入5346万美元
    2025-01-08 12:00:02
    昨日美国比特币现货ETF净流入5348万美元
    2025-01-08 11:59:02
    CertiKAlert:7天前部署的IPC代币存在漏洞,黑客通过闪电贷保护机制盗取约59万美元
    2025-01-08 11:58:42
    IREN:2024全年比特币挖矿产出达3984枚BTC
    2025-01-08 11:57:41
    昨日贝莱德IBIT净流入5.9718亿美元,交易量达31亿美元
    2025-01-08 11:54:57
    IPC代币疑遭攻击,损失约59万美元
    2025-01-08 11:53:10
    NOWPayments:比特币达到10万美元里程碑后,商家加密支付激增8%
    2025-01-08 11:53:03