web-dev-qa-db-ja.com

別の契約によって展開された契約のアドレスを取得する

別のファクトリ契約から契約を展開してから、新しく作成された契約のアドレスを返そうとしています。ただし、返されるアドレスは、コントラクトアドレスではなくトランザクションハッシュです。これは、住所が返送された時点で契約がまだ採掘されていないためだと思います。 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)
        }
    });
8
Joe

以下の例を考えてみましょう。契約の住所を取得する方法はいくつかあります。

contract Object {

    string name;
    function Object(String _name) {
        name = _name
    }
}

contract ObjectFactory {
    function createObject(string name) returns (address objectAddress) {
        return address(new Object(name));
    }
}

1アドレスを保存して返します。

アドレスを属性としてコントラクトに格納し、通常のゲッターメソッドを使用して取得します。

contract ObjectFactory {
    Object public theObj;

    function createObject(string name) returns (address objectAddress) {
        theObj = address(new Object(name));
        return theObj;
    }
}

2 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 });

3将来の住所を計算する

それ以外の場合は、次のように先物契約のアドレスを計算できます。

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コードを更新できること、または作成時にそのようなイベントを既に呼び出していることを前提としています。

1