Contract-Development
如何訪問由另一個合約創建的合約的地址?
我在訪問另一個充當工廠的契約中生成的新契約的地址時遇到問題。我的程式碼:
合約對象{ 字元串名稱; 函式對象(字元串_名稱){ 名稱 = _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)));