Ethereum 从合同中支付的保证金

Ethereum 从合同中支付的保证金,ethereum,solidity,smartcontracts,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 >= mon

我有以下代码,这是故障,从另一个合同创建一个应付合同

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;
    }
}
我使用的是混音IDE。我可以毫无问题地创建Factory实例,但是,当我尝试createContract(money)时,它无法创建新的MyContract实例。我怀疑这是因为调用
new MyContract()
的方法没有传递任何值,因此无法满足
MyContract
构造函数中的要求(msg.value>=\u money)


那么,我如何从合同中创建一个付费构造函数的实例呢?

首先,您需要让您的构造函数付费才能工作

我怀疑这是因为调用new MyContract()的方法没有传输任何值,因此无法满足MyContract构造函数中的要求(msg.value>=\u money)

你说得对。Solidity这样做的语法有些不同寻常。请看一下文档的一节

child = (new B).value(10)(); //construct a new B with 10 wei
如果构造函数接受参数,它们将放在新表达式的最后一个括号中

在您的示例中,它将如下所示:

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

首先,你需要让你的建造商为此支付费用

我怀疑这是因为调用new MyContract()的方法没有传输任何值,因此无法满足MyContract构造函数中的要求(msg.value>=\u money)

你说得对。Solidity这样做的语法有些不同寻常。请看一下文档的一节

child = (new B).value(10)(); //construct a new B with 10 wei
如果构造函数接受参数,它们将放在新表达式的最后一个括号中

在您的示例中,它将如下所示:

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

对于那些仍在寻找解决方案的人
.value
已被弃用,使用新语法的示例如下所示:

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

对于那些仍在寻找解决方案的人
.value
已被弃用,使用新语法的示例如下所示:

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