Joe*_*Joe 8 javascript ethereum solidity
我试图从另一个工厂合同部署合同,然后返回新创建的合同的地址.但它返回的地址是事务哈希而不是契约地址.我相信这是因为当地址被退回时合同尚未开采.当我使用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];
}}
Run Code Online (Sandbox Code Playgroud)
这就是我调用createContract函数的方法.
factory.createContract(2,function(err, res){
if (err){
console.log(err)
}else{
console.log(res)
}
});
Run Code Online (Sandbox Code Playgroud)
Sam*_*son 17
考虑下面的例子.您可以通过多种方式获取合同地址:
contract Object {
string name;
function Object(String _name) {
name = _name
}
}
contract ObjectFactory {
function createObject(string name) returns (address objectAddress) {
return address(new Object(name));
}
}
Run Code Online (Sandbox Code Playgroud)
将合同中的地址存储为属性,并使用普通的getter方法检索它.
contract ObjectFactory {
Object public theObj;
function createObject(string name) returns (address objectAddress) {
theObj = address(new Object(name));
return theObj;
}
}
Run Code Online (Sandbox Code Playgroud)
Call在您进行交易之前您可以call在进行交易之前进行以下操作:
var address = web3.eth.contract(objectFactoryAbi)
.at(contractFactoryAddress)
.createObject.call("object");
Run Code Online (Sandbox Code Playgroud)
一旦你有地址执行交易:
var txHash = web3.eth.contract(objectFactoryAbi)
.at(contractFactoryAddress)
.createObject("object", { gas: price, from: accountAddress });
Run Code Online (Sandbox Code Playgroud)
否则,您可以计算未来合约的地址,如下所示:
var ethJsUtil = require('ethereumjs-util');
var futureAddress = ethJsUtil.bufferToHex(ethJsUtil.generateAddress(
contractFactoryAddress,
await web3.eth.getTransactionCount(contractFactoryAddress)));
Run Code Online (Sandbox Code Playgroud)