web3j過濾器提供以太坊網絡發生的某些事件的通知,對java和安卓程序員來講頗有用。在Ethereum以太坊中支持三類過濾器:php
塊過濾器和未決交易過濾器提供了在網絡上建立新交易或塊的通知。html
主題過濾器更靈活。容許根據提供的特定標準建立過濾器。java
不幸的是,除非你使用WebSocket
鏈接到Geth,不然經過JSON-RPC API來處理過濾器是一個繁瑣的過程,這裏須要輪詢以太坊客戶端,以便了解HTTP和IPC所請求的實時同步特徵,是否有任何新的更新到你的過濾器。此外,塊和交易過濾器只提供交易或區塊鏈hash值,所以須要進一步的請求來得到hash對應的實際交易或塊。node
web3j的過濾器解決了這些問題,所以你有一個徹底異步的基於事件的API來處理過濾器。它使用RXJava的可觀測性Observables,它提供了與事件協同工做的一致API,這有助於經過功能組合將JSON-RPC調用連接在一塊兒。react
注:Infura
不支持過濾器。android
接收全部新塊把它們添加到區塊鏈(false參數指定咱們只須要塊就ok,而不須要嵌入交易):ios
Subscription subscription = web3j.blockObservable(false).subscribe(block -> { ... });
接收全部新交易,把它們添加到塊鏈:git
Subscription subscription = web3j.transactionObservable().subscribe(tx -> { ... });
接收全部待提交交易並提交到網絡(即在它們被分組在一塊兒以前):程序員
Subscription subscription = web3j.pendingTransactionObservable().subscribe(tx -> { ... });
再也不須要的時候取消訂閱unsubscribe
:github
subscription.unsubscribe();
另外還提供了其餘回調,它們簡單地提供了塊或交易hash,這些細節涉及Web3JRX接口。
webjs還提供用於再現塊和交易歷史的過濾器。
從區塊鏈再現一系列塊:
Subscription subscription = web3j.replayBlocksObservable( <startBlockNumber>, <endBlockNumber>, <fullTxObjects>) .subscribe(block -> { ... });
再現包含在一個塊範圍內的單個交易:
Subscription subscription = web3j.replayTransactionsObservable( <startBlockNumber>, <endBlockNumber>) .subscribe(tx -> { ... });
也能夠得到Web3J再現最新的塊,並在你看事後提供通知(經過提交Observable
):
Subscription subscription = web3j.catchUpToLatestBlockObservable( <startBlockNumber>, <fullTxObjects>, <onCompleteObservable>) .subscribe(block -> { ... });
或者,也能夠在你再現最新的塊後,通知新建立的後續塊:
Subscription subscription = web3j.catchUpToLatestAndSubscribeToNewBlocksObservable( <startBlockNumber>, <fullTxObjects>) .subscribe(block -> { ... });
如上所述,幷包含在塊內的交易:
Subscription subscription = web3j.catchUpToLatestAndSubscribeToNewTransactionsObservable( <startBlockNumber>) .subscribe(tx -> { ... });
全部上述過濾器都是經過Web3JRX接口導出的。
主題過濾器捕獲在網絡中發生的以太坊虛擬機(EVM)事件的細節。這些事件是由智能合約建立的,並存儲在與智能合約相關聯的交易日誌中。
solidity文檔提供了EVM事件的良好概述。
使用EthFilter類型指定但願應用於過濾器的主題。這能夠包括但願應用過濾器的智能合約的地址。你還能夠提供特定的主題進行篩選。其中單個主題表示智能合約上的索引參數:
EthFilter filter = new EthFilter(DefaultBlockParameterName.EARLIEST, DefaultBlockParameterName.LATEST, <contract-address>) [.addSingleTopic(...) | .addOptionalTopics(..., ...) | ...];
而後能夠使用相似於上面的塊和交易過濾器的語法建立該過濾器:
web3j.ethLogObservable(filter).subscribe(log -> { ... });
過濾器主題只能引用索引的Solidity事件參數。不可能對非索引事件參數進行篩選。此外,對於可變長度數組類型(如字符串和字節)的任何索引事件參數,它們的值的Keccak-256
hash 存儲在EVM日誌上。不可能使用它們的所有值來存儲或篩選。
若是建立一個沒有與之相關聯的主題的過濾器實例,則在網絡中發生的全部EVM事件都將由過濾器捕獲。
除了send()
和sendAsync
以外,全部JSON-RPC方法在web3j中都實現了支持observable()方法來建立可觀察的異步執行請求。這使得將JSON-RPC調用組合成新的函數是很是容易和直接的。
例如, blockObservable自己由許多單獨的JSON-RPC調用組成:
public Observable<EthBlock> blockObservable( boolean fullTransactionObjects, long pollingInterval) { return this.ethBlockHashObservable(pollingInterval) .flatMap(blockHash -> web3j.ethGetBlockByHash(blockHash, fullTransactionObjects).observable()); }
在這裏,咱們首先建立一個可觀察的,它提供每一個新建立的塊的塊哈希的通知。而後,咱們使用flatMap
調用ethGetBlockByHash
,以得到完整的塊細節,這是傳遞給可觀察者的訂閱服務器的細節。
請參閱ObservableIT,進一步舉例說明。
對於使用手動篩選器API的演示,能夠查看EventFilterIT。