Der Web3j-Client erkennt keine Transaktion oder Blockchain von Geth

Ich web3jhöre Transaktionen und Blockchains über geth. Es scheint, dass keines der Abonnements, die ich für die Blockchain oder Transaktion erstellt habe, Änderungen erkennt.

Ich fange gethwie folgt an.

./geth \
 --fast --cache=512 \
 --rpc --rcappi personal,db,eth,net,web3 \
 --ws --wsapi personal,db,eth,net,web3 \
 --metrics --verbosity 5 --fakepow

Mein Java-Code sieht wie folgt aus.

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");
  }
}

Alles, was ich auf der Konsole meiner Java-App sehe, ist Folgendes.

Geth/v1.6.1-stable-021c3c28/linux-amd64/go1.8.1
2.0
ähm am ende angekommen

Irgendwelche Ideen, was ich falsch mache?

Antworten (2)

Es scheint, dass Sie vergessen haben, eine Schlafanweisung hinzuzufügen. Denken Sie daran, dass das Abonnement asynchron in einem anderen Ausführungs-Thread als der Rest unseres Programms stattfindet. Vergessen Sie auch nicht, einen Unsubscribe-Methodenaufruf durchzuführen. Ich hoffe es hilft!

Sie müssen sich mit dem Geth-Socket und nicht mit HTTP verbinden. Da Sie die Socket-URL während Web3J.Build nicht angegeben haben, wird sie gemäß Ihrem Kommentar im Code den Standardwerten zugeordnet.

Hier ist das Beispiel:

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

8546 ist der Standard-Socket-Port für Geth. Wenn Sie das beim Starten von Geth geändert haben, stellen Sie sicher, dass Sie das verwenden.