El cliente Web3j no detecta ninguna transacción o blockchain de geth

Estoy usando web3jpara escuchar transacciones y cadenas de bloques a través de geth. Parece que ninguna de las suscripciones que he creado al blockchain o transacción están detectando cambios.

Comienzo gethcomo el siguiente.

./get \
 --rápido --caché=512 \
 --rpc --rpcapi personal,db,eth,net,web3 \
 --ws --wsapi personal,db,eth,net,web3 \
 --métricas --verbosidad 5 --fakepow

Mi código Java se parece a lo siguiente.

public class App {
  public static void main(String[] args) throws ExecutionException, InterruptedException {
    Web3j web3 = Web3j.build(new HttpService(), 100, Async.defaultExecutorService());  // defaults to http://localhost:8545/
    Web3ClientVersion web3ClientVersion = web3.web3ClientVersion().sendAsync().get();
    String clientVersion = web3ClientVersion.getWeb3ClientVersion();
    System.out.println(clientVersion);
    System.out.println(web3ClientVersion.getJsonrpc());

    web3.blockObservable(false).subscribe(block -> {
      System.out.println(block.getBlock().getNumber());
    }, Throwable::printStackTrace, () -> System.out.println("block done"));

    web3.transactionObservable().subscribe(tx -> {
      System.out.println(tx.getHash() + ", " + tx.getGasPriceRaw());
    }, Throwable::printStackTrace, () -> System.out.println("tx done"));

    web3.pendingTransactionObservable().subscribe(tx -> {
      System.out.println(tx.getHash() + ", " + tx.getGasPriceRaw());
    }, Throwable::printStackTrace, () -> System.out.println("ptx done"));

    System.out.println("umm reached the end");
  }
}

Todo lo que veo en la consola de mi aplicación Java es lo siguiente.

Geth/v1.6.1-estable-021c3c28/linux-amd64/go1.8.1
2.0
mmm llego al final

¿Alguna idea de lo que estoy haciendo mal?

Respuestas (2)

Parece que se olvidó de agregar la declaración de suspensión. Recuerde, esa suscripción se realiza de forma asíncrona en un hilo de ejecución diferente al resto de nuestro programa. Además, no olvide realizar una llamada al método de cancelación de suscripción. ¡Espero eso ayude!

Debe conectarse al socket Geth y no a HTTP. Como no proporcionó la URL del socket mientras Web3J.Build, se asignará a los valores predeterminados, según su comentario en el código.

Aquí está el ejemplo:

WebSocketService socketService=new WebSocketService("ws://127.0.0.1:8546", true);
Web3J web3Socket=Web3J.build(socketService);

8546 es el puerto de socket predeterminado para Geth. Si ha cambiado eso al iniciar Geth, asegúrese de usarlo.