web3.js如何搜索所有曾经创建的合约并查看地址

2024-02-19

我是 web3.js 和 Solidity 的新手。我的问题与我们在区块链上搜索的方式有关。如果我们知道合约地址,就很容易搜索特定合约。然而,我们如何使用最初用于创建合约的地址来查找和识别特定类型的合约。

例如。 我有一个合同 ContractA,它是由“from”地址使用 web3.js 创建的。现在我想找到由Address创建的ContractS的所有实例。

我尝试使用 web3.eth.filter API 进行搜索,但注意到没有返回。请帮忙。

我还阅读了有关使用注册表模式来存储所有合同并询问注册表的信息,但找不到任何有用的示例。


对于那些正在寻找方法的人来说,正如 Adam 在他的帖子中所说,没有直接的方法可以找到由钱包地址创建的合约。因此,我们必须实现如下所示的注册表模式来跟踪事物,并且只需在 web3.js 中询问该合同,也如下所示......

这就是我的合同的样子

contract ContractA {
  bool public is_approved;
  address public visa_details;
  uint public artifact_count;

  // constructors
  function ContractA() public {
    owner = msg.sender;
  }
}

这是注册表模式合约

contract ContractARegistry {
  mapping(address => address[]) user_contracts;

  function registerContract(address contractA) public {
    user_applications[msg.sender].push(contractA) - 1; // -1 is very important
  }

  function findContract(address user) view public returns (address[]){
    return user_contracts[user];
  }
}

在 web3.js 中你可以这样搜索(我使用的是 Angular4)

import * as ContractA from '../../../../build/contracts/ContractA.json';
import * as UserContracts from '../../../../build/contracts/UserContracts.json';
import * as TruffleContract from 'truffle-contract';
import {Observable} from "rxjs/Observable";

declare var window: any;

@Injectable()
export class AppWeb3ContractAService {
  CONTRACT_A = TruffleContract(ContractA);
  USER_CONTRACTS = TruffleContract(UserContracts);

  constructor(private appWeb3Svc: AppWeb3Service) {
    console.log("Injecting the provider");
    this.CONTRACT_A.setProvider(this.appWeb3Svc.currentProvider());
    this.USER_CONTRACTS.setProvider(this.appWeb3Svc.currentProvider());
  }

  create(ethAddress): Observable<any> {
    return Observable.create(observer => {
      this.CONTRACT_A
        .new({
          from: ethAddress
        })
        .then(application => {
          this.USER_CONTRACTS
            .deployed()
            .then(registry => {
              registry.registerContractA(application.address, {from: ethAddress})
                .then(result => observer.next(application))
                .catch(error => observer.error(error));
            })
            .catch(error => observer.error(error));
        })
        .catch(error => observer.error(error));
    });
  }


  findAll(ethAddress: string):
    Observable<any[]> {
    return Observable.create(observer => {
      this.USER_CONTRACTS
        .deployed()
        .then(registry => {
          registry.findUserContracts(ethAddress, {from: ethAddress})
            .then(addresses => {
              addresses.forEach(address => observer.next(this.CONTRACT_A.at(address)));
            })
            .catch(error => observer.error(error));
        })
        .catch(error => observer.error(error));
    });
  }
}

这就是我的 appWeb3Svc 的样子

import {Injectable} from '@angular/core';
import {environment} from '../../../environments/environment';
import * as Web3 from 'web3';

declare var window: any;

@Injectable()
export class AppWeb3Service {
  public web3: Web3;

  checkAndInstantiateWeb3 = () => {
    // Checking if Web3 has been injected by the browser (Mist/MetaMask)
    if (typeof window.web3 !== 'undefined') {
      console.warn(
        'Using web3 detected from external source. If you find that your accounts don\'t appear or you have 0 MetaCoin, ensure you\'ve configured that source properly. If using MetaMask, see the following link. Feel free to delete this warning. :) http://truffleframework.com/tutorials/truffle-and-metamask'
      );
      // Use Mist/MetaMask's provider
      this.web3 = new Web3(window.web3.currentProvider);
    } else {
      console.warn(
        'No web3 detected. Falling back to ${environment.HttpProvider}. You should remove this fallback when you deploy live, as it\'s inherently insecure. Consider switching to Metamask for development. More info here: http://truffleframework.com/tutorials/truffle-and-metamask'
      );
      // fallback - use your fallback strategy (local node / hosted node + in-dapp id mgmt / fail)
      this.web3 = new Web3(
        new Web3.providers.HttpProvider(environment.HttpProvider)
      );
    }
  };

  constructor() {
    this.checkAndInstantiateWeb3();
  }

  currentProvider() {
    return this.web3.currentProvider;
  }

  eth() {
    return this.web3.eth;
  }

  isAddress(ethAddress: string): boolean {
    if (this.web3) {
      return this.web3.isAddress(ethAddress);
    }
    return false
  }
}

希望这可以帮助!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

web3.js如何搜索所有曾经创建的合约并查看地址 的相关文章

