来自合同的可靠性应付建设者

时间:2018-04-16 07:00:35

标签: ethereum solidity smartcontracts

我有以下代码,即出现故障,从另一份合同创建应付合同。

pragma solidity ^0.4.16;

Contract Factory {
    uint contractCount = 0;
    mapping(uint => MyContract) public myContracts;

    function createContract(uint money) external payable {
        require(msg.value >= money);
        contractCount++;
        // the following line fails
        myContracts[contractCount] = new MyContract(money);
    }
}

Contract MyContract {
    uint money;

    function MyContract(uint _money) {
        require(msg.value >= _money);
        money = _money;
    }
}

我正在使用Remix IDE。我可以毫无问题地创建Factory的实例,但是,当我尝试createContract(money)时,它无法创建新的MyContract实例。我怀疑这是因为调用new MyContract()的方式没有传输任何值,因此MyContract构造函数中的require(msg.value> = _money)失败了。

那么如何从合同中创建应付构造函数的实例呢?

2 个答案:

答案 0 :(得分:4)

首先,你需要让你的构造函数为此工作。

  

我怀疑是因为调用新MyContract()的方式没有传输任何值,因此在MyContract构造函数中失败了require(msg.value> = _money)。

你是对的。 Solidity的这种做法有点不同寻常。请查看文档的this部分。

child = (new B).value(10)(); //construct a new B with 10 wei

如果构造函数接受参数,则它们会进入附加到新表达式的最后一个括号中。

在您的示例中,它看起来像这样:

myContracts[contractCount] = (new MyContract).value(msg.value)(money);

答案 1 :(得分:1)

对于那些仍在寻求解决此问题的人。 .value已过时,使用新语法的示例如下所示:

myContracts[contractCount] = (new MyContract){value: msg.value}(money);