获取另一份合同部署的合同地址

Joe*_*Joe 8 javascript ethereum solidity

我试图从另一个工厂合同部署合同,然后返回新创建的合同的地址.但它返回的地址是事务哈希而不是契约地址.我相信这是因为当地址被退回时合同尚未开采.当我使用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];
}}
Run Code Online (Sandbox Code Playgroud)

这就是我调用createContract函数的方法.

factory.createContract(2,function(err, res){
        if (err){
            console.log(err)
        }else{
        console.log(res)
        }
    });
Run Code Online (Sandbox Code Playgroud)

Sam*_*son 17

考虑下面的例子.您可以通过多种方式获取合同地址:

contract Object {

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

contract ObjectFactory {
    function createObject(string name) returns (address objectAddress) {
        return address(new Object(name));
    }
}
Run Code Online (Sandbox Code Playgroud)

1存储地址并将其退回:

将合同中的地址存储为属性,并使用普通的getter方法检索它.

contract ObjectFactory {
    Object public theObj;

    function createObject(string name) returns (address objectAddress) {
        theObj = address(new Object(name));
        return theObj;
    }
}
Run Code Online (Sandbox Code Playgroud)

2 Call在您进行交易之前

您可以call在进行交易之前进行以下操作:

var address = web3.eth.contract(objectFactoryAbi)
    .at(contractFactoryAddress)
    .createObject.call("object");
Run Code Online (Sandbox Code Playgroud)

一旦你有地址执行交易:

var txHash = web3.eth.contract(objectFactoryAbi)
    .at(contractFactoryAddress)
    .createObject("object", { gas: price, from: accountAddress });
Run Code Online (Sandbox Code Playgroud)

3计算未来地址

否则,您可以计算未来合约的地址,如下所示:

var ethJsUtil = require('ethereumjs-util');
var futureAddress = ethJsUtil.bufferToHex(ethJsUtil.generateAddress(
      contractFactoryAddress,
      await web3.eth.getTransactionCount(contractFactoryAddress)));
Run Code Online (Sandbox Code Playgroud)