Blockchain web3.js如何搜索由和地址创建的所有合同

Blockchain web3.js如何搜索由和地址创建的所有合同,blockchain,ethereum,solidity,web3js,Blockchain,Ethereum,Solidity,Web3js,我不熟悉web3.js和solidity。我的问题与我们在区块链上搜索的方式有关。如果我们知道合同地址,就很容易搜索特定的合同。但是,我们如何使用最初用于创建合同的发件人地址来查找和识别特定类型的合同 例如。 我有一份合同,由“发件人”地址a使用web3.js创建。现在我想找到AddressA创建的ContractA的所有实例 我尝试使用web3.eth.filter API进行搜索,但没有任何结果。请帮忙 我还阅读了关于使用注册表模式存储所有合同并询问注册表的内容,但没有找到任何有用的示例。不

我不熟悉web3.js和solidity。我的问题与我们在区块链上搜索的方式有关。如果我们知道合同地址,就很容易搜索特定的合同。但是,我们如何使用最初用于创建合同的发件人地址来查找和识别特定类型的合同

例如。 我有一份合同,由“发件人”地址a使用web3.js创建。现在我想找到AddressA创建的ContractA的所有实例

我尝试使用web3.eth.filter API进行搜索,但没有任何结果。请帮忙


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

不幸的是,没有简单的方法可以做到这一点
web3.eth.filter
可用于对合同地址应用筛选器,也可用于在发件人位于主题列表中的交易日志(合同发出的事件)中进行搜索

如果您希望所有事务都由特定地址提交,那么您几乎必须遍历链上的每个块,并检查每个块中的每个事务,以查看是否将
from
设置为您感兴趣的地址

// while looping through the block numbers you're interested in
web3.eth.getBlock(blockNum, (err, block) => {
  if (block != null) {
    block.transactions.forEach(tx => {
      if (tx.from === myAddress) {
        // Do something
      }
    }
  }
});

对于那些正在寻找方法的人来说,正如亚当在他的帖子中所说,没有直接的方法可以找到由钱包地址创建的合同。因此,我们必须实现如下所示的注册表模式来跟踪事情,只需在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)


希望这有帮助

感谢Adam,我继续创建了一个注册表模式来跟踪我的合同。
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));
    });
  }
}
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
  }
}