Solidity-通過new建立合約
阿新 • • 發佈:2019-01-01
前言:
合約釋出工具及版本: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版本中釋出此合約成功,如下圖: