在区块链上开发可更新的智能合约

鉴于块链不克不及被损害的证据,一旦智能和约布置在块链上,它的处死逻辑不克不及再被零钱。。一世纪一次的自己去看,这一要紧特点限度局限了智能化的伸缩性和开展。。

接下来,朕将引见健康状况如何设计和布置和约,其目的是为了和约。。但使更新没有平均数修正先前破除的和约。,这是顾虑布置新和约。、新的处死逻辑,但可以持续应用目前的的通知。

率先要知情的是以太 Virtual Machine(EVM)要知情健康状况如何处死和约的功用。和约最最后被编制成八位字节码。,与启动第一事务来处死和约击中要害第一行使职责。,事务击中要害记载异样八位字节码。,这责怪公众能领会的行使职责称呼。。 以第一简略的和约为例。:

contract Multiply {
    function 乘法(int) x, int y) constant 恢复(int) {
        return x*y; 
    }
}

编制二元系指定遗传密码:

6060604052341561000c57fe5b5b60ae8061001b6000396000f30060606040526000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680633c4308a814603a575bfe5b3415604157fe5b605e60048080359060200190919080359060200190919050506074565b6040518082815260200191505060405180910390f35b600081830290505b929150505600a165627a7a72305820c40f61d36a3a1b7064b58c57c89d5c3d7c73b9116230f9948806b11836d2960c0029

假设你想处死乘法行使职责,作出8×7相等的几何。,事务击中要害记载是0x3c4308a800000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000007 
陷于三比: 第第一是四八位字节的3C4308A8。,居第二位的和第三限制因素是32八位字节长。,8和7。

3c4308a8这是第一乘法行使职责。signature(署名,应用Sa3获取行使职责名和限制因素典型。0x):

sha3("乘法(int)256,int256)"));
//0x3c4308a8851ef99b4bfa5ffd64b68e5f2b4307725b25ad0d14040bdb81e3bafc sha3("乘法(int)256,It256)())子串(2),8);
//3c4308a8

EVM依赖于行使职责的署名来知情要处死哪个行使职责。。在合约编制完的八位字节码里查询也能找到刚过去的signature。

接下来,据我看来引见一下Solidity的三种下令方式。:call、callcode和delegatecall

  • call:转让的普通方式执意这么。,处死上下文跳到下第一行使职责的周围(这边的周围是指msg的值和合约的Storage)。假设转让的行使职责是区分的盟约行使职责,这么,挨次转让挨次。
  • callcode:同呼叫同上,很的对转让方的周围处死转让行使职责。
    让A和约的X行使职责转让B约束的y行使职责。,Y行使职责在A和约中处死。,应用限制因素,因而假设y行使职责里修正某个限制因素的值且刚过去的限制因素的称呼刚才和A的某个限制因素称呼分歧,A的限制因素将被修正。。把它设想成第一具有接连不断第一Y行使职责的行使职责并处死它。。
  • delegatecall:与指定遗传密码异体同形,它是转让行使职责对转让方周围的处死。,价格不料第一相异。。
    让朕自己去看第一榜样。:参加和约并应用付托代劳行使职责转让B和约,B和约的功用转让C和约在CALCODE或C击中要害功用,因而行使职责会看见B。;除了假设B在付托典型中转让C盟约的行使职责,因而行使职责将看见A。。把它名声是抚养MSG相关性值整齐的的一种方式。。

接下来,让朕着手付托代劳的后果。:

contract Plus {
    int z;
    function 添加剂(int) x, int y) {
        z = x+y;
    }
}
contract Multiply {
    int public z;
    function 乘法(int) x, int y) {
        z = x*y;
    }
    function delegateToPlus(address _plus, int x, int y) {
        ( bytes4(sha3("添加剂(int)256,int256)")) ,x ,
        y);
    }
}

布置并按挨次处死Multiply的multiply和delegateToPlus并观看z值的代替物:

0x4429这是添加剂和约的地址。, 0xe905这是多重的和约的地址。。
朕过后只需给它零钱后的行使职责signature和合约地址就可以应用新的处死逻辑了!

除了否和约责怪筹码第一人的,,该当在使更bet365网址的時候持有违禁物插一脚的人都必只得使更新bet365网址的外景。此刻,朕可以应用和约来帮忙朕教练新和约的签署。,就像路由器同上。,朕假设将它们一致(或以指派同意的表格)发送到路由CO?,与朕将由路由和约引航员到很的外景。,未来的使更bet365网址就只需求使更新路由合约的材料那就够了。

