合约发布工具及版本:mist v0.11.0、mist v0.9.3
合约可以使用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版本中发布此合约成功,如下图: