Home | 簡體中文 | 繁體中文 | 雜文 | 知乎專欄 | Github | OSChina 博客 | 雲社區 | 雲棲社區 | Facebook | Linkedin | 視頻教程 | 打賞(Donations) | About
知乎專欄多維度架構 | 微信號 netkiller-ebook | QQ群:128659835 請註明“讀者”

17.18. Subscription

在區塊鏈上發生的事件時,能不通知到訂閲事件者。

[提示]提示
主意 https://docs.web3j.io/filters.html 有一段話:

Note: filters are not supported on Infura.

目前 Infura 不支持。

17.18.1. 接收所有添加到區塊鏈的新區塊

			
Subscription subscription = web3j.blockObservable(false).subscribe(block -> {
    ...
});
			
			

17.18.2. 接收所有添加到區塊鏈的新交易

			
Subscription subscription = web3j.transactionObservable().subscribe(tx -> {
    ...
});
			
			

17.18.3. 接收所有待處理的事務

			
Subscription subscription = web3j.pendingTransactionObservable().subscribe(tx -> {
    ...
});
			
			

測試環境 Mac, 首先啟動 Ethereum Wallet,然後啟動下面程序,回到 Ethereum Wallet 中做一筆轉賬。

			
package cn.netkiller.example.ethereum.subscription;

import org.web3j.protocol.Web3j;
import org.web3j.protocol.ipc.UnixIpcService;

import rx.Subscription;

public class PendingTest {

	public PendingTest() {
		// TODO Auto-generated constructor stub
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		System.out.println("Subscription Starting...");
		Web3j web3 = Web3j.build(new UnixIpcService("/Users/neo/Library/Ethereum/geth.ipc"));
		Subscription subscription = web3.pendingTransactionObservable().subscribe(block -> {
			// System.out.println(block.toString());
			System.out.println("block number: " + block.getBlockHash());
		});
		// subscription.unsubscribe();
	}

}
			
			
			

輸出

			
block number: 0x74f7dd053dadcf01599dc85d4abf60662695e78ce7531335f44dc03f49dee326
			
			

17.18.4. 將區塊塊重放到當前的當前位置

			
Subscription subscription = catchUpToLatestAndSubscribeToNewBlocksObservable(
        <startBlockNumber>, <fullTxObjects>)
        .subscribe(block -> {
            ...
});

作者:ChainBoard鏈博科技
連結:https://www.jianshu.com/p/c7c5556a436b
來源:簡書
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。			
			
			

17.18.5. 過濾主題

			
EthFilter filter = new EthFilter(DefaultBlockParameterName.EARLIEST, DefaultBlockParameterName.LATEST, <contract-address>).addSingleTopic(...)|.addOptionalTopics(..., ...)|...;

web3j.ethLogObservable(filter).subscribe(log -> {
    ...
});		
			
			

17.18.6. 停止訂閲 Subscriptions

			
subscription.unsubscribe();
			
			

17.18.7. 

			
Web3j web3 = Web3j.build(new HttpService("http://127.0.0.1:8080"));
        System.out.println("Connected to Ethereum client version: "
                + web3.toString());
        subscription = web3.blockObservable(false)
                .subscribe(tx -> {
                    System.out.println("observation tx:" + tx.getRawResponse());
                });
        txSubscription = web3.transactionObservable().subscribe((tx) -> {
            System.out.println("txSubscription hash:" + tx.getHash() + ":::::address:" + tx.getTo());
            if (!ValidationUtil.isEmpty(tx.getTo())) {
                System.out.println("getBlockNumber:" + tx.getBlockNumber().longValue());
                System.out.println("getValue:" + tx.getValue());
                System.out.println("getTo:" + tx.getTo());
                System.out.println("getFrom:" + tx.getFrom());
                System.out.println("getHash:" + tx.getHash());
            }
        });
        pendingSubscription = web3.pendingTransactionObservable().subscribe(tx -> {
            System.out.println("pending hash:" + tx.getHash() + ":::::address:" + tx.getTo());
        });
        latestSubscription = web3.catchUpToLatestTransactionObservable(new DefaultBlockParameterNumber(2576860)).subscribe(block ->
                System.out.println("*+observer+getblock" + block.getBlockNumber())
        );