【问题标题】:Web3j: Getting last events from a smart contractWeb3j:从智能合约中获取最新事件
【发布时间】:2021-05-21 17:39:23
【问题描述】:

我正在使用org.web3j (4.8.4)Java 11。我在 Kovan 网络上部署了一个智能合约。我想订阅调用subscribe(...) 后发出的所有新事件。我对之前发出的事件不感兴趣。这是我当前的代码:

public void subscribeToEvents() throws Exception {
    String wssUrl = "wss://kovan.infura.io/ws/v3/TOKEN";
    String contractAddress = "0x123...";
    
    // initialize web socket service
    WebSocketService wss = new WebSocketService(wssUrl, false);
    try {
        wss.connect();
    } catch (Exception e) {
        System.out.println("Error while connecting to WSS service: " + e);
        throw e;
    }

    // build web3j client
    Web3j web3j = Web3j.build(wss);

    // create filter for contract events
    EthFilter filter = new EthFilter(DefaultBlockParameterName.EARLIEST, DefaultBlockParameterName.LATEST, contractAddress);

    // subscribe to events
    web3j.ethLogFlowable(filter).subscribe(event -> {
        System.out.println("Event received");
        System.out.println(event);
    }, error -> {
        System.out.println("Error: " + error);
    });
}

但是,当我运行此代码时,它还会打印几天前发生的旧事件。如何更改代码,使其仅打印在我调用 subscribe(...) 后由智能合约发出的 new 事件?。

【问题讨论】:

  • 有一个 JSON-RPC 调用来获取过去的事件,但我不知道它在 Web3j 上映射的 API 调用什么。
  • 我对过去的活动不感兴趣,我只想订阅新的活动。

标签: java ethereum smartcontracts web3-java


【解决方案1】:

更换

EthFilter filter = new EthFilter(DefaultBlockParameterName.EARLIEST, DefaultBlockParameterName.LATEST, contractAddress);

EthFilter filter = new EthFilter(DefaultBlockParameterName.LATEST, DefaultBlockParameterName.LATEST, contractAddress);

为我完成了这项工作。

【讨论】:

    猜你喜欢
    • 2021-10-31
    • 1970-01-01
    • 1970-01-01
    • 2021-11-15
    • 2022-11-04
    • 2022-11-13
    • 2021-12-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多