获取另一个合约部署的合约的地址
Getting the address of a contract deployed by another contract
我正在尝试从另一个工厂合约部署合约,然后 return 新创建合约的地址。然而,它 returns 的地址是交易哈希而不是合约地址。我相信这是因为当地址被 returned 时合约还没有被开采。当我使用 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)
}
});
考虑下面的例子。您可以通过多种方式获取合约地址:
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 存储地址并 Return 它:
将地址作为属性存储在合约中,并使用正常的 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)));
我们今天 运行 遇到了这个问题,我们正在解决它:
在创建新合约时引发事件。
然后一旦区块被挖掘,使用 t运行saction 哈希并调用 web3.eth.getTransaction
:
http://web3js.readthedocs.io/en/1.0/web3-eth.html#gettransaction
然后查看logs
对象,你应该找到你新创建的合约调用的事件及其地址。
注意:这假设您能够更新正在创建的合约的 Solidity 代码,或者它已经在创建时调用了此类事件。
我正在尝试从另一个工厂合约部署合约,然后 return 新创建合约的地址。然而,它 returns 的地址是交易哈希而不是合约地址。我相信这是因为当地址被 returned 时合约还没有被开采。当我使用 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)
}
});
考虑下面的例子。您可以通过多种方式获取合约地址:
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 存储地址并 Return 它:
将地址作为属性存储在合约中,并使用正常的 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)));
我们今天 运行 遇到了这个问题,我们正在解决它:
在创建新合约时引发事件。
然后一旦区块被挖掘,使用 t运行saction 哈希并调用 web3.eth.getTransaction
:
http://web3js.readthedocs.io/en/1.0/web3-eth.html#gettransaction
然后查看logs
对象,你应该找到你新创建的合约调用的事件及其地址。
注意:这假设您能够更新正在创建的合约的 Solidity 代码,或者它已经在创建时调用了此类事件。