Работающий пример web3j.replayTransactionsObservable

Я хочу получить историю транзакций между двумя блоками, и я наткнулся на этот фильтр воспроизведения. Чтобы воспроизвести отдельные транзакции, содержащиеся в диапазоне блоков:

Subscription subscription = web3j.replayTransactionsObservable( <startBlockNumber>, <endBlockNumber>) .subscribe(tx -> { ... });

Однако я не могу найти ни одного рабочего примера, связанного с этим фильтром. Может кто-нибудь просто помочь в предоставлении рабочего примера?

1 ответ

Решение

Просто получить доступ к объектам транзакции довольно просто:

Web3j web3j = Web3j.build(new HttpService());

web3j.replayTransactionsObservable(DefaultBlockParameterName.EARLIEST, DefaultBlockParameterName.LATEST).subscribe(System.out::println));

распечатает все транзакции, которые произошли на одноранговом узле, работающем на вашем локальном хосте. Просто поменяй System.out::println в tx -> //do something with tx (tx это org.web3j.protocol.core.methods.response.EthBlock$TransactionObject).

Обратите внимание, что это будет только воспроизвести историю. Вы не увидите никаких новых объектов транзакции, так как блоки добавляются в цепочку.

Более сложный пример использования подписок возникает, если вы хотите сделать что-то вроде прослушивания определенных событий. Я включил пример этого ниже на случай, если это поможет. Если вам нужна помощь в решении конкретной проблемы, пожалуйста, оставьте вопросы с более подробной информацией и примером кода.

// Prints event emitted from a deployed contract
// Event definition:
// event MyEvent(address indexed _address, uint256 _oldValue, uint256 _newValue);
public static void eventTest() {
  try {
    Web3j web3j = Web3j.build(new HttpService());

    Event event = new Event("MyEvent",
                            Arrays.asList(new TypeReference<Address>() {}),
                            Arrays.asList(new TypeReference<Uint256>() {}, new TypeReference<Uint256>() {}));

    // Note contract address here. See https://github.com/web3j/web3j/issues/405
    EthFilter filter = new EthFilter(DefaultBlockParameterName.EARLIEST, DefaultBlockParameterName.LATEST, "6dd7c1c13df7594c27e0d191fd8cc21efbfc98b4");

    filter.addSingleTopic(EventEncoder.encode(event));

    web3j.ethLogObservable(filter).subscribe(log -> System.out.println(log.toString()));
  }
  catch (Throwable t) {
    t.printStackTrace();
  }
}
Другие вопросы по тегам