Contract-Development

如何訪問由另一個合約創建的合約的地址?

  • February 16, 2018

我在訪問另一個充當工廠的契約中生成的新契約的地址時遇到問題。我的程式碼:

合約對象{

字元串名稱;
函式對象(字元串_名稱){
名稱 = _name
}
}

合約對象工廠 {
函式 createObject(string name) 返回 (address objectAddress) {
返回地址(新對象(名稱));
}
}

當我編譯並執行該方法createObject('')時,我希望返回新合約的地址。相反,我收到了交易的雜湊值。我使用 Web3 執行功能:

var 地址 = web3.eth.contract(objectFactoryAbi)
.at(契約工廠地址)
.createObject("object", { gas: price, from: accountAddress });

我還嘗試修改函式以將地址儲存在數組中,返回數組的長度,然後在稍後檢索它,結果相同:始終返回事務雜湊。

歡迎對此提出任何意見。

通常,合約本身需要儲存地址以供將來使用。因此,只需將地址作為屬性儲存在合約中,並在交易完成後使用常用方法從合約外部檢索它(例如,如果您將其聲明為公共範圍,則呼叫預設的 getter ABI):(注意,未經測試虛擬碼,但我做過幾次類似的事情)

contract ObjectFactory {
   Object public theObj;

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

您應該call在進行交易之前進行:

var 地址 = web3.eth.contract(objectFactoryAbi)
.at(契約工廠地址)
.createObject.call("對象");

現在您有了地址,是的,您可以進行交易:

var txHash = web3.eth.contract(objectFactoryAbi)
.at(契約工廠地址)
.createObject("object", { gas: price, from: accountAddress });

否則,您可以像這樣計算未來合約的地址(程式碼未驗證):

var ethJsUtil = 需要 ('ethereumjs-util');
var futureAddress = ethJsUtil.bufferToHex(ethJsUtil.generateAddress(
契約工廠地址,
等待 web3.eth.getTransactionCount(contractFactoryAddress)));

引用自:https://ethereum.stackexchange.com/questions/8756