不克不及被玩杂耍的块链的特点,一旦智能和约摆设在块链上,使生效的逻辑不克不及再变更。临时视域,这一要紧特点限度局限了智能化的可塑度和开展。。

接下来,我们的将绍介以任何办法设计和摆设和约,结果和约。。但翻新的绝不断定修正曾经破除的和约。,而不是摆设新和约、新的使生效逻辑,但可以持续应用持续存在的要旨。

率先要觉悟的是Ethereum Virtual Machine(EVM)要觉悟以任何办法使生效合约的哪稍微重大聚会。和约最遗嘱被缀编成音节码。,响应地启动一事务来使生效和约击中要害一重大聚会。,事务击中要害唱片同样音节码。,不理解的重大聚会的规定。。 以复杂和约为例:

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

缀编二元系加密:

6060604052341561000c57fe5b5b60ae8061001b6000396000f30060606040526000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680633c4308a814603a575bfe5b3415604157fe5b605e60048080359060200190919080359060200190919050506074565b6040518082815260200191505060405180910390f35b600081830290505b929150505600a165627a7a72305820c40f61d36a3a1b7064b58c57c89d5c3d7c73b9116230f9948806b11836d2960c0029

即使要使生效乘法重大聚会,计算8×7量稍微,事务击中要害唱片是0x3c4308a800000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000007 
陷于三分离: 第一是四音节3C4308A8。,居第二位的和第三引人注目是32音节长。,8和7。

3C4308A8是乘法重大聚会(署名)的署名。,应用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和约中使生效,应用A的限制因素,因而即使y重大聚会里修正某个限制因素的值且响应地限制因素的规定恰当的和A的某个限制因素规定分歧,A的限制因素将被修正。。把它评价一大于Y的重大聚会并使生效它。
  • delegatecall:与加密能与之比拟的东西,它是转乘重大聚会对转乘方机遇的使生效。,这合法的使付出努力上的多样化。
    看一举例:使紧密联系和约并应用付托代劳重大聚会转乘B和约,B和约的效能转乘C和约在CALCODE或C击中要害功能,因而你在重大聚会中看见的是;只是即使B在付托塑造中转乘C盟约的重大聚会,因而你在重大聚会中看见的是。把它评价是拿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值的找头:

可以看见使生效delegatecall较晚地z的值制造是8+7。 响应地,即使我们的中间变更侵入的的使生效逻辑,我们的以任何办法二全音符?

contract Plus {
    int z;
    function 增加(int) x, int y) { //sig:"0xccf65503"
        z = x+y;
    }
}
contract Multiply {
    int z;
    function 乘法(int) x, int y) { //sig:"0x3c4308a8"
        z = x*y;
    }
}
contract Main {
    int public z;
    function delegateCall(address _dest, bytes4 sig, int x, int y) {
        (SIG), x , y);
    }
}

我们的将合约的地址和重大聚会的signature当做限制因素前进给delegateCall去使生效,同意它本来是PLUS和约的路基,如今我们的把它翻新的成一倍数和约。:

0x4429这是加号和约的地址, 0xe905这是倍数和约的地址。。
我们的不久以后假如给它变更后的重大聚会signature和合约地址就可以应用新的使生效逻辑了!

而即使和约不快用于一人,该当在翻新的合约的時候迷住参与者的人都必需求翻新的澳门威尼斯人备用网址的所在地。此刻,我们的可以应用和约来扶助我们的辅导新和约的签署。,就像路由器同样地,我们的即使将它们一致(或以指定而尚未上任的科学实验报告的版式)发送到路由CO?,海峡和约有助于我们的找到合适的的所在地。,侵入的翻新的合约就只需求翻新的路由合约的材料那就够了。

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. 使生效(),经过付托代劳转乘晋级和约的get重大聚会,Z值相加。因它是付托代劳,因而Z值有效地是主和约本质上。,晋级和约的Z值为零。。

即使CueAccCeCar转乘的重大聚会具有赢利值,您麝香应用挨次集手工生产获取赢利值。,因付托和转乘是能与之比拟的东西的,单独地回归真实 of 虚伪代表使生效成。转乘击中要害调整器与缀编能与之比拟的东西。 code。
只是因它应用挨次集手工生产获取赢利值。,响应地,大前提是赢利值的上浆麝香是主力队员的。,因而当我们的在使移近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)、和MangGDB安排电子商务平台

稍微收费的块链曾经搜集和达成协议。、与台芳技术开展参与的证明,可以鉴于需求下载,证明使连续:

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. 在Fang达普发展机遇中到达Ubuntu   : https://pan.baidu.com/s/10qL4q-uKooMehv9X2R1qSA
12. 以太坊DApp发展机遇搭建-windows  :https://pan.baidu.com/s/1cyYkhIJIFuI2oyxM9Ut0eA
13. DApp在以太正方形的阴部束缚开展   : https://pan.baidu.com/s/1aBOFZT2bCjD2o0EILBWs-g
14. DApp在以太方窗击中要害阴部束缚开展  :

发表评论

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