匿名用戶5星評價
2020-05-09 13:23:46
可以的,參考合約之間的交互。數(shù)字貨幣交易平臺幣匯。比如我正試圖從另一個工廠合約中簽智能合約,然后重新部署新智能合約的地址。然而,它返回的地址是交易哈希值而不是合約地址。我相信這是因為當?shù)刂繁环祷貢r合約尚未開采。當我使用Web3部署智能合約時,它似乎一直等到智能合約被部署完成后才輸出合約地址。
武舷笨6星評價
2020-05-09 13:23:57
如何獲取另外一個智能合約部署的合約地址?
我正試圖從另一個工廠合約中簽智能合約,然后重新部署新智能合約的地址。然而,它返回的地址是交易哈希值而不是合約地址。我相信這是因為當?shù)刂繁环祷貢r合約尚未開采。當我使用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];
}}
下面是調(diào)用createContract函數(shù)的方法:
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.在交易前調(diào)用:
你可以在發(fā)生交易之前進行調(diào)用:
var address = web3.eth.contract(objectFactoryAbi)
.at(contractFactoryAddress)
.createObject.call("object");
一旦這個合約地址執(zhí)行交易那么:
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)));