Ich web3j
hö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 geth
wie 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?
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.