随机推荐

  • TypeORM jsonb 数组列

    我正在开发一个节点微服务 orm和b分别是typeorm and postgresql 我正在尝试创建jsonb数组列 但我可能没有以正确的方式进行操作 Notes 我通常会通过简单地添加一个简单的额外实体和关系来完成此任务 在这种情况下
  • Phonegap + jQuery Ajax Post 不起作用

    我正在尝试将数据作为 POST 数据从我正在使用 jQuery 开发的 PhoneGap 应用程序发送到本地页面 ajax method POST url http api return php data name John locatio
  • Twig 更改元数据

    我需要获取树枝中页面的元数据 以便用我的值替换它们 但我不知道如何获取它们 现在我有 if spec name matches meta set getdatas app request server get REQUEST URI use
  • php - 在 处爆炸字符串。但忽略小数,例如 2.9

    目前我正在爆炸一个字符串 它按我喜欢的方式工作 唯一的问题是 当 以小数点形式出现 有没有办法排除decimal来自爆炸函数的点 我当前的设置 正如你所看到的 它正在爆炸 两个数字之间 String This is a string It
  • Powershell - 从 csv 文件获取行并输出到不同 csv 文件的更快方法

    我有一个包含大约 250 000 行的 csv 文件 此 csv 文件中的第一个标题是 营销活动参考代码 我还有一个需要在第一列中查找的活动参考代码列表 即 COLMABQ140 COLMABQ141 如果我在第一列中找到此活动参考代码 我
  • C# 如何在 GridView 上创建超链接 OnClick 事件?

    我在创建我想要的 GridView 时遇到问题 我希望用户进入网站并查看附加到数据库的 GridView 列是 ID InsertionTime Filepath ProccessedByUser现在我希望用户单击他 她想要处理的文件路径
  • 无法使用自动配置脚本在代理后面下载嵌入式 MongoDB

    我有一个使用 Maven 构建的 Spring Boot 项目 我打算在其中使用嵌入式 mongo db 我在 Windows 7 上使用 Eclipse 正如我在 Internet 选项 的 连接 选项卡中观察到的那样 我位于使用自动配置
  • 在 JavaScript 中,如何检测迭代器返回键值条目?

    考虑以下函数 当传递一个可迭代的东西时 该函数尝试实现通用行为 let f function thing if typeof thing Symbol iterator function for let key value of thing
  • 使用.Net Core创建UDP套接字

    如何创建一个 UDP 套接字以非阻塞方式接收本地端点中的数据 我不知道数据来自的远程端口 我在 Linux 中使用 NET Core 我认为我可以使用 ReceiveAsync 但它似乎无法以这种方式工作 我这样解决了这个问题 static
  • 应用程序配置不允许给定 URL

    我正在尝试根据以下内容创建 Facebook 登录页面this https developers facebook com docs facebook login getting started web 教程 我只改变了两行 appId 3
  • Openpyxl:如何在检查单元格是否包含特定值后复制行

    我有一个工作表 每周都会更新数千行 并且需要在过滤后从该工作表传输行 我正在使用当前代码查找具有所需值的单元格 然后将整行传输到另一张工作表 但保存文件后 出现 IndexError 列表索引超出范围 异常 我使用的代码如下 import
  • 如何在对话框片段上运行单元测试?

    我正在尝试为 DialogFragment 创建一个独立的单元测试 以便 DialogFragment 可以单独进行测试 我正在使用 FragmentScenario 启动 DialogFragment 现在我正在尝试确认是否显示对话框消息
  • 打包时Maven NumberFormatException

    在项目上运行 mvn package 或 mvn install deploy 时 我在 Windows PC 上遇到非常奇怪的错误 此错误仅发生在本机上 在我的笔记本电脑和其他计算机上一切正常 我曾经能够毫无问题地打包 安装项目 但现在甚
  • 从 TableViewCell 中删除 imageView 子层

    当我有图像时 我使用 CAGradientLayer 插入子图层 layer name Gradient cell imageView layer insertSublayer layer atIndex 0 当 ImageView 没有图
  • 没有 jQuery 的粘性侧边栏 javascript

    如何制作带有塞子的粘性垂直侧边栏 但是withoutjQuery 有没有任何片段 插件 我不需要它来支持旧版浏览器 我的意思不仅仅是位置 固定 它必须保持在同一个位置 然后当您滚动超过某个点时开始粘性 固定 然后它必须在停止点停止跟随 Li
  • Java:在线纸牌游戏库/类/例如[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找在线纸牌游戏的java示例解决方案 库 类 我有兴趣创建一个名为 非盈利 的游戏版本 千 h
  • iOS 项目的单元测试 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我对于 iOS 开发还是比较陌生的 对于任何类型的测试 除了编译 运行和检查你想到的任何东西 之外的测
  • 当表单操作属性为“#”(数字/井号/符号/字符)时,这意味着什么?

    当表格出现时 这意味着什么action属性是 数字 井号 符号 字符 当表单输入时会发生什么formaction属性设置为 这是否会阻止输入被提交到服务器
  • 用按位运算替换最低有效位

    用提供的位替换字节的最低有效位的最佳方法是什么 我知道如何检查和比较最后一位 例如使用 posix ffs 函数 但我想知道是否有性能更好的解决方案 而不检查替换位是 0 还是 1 该示例是用 python 伪代码编写的 但我将用 C 实现
  • web3.js如何搜索所有曾经创建的合约并查看地址

    我是 web3 js 和 Solidity 的新手 我的问题与我们在区块链上搜索的方式有关 如果我们知道合约地址 就很容易搜索特定合约 然而 我们如何使用最初用于创建合约的地址来查找和识别特定类型的合约 例如 我有一个合同 Contract