以太坊中如何獲取另外一個智慧合約部署的合約地址?

馬拉喀什發表於2018-07-17

如何獲取另外一個智慧合約部署的合約地址?

我正試圖從另一個工廠合約中籤智慧合約,然後重新部署新智慧合約的地址。然而,它返回的地址是交易雜湊值而不是合約地址。我相信這是因為當地址被返回時合約尚未開採。當我使用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)
        }
    });

可以參考下面的例子,有很多方式可以獲得智慧合約地址:

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.在交易前呼叫:

你可以在發生交易之前進行呼叫:

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

原文《以太坊常見問題和錯誤》中的:
http://cw.hubwiz.com/card/c/ethereum-FAQ/1/1/7/

另外推薦一些之前的教程:

  • python以太坊,主要是針對python圍繞web3.py進行區塊鏈以太坊應用開發的講解。
  • web3j,主要是針對java和android程式設計師圍繞web3j庫進行區塊鏈以太坊開發的講解。
  • php以太坊,主要是介紹使用php進行智慧合約開發互動,進行賬號建立、交易、轉賬、代幣開發以及過濾器和事件等內容。
  • 以太坊開發,主要是介紹使用node.js、mongodb、區塊鏈、ipfs實現去中心化電商DApp實戰,適合進階。
  • 以太坊教程,主要介紹智慧合約與dapp應用開發,適合入門。


相關文章