14

我正在尝试从另一个工厂合同部署合同,然后返回新创建合同的地址。然而,它返回的地址是交易哈希而不是合约地址。我相信这是因为返回地址时合约还没有被挖掘。当我使用 web3 deploy 部署合同时,它似乎要等到合同部署完成后再输出地址。

工厂合同:

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

2 回答 2

31

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

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 存储地址并返回:

将地址作为属性存储在合约中,并使用普通的 getter 方法检索它。

contract ObjectFactory {
    Object public theObj;

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

2Call在您进行交易之前

您可以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)));
于 2017-02-23T13:19:47.340 回答
2

我们今天遇到了这个问题,我们正在解决它,如下所示:

在创建新合同时引发一个事件。

然后,一旦区块被开采,使用交易哈希并调用web3.eth.getTransactionhttp ://web3js.readthedocs.io/en/1.0/web3-eth.html#gettransaction

然后查看logs对象,您应该会找到新创建的合约调用的事件及其地址。

注意:这假设您能够更新正在创建的合约的 Solidity 代码,或者它已经在创建时调用了这样的事件。

于 2018-05-03T18:31:45.330 回答