1. 程式人生 > >Solidity-通過new建立合約

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:
這裡寫圖片描述
釋出合約,並建立完成後,提示 No data is deployed on the contract address!:
這裡寫圖片描述

以上問題,經查閱資料,國外網友建議將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版本中釋出此合約成功,如下圖:
這裡寫圖片描述