【问题标题】:Listening to events emmited from smart contracts using web3j library使用 web3j 库监听智能合约发出的事件
【发布时间】:2021-10-31 15:26:29
【问题描述】:

如何使用基于 java 的 web3j 库监听智能合约发出的事件?

【问题讨论】:

  • 请提供足够的代码,以便其他人更好地理解或重现问题。

标签: java events solidity smartcontracts web3-java


【解决方案1】:

让我们将合同名称视为“SampleContract”。它包括一个方法“getSellerAddress()”,在该方法的最后会发出一个事件,命名为“emitSellerAddress”。

调用 getSellerAddress 方法后,创建一个提供最新区块详细信息的过滤器,并添加一个带有事件名称的主题。此事件将在过滤器中注册,并传递给 logFlowable。订阅此方法将提供事件信息,下面代码中的 eventString 将提供完整的日志信息。根据发出的事件,它将在主题或数据部分中。

TransactionReceipt transactionReceiptData = sampleContract.getSellerAddress().send();

EthFilter filter = new EthFilter(DefaultBlockParameterName.LATEST, DefaultBlockParameterName.LATEST, sampleContract.getContractAddress());

String encodedEventSignature = EventEncoder.encode(sampleContract.EVENT_NAME);

filter.addSingleTopic(encodedEventSignature);
                
System.out.println("subscribing to event with filter");
                
Web3j.ethLogFlowable(filter).subscribe(eventString -> eventString.toString());
                

【讨论】:

    【解决方案2】:
    // Our local test network.
    var service = new BeaconNodeService("http://localhost:19601/");
    var client = BeaconNodeClientFactory.build(service);
    
    // We want to receive at least one event
    var latch = new CountDownLatch(1);
    
    // At the moment we are interested in any topic
    var topics = EnumSet.allOf(BeaconEventType.class);
    
    // Then subscribe to each event
    client.getEvents().onEvent(topics, event -> {
        System.out.println("Received event: " + event);
        latch.countDown();
    });
    
    // Wait for the event
    latch.await();
    

    更多信息here

    【讨论】:

      猜你喜欢
      • 2021-12-01
      • 2021-08-31
      • 1970-01-01
      • 2017-10-28
      • 1970-01-01
      • 2020-10-02
      • 2018-08-01
      • 2022-12-17
      • 1970-01-01
      相关资源
      最近更新 更多