以太坊中如何获取另外一个智能合约部署的合约地址?
如何获取另外一个智能合约部署的合约地址?
我正试图从另一个工厂合约中签智能合约,然后重新部署新智能合约的地址。然而,它返回的地址是交易哈希值而不是合约地址。我相信这是因为当地址被返回时合约尚未开采。当我使用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]; }}
下面是调用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.存储地址并在需要的时候返回:
将智能合约中的地址作为属性存储并使用普通的getter
方法检索。
contract ObjectFactory { Object public theObj; function createObject(string name) returns (address objectAddress) { theObj = address(new Object(name)); return theObj; } }
2.在交易前调用:
你可以在发生交易之前进行调用:
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)));
原文《以太坊常见问题和错误》中的:
http://cw.hubwiz.com/card/c/ethereum-FAQ/1/1/7/
另外推荐一些之前的教程:

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
如何使用truffle来测试以太坊的事件日志Event logs?
如何使用truffle来测试以太坊的事件日志Event logs? 例如我有一个智能合约函数,它在每次调用中触发事件。 我想在每次通过的测试中发送一个事件,下面是我的一些测试: it("should emit Error event when sending 5 ether", function(done){ var insurance = CarInsurance.deployed(); insurance.send({from: accounts[0], value: web3.toWei(5, 'ether')}).then(done).catch(done); }); it("should emit Error event when sending 5 ether", function(done){ var insurance = CarInsurance.deployed(); insurance.send({from: accounts[0], value: web3.toWei(5, 'ether')}).then(function(txHash){ assert.not...
- 下一篇
以太坊gas是什么?gasprice怎么计算?
在Ethereum以太坊中,什么是gas,它是如何使用的,gasprice和startgas的区别是什么? 另外gas是如何计算的,它到底是有什么样的价值? 在比特币中,每一笔交易都为网络创造了同样数量的work。在Ethereumy以太坊中,不同的交易在存储、处理器和内存根据使用情况对网络形成了不同的成本,因此这些交易需要相应地费用。最好的官方(ish)解释在这里:gasvsgasprice就是你的弹药 一个交易花费最大gas是3141592个单位。单位最低价格为50000000000 wei。(0.00000005以太币)。因此,在下面的示例中TX作为gas的以太币的量可能是这样的: 3141592个单位×50000000000wei/单位=157079600000000000wei(0.1570796以太币)。 示例使用(https://github.com/fivedogit/solidity-baby-steps/blob/master/contracts/58_indexOf.sol): indexof.indexOf.sendTransaction(“I am cool”...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS7,8上快速安装Gitea,搭建Git服务器
- 设置Eclipse缩进为4个空格,增强代码规范
- SpringBoot2全家桶,快速入门学习开发网站教程
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Red5直播服务器,属于Java语言的直播服务器
- CentOS8安装Docker,最新的服务器搭配容器使用
- Docker安装Oracle12C,快速搭建Oracle学习环境
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- SpringBoot2更换Tomcat为Jetty,小型站点的福音