別のファクトリ契約から契約を展開してから、新しく作成された契約のアドレスを返そうとしています。ただし、返されるアドレスは、コントラクトアドレスではなくトランザクションハッシュです。これは、住所が返送された時点で契約がまだ採掘されていないためだと思います。 web3デプロイを使用してコントラクトをデプロイすると、コントラクトがデプロイされるまで待ってからアドレスを出力するようです。
工場契約:
contract Factory {
mapping(uint256 => Contract) deployedContracts;
uint256 numContracts;
function Factory(){
numContracts = 0;
}
function createContract (uint32 name) returns (address){
deployedContracts[numContracts] = new Contract(name);
numContracts++;
return deployedContracts[numContracts];
}}
これが私がcreateContract関数を呼び出す方法です。
factory.createContract(2,function(err, res){
if (err){
console.log(err)
}else{
console.log(res)
}
});
以下の例を考えてみましょう。契約の住所を取得する方法はいくつかあります。
contract Object {
string name;
function Object(String _name) {
name = _name
}
}
contract ObjectFactory {
function createObject(string name) returns (address objectAddress) {
return address(new Object(name));
}
}
アドレスを属性としてコントラクトに格納し、通常のゲッターメソッドを使用して取得します。
contract ObjectFactory {
Object public theObj;
function createObject(string name) returns (address objectAddress) {
theObj = address(new Object(name));
return theObj;
}
}
Call
取引を行う前にトランザクションを行う前に、call
を作成できます。
var address = web3.eth.contract(objectFactoryAbi)
.at(contractFactoryAddress)
.createObject.call("object");
アドレスを取得したら、トランザクションを実行します。
var txHash = web3.eth.contract(objectFactoryAbi)
.at(contractFactoryAddress)
.createObject("object", { gas: price, from: accountAddress });
それ以外の場合は、次のように先物契約のアドレスを計算できます。
var ethJsUtil = require('ethereumjs-util');
var futureAddress = ethJsUtil.bufferToHex(ethJsUtil.generateAddress(
contractFactoryAddress,
await web3.eth.getTransactionCount(contractFactoryAddress)));
今日、この問題に遭遇し、次のように解決しています。
新しい契約の作成では、イベントを発生させます。
次に、ブロックがマイニングされたら、トランザクションハッシュを使用して、web3.eth.getTransaction
を呼び出します。 http://web3js.readthedocs.io/en/1.0/web3-eth.html#gettransaction
次に、logs
オブジェクトを見ると、新しく作成したコントラクトによって呼び出されたイベントとそのアドレスが見つかります。
注:これは、作成中のコントラクトのSolidityコードを更新できること、または作成時にそのようなイベントを既に呼び出していることを前提としています。