以太坊中如何获取另外一个智能合约部署的合约地址?

简介: 如何获取另外一个智能合约部署的合约地址?我正试图从另一个工厂合约中签智能合约,然后重新部署新智能合约的地址。然而,它返回的地址是交易哈希值而不是合约地址。

如何获取另外一个智能合约部署的合约地址?

我正试图从另一个工厂合约中签智能合约,然后重新部署新智能合约的地址。然而,它返回的地址是交易哈希值而不是合约地址。我相信这是因为当地址被返回时合约尚未开采。当我使用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/

另外推荐一些之前的教程:

  • python以太坊,主要是针对python围绕web3.py进行区块链以太坊应用开发的讲解。
  • web3j,主要是针对java和android程序员围绕web3j库进行区块链以太坊开发的讲解。
  • php以太坊,主要是介绍使用php进行智能合约开发交互,进行账号创建、交易、转账、代币开发以及过滤器和事件等内容。
  • 以太坊开发,主要是介绍使用node.js、mongodb、区块链、ipfs实现去中心化电商DApp实战,适合进阶。
  • 以太坊教程,主要介绍智能合约与dapp应用开发,适合入门。
相关文章
|
开发框架 前端开发 JavaScript
CodeSandbox
【8月更文挑战第29天】CodeSandbox
909 62
|
搜索推荐 小程序 API
2025年5款免费活动报名工具推荐
本文选取草料二维码、云报名、活动行、群报数、百格活动五个平台进行深度对比,分析它们的优缺点、价格和应用场景,方便你选择合适的活动报名工具。
2025年5款免费活动报名工具推荐
|
人工智能 自然语言处理 数据安全/隐私保护
阿里云中国金融大模型整体市场第一
阿里云以33%的市场份额夺得中国金融大模型整体市场第一
|
存储 Windows
U盘格式化工具合集:6个免费的U盘格式化工具
在日常使用中,U盘可能会因为文件系统不兼容、数据损坏或使用需求发生改变而需要进行格式化。一个合适的格式化工具不仅可以清理存储空间,还能解决部分存储问题。本文为大家精选了6款免费的U盘格式化工具,并详细介绍它们的功能、使用方法、优缺点,帮助你轻松完成U盘格式化操作。
U盘格式化工具合集:6个免费的U盘格式化工具
|
存储 NoSQL 数据挖掘
在 ScyllaDB(或 Cassandra)中使用主键、分区键和群集键
在 ScyllaDB(或 Cassandra)中使用主键、分区键和群集键
269 0
|
人工智能 搜索推荐 数据挖掘
智能营销
【5月更文挑战第15天】智能营销
1206 1
DHL
|
缓存 算法 安全
[译][1.4K+ Star] Kotlin 新秀 Coil、Glide 和 Picasso 大比拼
Coil 是基于 Kotlin 开发的首个图片加载库,来自 Instacart 团队,来看看官网对它的最新的介绍。
DHL
1227 0
[译][1.4K+ Star] Kotlin 新秀 Coil、Glide 和 Picasso 大比拼
|
Web App开发 数据安全/隐私保护
文献管理Zotero使用方法介绍
本文介绍文献管理软件Zotero的基础使用方法,包括软件下载与安装、文献与PDF导入、在Word中插入参考文献等的方法~
1144 1
文献管理Zotero使用方法介绍
|
机器学习/深度学习 Rust 资源调度
Rust机器学习之Plotters
本文是“Rust替代Python进行机器学习”系列文章的第四篇,带领大家学习如何用Plotters作图。
1804 0
Rust机器学习之Plotters
|
JavaScript 安全 前端开发
漏洞发现:代码分析引擎 CodeQL
codeql 是一门类似 SQL 的查询语言,通过对源码(C/C++、C#、golang、java、JavaScript、typescript、python)进行完整编译,并在此过程中把源码文件的所有相关信息(调用关系、语法语义、语法树)存在数据库中,然后编写代码查询该数据库来发现安全漏洞(硬编码 / XSS 等)。
961 1
漏洞发现:代码分析引擎 CodeQL

热门文章

最新文章