Go-Ethereum

Web3j 客戶端未檢測到來自 geth 的任何交易或區塊鏈

  • June 5, 2020

web3j用來通過geth. 我為區塊鍊或交易創建的訂閱似乎都沒有檢測到更改。

我開始geth像下面這樣。

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

我的 Java 程式碼如下所示。

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

我在 Java 應用程序的控制台上看到的內容如下。

Geth/v1.6.1-stable-021c3c28/linux-amd64/go1.8.1
2.0
umm 到了盡頭

任何想法我做錯了什麼?

您似乎忘記添加 sleep 語句。請記住,訂閱是在與我們程序的其餘部分不同的執行執行緒中非同步進行的。也不要忘記進行取消訂閱方法呼叫。希望能幫助到你!

您需要連接到 Geth 套接字而不是 HTTP。由於您在 Web3J.Build 時沒有提供套接字 URL,因此它將根據您在程式碼中的註釋映射到預設值。

這是範例:

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

8546 是 Geth 的預設套接字埠。如果您在啟動 Geth 時更改了它,請確保使用它。

引用自:https://ethereum.stackexchange.com/questions/15859