java开源库web3j的以太坊过滤器(filter)和智能合约事件(event)教程
2019獨角獸企業重金招聘Python工程師標準>>>
web3j過濾器提供以太坊網絡發生的某些事件的通知,對java和安卓程序員來說很有用。在Ethereum以太坊中支持三類過濾器:
- 塊濾波器(Block filters)
- 未決交易過濾器(Pending transaction filters)
- 主題過濾器(Topic filters)
塊過濾器和未決交易過濾器提供了在網絡上創建新交易或塊的通知。
主題過濾器更靈活。允許根據提供的特定標準創建過濾器。
不幸的是,除非你使用WebSocket連接到Geth,否則通過JSON-RPC API來處理過濾器是一個繁瑣的過程,這里需要輪詢以太坊客戶端,以便了解HTTP和IPC所請求的實時同步特征,是否有任何新的更新到你的過濾器。此外,塊和交易過濾器只提供交易或區塊鏈hash值,因此需要進一步的請求來獲得hash對應的實際交易或塊。
web3j的過濾器解決了這些問題,因此你有一個完全異步的基于事件的API來處理過濾器。它使用RXJava的可觀測性Observables,它提供了與事件協同工作的一致API,這有助于通過功能組合將JSON-RPC調用鏈接在一起。
注:Infura不支持過濾器。
塊和交易過濾器
接收所有新塊把它們添加到區塊鏈(false參數指定我們只需要塊就ok,而不需要嵌入交易):
Subscription subscription = web3j.blockObservable(false).subscribe(block -> {... });接收所有新交易,把它們添加到塊鏈:
Subscription subscription = web3j.transactionObservable().subscribe(tx -> {... });接收所有待提交交易并提交到網絡(即在它們被分組在一起之前):
Subscription subscription = web3j.pendingTransactionObservable().subscribe(tx -> {... });不再需要的時候取消訂閱unsubscribe:
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事件
主題過濾器捕獲在網絡中發生的以太坊虛擬機(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。
- web3j教程,主要是針對java和android程序員進行區塊鏈以太坊開發的web3j開發詳解。
- 以太坊教程,主要介紹智能合約與dapp應用開發,適合入門。
- 以太坊開發,主要是介紹使用node.js、mongodb、區塊鏈、ipfs實現去中心化電商DApp實戰,適合進階。
- php以太坊,,主要是介紹使用php進行智能合約開發交互,進行賬號創建、交易、轉賬、代幣開發以及過濾器和事件等內容。
原文出處:web3j教程:過濾器(Filters)和事件(Events)
轉載于:https://my.oschina.net/u/2275217/blog/1839294
總結
以上是生活随笔為你收集整理的java开源库web3j的以太坊过滤器(filter)和智能合约事件(event)教程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 专访王兴军:3年攻克光子芯片“大脑” 打
- 下一篇: 理解矩阵,矩阵背后的现实意义