日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java开源库web3j的以太坊过滤器(filter)和智能合约事件(event)教程

發(fā)布時(shí)間:2023/12/31 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java开源库web3j的以太坊过滤器(filter)和智能合约事件(event)教程 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>

web3j過濾器提供以太坊網(wǎng)絡(luò)發(fā)生的某些事件的通知,對(duì)java和安卓程序員來說很有用。在Ethereum以太坊中支持三類過濾器:

  • 塊濾波器(Block filters)
  • 未決交易過濾器(Pending transaction filters)
  • 主題過濾器(Topic filters)

塊過濾器和未決交易過濾器提供了在網(wǎng)絡(luò)上創(chuàng)建新交易或塊的通知。

主題過濾器更靈活。允許根據(jù)提供的特定標(biāo)準(zhǔn)創(chuàng)建過濾器。

不幸的是,除非你使用WebSocket連接到Geth,否則通過JSON-RPC API來處理過濾器是一個(gè)繁瑣的過程,這里需要輪詢以太坊客戶端,以便了解HTTP和IPC所請(qǐng)求的實(shí)時(shí)同步特征,是否有任何新的更新到你的過濾器。此外,塊和交易過濾器只提供交易或區(qū)塊鏈hash值,因此需要進(jìn)一步的請(qǐng)求來獲得hash對(duì)應(yīng)的實(shí)際交易或塊。

web3j的過濾器解決了這些問題,因此你有一個(gè)完全異步的基于事件的API來處理過濾器。它使用RXJava的可觀測(cè)性O(shè)bservables,它提供了與事件協(xié)同工作的一致API,這有助于通過功能組合將JSON-RPC調(diào)用鏈接在一起。

注:Infura不支持過濾器。

塊和交易過濾器

接收所有新塊把它們添加到區(qū)塊鏈(false參數(shù)指定我們只需要塊就ok,而不需要嵌入交易):

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

接收所有新交易,把它們添加到塊鏈:

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

接收所有待提交交易并提交到網(wǎng)絡(luò)(即在它們被分組在一起之前):

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

不再需要的時(shí)候取消訂閱unsubscribe:

subscription.unsubscribe();

另外還提供了其他回調(diào),它們簡(jiǎn)單地提供了塊或交易hash,這些細(xì)節(jié)涉及Web3JRX接口。

再現(xiàn)過濾器

webjs還提供用于再現(xiàn)塊和交易歷史的過濾器。

從區(qū)塊鏈再現(xiàn)一系列塊:

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

再現(xiàn)包含在一個(gè)塊范圍內(nèi)的單個(gè)交易:

Subscription subscription = web3j.replayTransactionsObservable(<startBlockNumber>, <endBlockNumber>).subscribe(tx -> {... });

也可以獲得Web3J再現(xiàn)最新的塊,并在你看過后提供通知(通過提交Observable):

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

或者,也可以在你再現(xiàn)最新的塊后,通知新創(chuàng)建的后續(xù)塊:

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

如上所述,并包含在塊內(nèi)的交易:

Subscription subscription = web3j.catchUpToLatestAndSubscribeToNewTransactionsObservable(<startBlockNumber>).subscribe(tx -> {... });

所有上述過濾器都是通過Web3JRX接口導(dǎo)出的。

主題過濾器和EVM事件

主題過濾器捕獲在網(wǎng)絡(luò)中發(fā)生的以太坊虛擬機(jī)(EVM)事件的細(xì)節(jié)。這些事件是由智能合約創(chuàng)建的,并存儲(chǔ)在與智能合約相關(guān)聯(lián)的交易日志中。

solidity文檔提供了EVM事件的良好概述。

使用EthFilter類型指定希望應(yīng)用于過濾器的主題。這可以包括希望應(yīng)用過濾器的智能合約的地址。你還可以提供特定的主題進(jìn)行篩選。其中單個(gè)主題表示智能合約上的索引參數(shù):

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

然后可以使用類似于上面的塊和交易過濾器的語法創(chuàng)建該過濾器:

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

過濾器主題只能引用索引的Solidity事件參數(shù)。不可能對(duì)非索引事件參數(shù)進(jìn)行篩選。此外,對(duì)于可變長(zhǎng)度數(shù)組類型(如字符串和字節(jié))的任何索引事件參數(shù),它們的值的Keccak-256 hash 存儲(chǔ)在EVM日志上。不可能使用它們的全部值來存儲(chǔ)或篩選。

如果創(chuàng)建一個(gè)沒有與之相關(guān)聯(lián)的主題的過濾器實(shí)例,則在網(wǎng)絡(luò)中發(fā)生的所有EVM事件都將由過濾器捕獲。

操作組合標(biāo)注

除了send()和sendAsync之外,所有JSON-RPC方法在web3j中都實(shí)現(xiàn)了支持observable()方法來創(chuàng)建可觀察的異步執(zhí)行請(qǐng)求。這使得將JSON-RPC調(diào)用組合成新的函數(shù)是非常容易和直接的。

例如, blockObservable本身由許多單獨(dú)的JSON-RPC調(diào)用組成:

public Observable<EthBlock> blockObservable(boolean fullTransactionObjects, long pollingInterval) {return this.ethBlockHashObservable(pollingInterval).flatMap(blockHash ->web3j.ethGetBlockByHash(blockHash, fullTransactionObjects).observable()); }

在這里,我們首先創(chuàng)建一個(gè)可觀察的,它提供每個(gè)新創(chuàng)建的塊的塊哈希的通知。然后,我們使用flatMap調(diào)用ethGetBlockByHash,以獲得完整的塊細(xì)節(jié),這是傳遞給可觀察者的訂閱服務(wù)器的細(xì)節(jié)。

進(jìn)一步的例子

請(qǐng)參閱ObservableIT,進(jìn)一步舉例說明。

對(duì)于使用手動(dòng)篩選器API的演示,可以查看EventFilterIT。

  • web3j教程,主要是針對(duì)java和android程序員進(jìn)行區(qū)塊鏈以太坊開發(fā)的web3j開發(fā)詳解。
  • 以太坊教程,主要介紹智能合約與dapp應(yīng)用開發(fā),適合入門。
  • 以太坊開發(fā),主要是介紹使用node.js、mongodb、區(qū)塊鏈、ipfs實(shí)現(xiàn)去中心化電商DApp實(shí)戰(zhàn),適合進(jìn)階。
  • php以太坊,,主要是介紹使用php進(jìn)行智能合約開發(fā)交互,進(jìn)行賬號(hào)創(chuàng)建、交易、轉(zhuǎn)賬、代幣開發(fā)以及過濾器和事件等內(nèi)容。

原文出處:web3j教程:過濾器(Filters)和事件(Events)

轉(zhuǎn)載于:https://my.oschina.net/u/2275217/blog/1839294

總結(jié)

以上是生活随笔為你收集整理的java开源库web3j的以太坊过滤器(filter)和智能合约事件(event)教程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。