【发布时间】:2021-10-31 15:26:29
【问题描述】:
如何使用基于 java 的 web3j 库监听智能合约发出的事件?
【问题讨论】:
-
请提供足够的代码,以便其他人更好地理解或重现问题。
标签: java events solidity smartcontracts web3-java
如何使用基于 java 的 web3j 库监听智能合约发出的事件?
【问题讨论】:
标签: java events solidity smartcontracts web3-java
让我们将合同名称视为“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());
【讨论】:
// 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。
【讨论】: