【问题标题】:Getting the address of a contract deployed by another contract获取另一个合约部署的合约地址
【发布时间】:2017-07-03 00:02:01
【问题描述】:

我正在尝试从另一个工厂合约部署合约,然后返回新创建合约的地址。然而,它返回的地址是交易哈希而不是合约地址。我相信这是因为返回地址时合约还没有被挖掘。当我使用 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)
        }
    });

【问题讨论】:

    标签: javascript ethereum solidity


    【解决方案1】:

    考虑下面的例子。获取合约地址的方式有多种:

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

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

    【讨论】:

    • #2 中使用的地址变量在哪里?
    • #2 中的address var 是新的合约地址,所以你可以用它做任何你想做的事情。可能会保存在某个地方。
    • 使用方法#1 我得到一个不代表子对象的地址。什么可能导致此错误?
    【解决方案2】:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2022-12-03
      • 2022-06-13
      • 1970-01-01
      • 1970-01-01
      • 2018-02-04
      • 2021-06-12
      • 1970-01-01
      • 1970-01-01
      • 2019-03-22
      相关资源
      最近更新 更多