Solidity-通过new创建合约

前言:

合约发布工具及版本:mist v0.11.0、mist v0.9.3

一:通过new创建合约(Creating Contracts via new)

合约可以使用new关键字创建新合约。必须事先知道要创建的合约的完整代码,因此递归创建依赖(recursive creation-dependencies)是不可能的。

二:实例

pragma solidity ^0.4.24;
contract A {
    uint public x;  # solidity自动为public变量创建同名方法x()
    uint public amount;

    constructor(uint _a) public payable {
        x = _a;
        amount = msg.value;
    }
}


contract B {
    event e(uint x, uint amount);

    A d = new A(4);

    constructor(uint _u) public payable {
        emit e(d.x(), d.amount());
        A d1 = new A(_u);
        emit e(d1.x(), d1.amount());
    }

    function creatA(uint _x, uint _amount) public {
        # 创建A合约,同时发送ether
        A d2 = (new A).value(_amount)(_x);
        emit e(d2.x(), d2.amount());
    }
}

正如在这个例子中所看到的,创建D的实例时使用.value()可以直接发送ether,但是不能限制gas量。如果由于堆栈、没有足够的余额或其他问题创建失败,则引发异常。
在mist v0.11.0 、 v0.11.1两个版本中发布此合约,提示Couldn’t estimate gas, resorting to default parameters. Transaction is likely cheaper than the estimate:
Solidity-通过new创建合约_第1张图片
发布合约,并创建完成后,提示 No data is deployed on the contract address!:
Solidity-通过new创建合约_第2张图片

以上问题,经查阅资料,国外网友建议将mist版本换为v0.9.3,则合约代码更新为:

pragma solidity ^0.4.0;
contract A {
    uint public x;
    uint public amount;

    function A(uint _a) public payable {
        x = _a;
        amount = msg.value;
    }
}


contract B {
    event e(uint x, uint amount);

    A d = new A(4);

    function B(uint _u) public payable {
        e(d.x(), d.amount());
        A d1 = new A(_u);
        e(d1.x(), d1.amount());
    }

    function creatA(uint _x, uint _amount) public {
        A d2 = (new A).value(_amount)(_x);
        e(d2.x(), d2.amount());
    }
}

在mist v0.9.3版本中发布此合约成功,如下图:
Solidity-通过new创建合约_第3张图片

你可能感兴趣的:(区块链)