获取由另一个合约部署的合约地址

17

我试图在另一个工厂合约中部署一个合约,然后返回新创建的合约地址。但是它返回的地址是交易哈希而不是合约地址。我认为这是因为当地址被返回时,合约尚未被挖掘。当我使用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)
        }
    });
2个回答

36

考虑下面的例子。有几种方法可以获取合约地址:

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

在交易之前进行电话咨询

您可以在进行交易之前进行电话咨询


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

#2 中地址变量被用在哪里? - Luke W
#2中的“address”变量是新合同地址,因此您可以随心所欲地使用它。可能要将其保存在某个地方。 - Samuel Hawksby-Robinson
1
使用第一种方法,我得到了一个地址,它并不代表子对象。可能是什么导致了这个错误? - Leonardo Viada

3
我们今天遇到了这个问题,并且解决方法如下:
在创建新合约时,触发一个事件。
然后一旦区块被挖掘,使用交易哈希调用web3.eth.getTransaction: http://web3js.readthedocs.io/en/1.0/web3-eth.html#gettransaction 接着查看logs对象,应该能够找到由新创建的合约调用的事件及其地址。
注意:这假设你能够更新正在创建的Solidity代码或者它已经在创建时调用了这样的事件。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接