contract Upgrade {
    mapping(bytes4=>uint32) returnSizes;
    int z;
    
    function initialize() {
        returnSizes[bytes4(sha3("get()"))] = 32;
    }
    
    function 添加剂(int) _x, int _y) {
        z = _x + _y;
    }
    function get() 恢复(int) {
        return z;
    }
}
contract Dispatcher {
    mapping(bytes4=>uint32) returnSizes;
    int z;
    address upgradeContract;
    address public dispatcherContract;
    function 交换(地址) newUpgradeContract) {
        upgradeContract = newUpgradeContract;
        (ByTES4(Saa3(设定初值())))
    }
    function() {
        bytes4 sig;
        assembly { sig := calldataload(0) }
        var len = returnSizes[sig];
        var target = upgradeContract;
        
        assembly {
            calldatacopy(mload(0x40), 0x0, calldatasize)
            付托(子), 10000), target, mload(0x40),
                         calldatasize, mload(0x40), 莱恩)
            return(mload(0x40), 莱恩)
        }
    }
}
contract Main {
    mapping(bytes4=>uint32) public returnSizes;
    int public z;
    address public upgradeContract;
    address public dispatcherContract;
    
    function deployDispatcher() {
        dispatcherContract = new Dispatcher();
    }
    
    function updateUpgrade(address newUpgradeContract) {
        (
            bytes4( sha3("交换(地址))")), newUpgradeContract
        );
    }
    
    function delegateCall(bytes4 _sig, int _x, int _y) {
        (_sig, _x, _y);
    }
    
    function get() constant 恢复(int) 输入)
        (bytes4( Sa3(GET()))
        assembly {
            output := mload(0x60)
        }
    }
}

处死挨次:
1. 处死() 布置路由同意
2. 布置upgrade合约并将其address当做()的限制因素传入用来使更新upgrade合约的地址材料。
3. 处死(),限制因素是添加剂(int)256,署名和诸如此类两个值的IT256)。
4. 处死(),由付托代劳转让晋级和约的获取行使职责。,恢复Z值彼此相加。由于它是付托代劳。,因而刚过去的Z值性质上是主和约亲手。,晋级和约的Z值为零。。

假设CueAccCeCar转让的行使职责具有恢复值,必然要应用挨次集人工操作检索恢复值。,由于付托与转让是同上的。,只会回到真 of 虚伪表现成的处死。。Dispatcher在转让是异样异样用assembly code。
但由于是用assembly人工操作流行恢复值,到这程度,事先准备是恢复值的上胶料必然要是整齐的的。,因而当朕在使移近2使更新晋级和约时,Dispatcher合约同时去转让upgrade合约的initialize()行使职责,upgrade合约在initialize行使职责里将它持有违禁物会有恢复值的行使职责的恢复值巨大研究returnSizes中,与,假设转让具有恢复值的行使职责,,调整器知情恢复值。巨大了

不狂暴的短时间。限制因素限制序列
由于盟约处死需求限制因素值。,它会转变成类似的贮存外景去找寻它。。到这程度,假设您的和约限制因素是这么限制的,
upgrade:
int x
int y
— — — — 
Dispathcer:
int x
int y
— — — — 
Main:
int x
int abc
int y
当upgrade合约的行使职责需求用到x和y的值的时分,它未发现Y。,由于贮存是首要的。。

分享两个航线和稍微收费的通知给朗读者。:

尤指服装、颜色等相配块状链老手的达普新球场:

块链、星相际论文系统(IPFS)、应用MUGODB构成电子商务平台

搜集和搜集稍微收费的块链。、乙醚安技术开拓相关性论文,假设需求,你可以下载它。,论文并置:

1. web3.js API官气十足文档中文版:https://pan.baidu.com/s/1hOV9hEzi7hFxJCL4LTvC6g
2. 以太坊官气十足文档中文版     :https://pan.baidu.com/s/1ktODJKLMBmkOsi8MPrpIJA
3. 以太坊白皮书中文版       :https://pan.baidu.com/s/1bzAFnzJ35hlQxJ2J4Oj-Ow
4. Solidity的官气十足文档中文版 :https://pan.baidu.com/s/18yp9XjEqAHpiFm2ZSCygHw
5. Truffle的官气十足文档中文版  :https://pan.baidu.com/s/1y6SVd7lSLUHK21YF5FzIUQ
6. C块挨次链指导         :https://pan.baidu.com/s/1sJPLqp1eQqkG7jmxqwn3EA
7. 砌块链技术导则        :https://pan.baidu.com/s/13cJxAa80I6iMCczA04CZhg
8. 大师少量币中文版        :https://pan.baidu.com/s/1lz6te3wcQuNJm28rFvBfxg
9. 砌块链开拓        :https://pan.baidu.com/s/1Ldpn0DvJ5LgLqwix6eWgyg
10. geth应用指导文档中文版   :https://pan.baidu.com/s/1M0WxhmumF_fRqzt_cegnag
11. 以太坊DApp开拓周围搭建-Ubuntu   : https://pan.baidu.com/s/10qL4q-uKooMehv9X2R1qSA
12. 达普开展周围击中要害扩大窗  :https://pan.baidu.com/s/1cyYkhIJIFuI2oyxM9Ut0eA
13. DAPP开展的人事栏链被发展的状态- Ubuntu   : https://pan.baidu.com/s/1aBOFZT2bCjD2o0EILBWs-g
14. DAPP开拓公有链构成窗口  :

发表评论

电子邮件地址不会被公开。 必填项已用*标注