以太坊實戰(zhàn)-Filter

from:https://blog.csdn.net/wo541075754/article/details/79144377


eth_newFilter

eth_newFilter接口可以創(chuàng)建一個filter對象,用來監(jiān)聽區(qū)塊或交易發(fā)生的變化,也就所謂的日志(logs)。

主題(topic)是訂單依賴的,當(dāng)一條攜帶日志的交易在主題[A,B]之間,會被一下主題連接器所攔截:?

- [] 匹配任何交易;?

- [A] A之后的任何交易;?

- [null,B] B之前和之后的任何交易;?

- [A,B] A和B之間以及B之后的交易;?

- [[A,B],[A][B]] AB之間作為開始和AB之間作為結(jié)束,以及以后的交易;

參數(shù)說明:

fromBlock:開始區(qū)塊,可以是具體的區(qū)塊高度也可以是“l(fā)atest”,“pending”或“earliest”。

toBlock:使用同fromBlock。

address:合約地址或要監(jiān)聽的地址列表,也就是日志的起源。

topics:32字節(jié)的數(shù)組,訂單依賴的。

params: [{"fromBlock":"0x1","toBlock":"0x2","address":"0x8888f1f195afa192cfee860698584c030f4c9db1","topics": ["0x000000000000000000000000a94f5374fce5edbc8e2a8697c15331677e6ebf0b",null, ["0x000000000000000000000000a94f5374fce5edbc8e2a8697c15331677e6ebf0b","0x0000000000000000000000000aff3454fce5edbc8cca8697c15331677e6ebccc"]]}]

1

2

3

4

5

6

返回結(jié)果為filter的id。

// Requestcurl -X POST --data'{"jsonrpc":"2.0","method":"eth_newFilter","params":[{"topics":["0x12341234"]}],"id":73}'// Result{"id":1,"jsonrpc":"2.0","result":"0x1"http:// 1}

1

2

3

4

5

6

7

8

9

eth_getFilterChanges

上面創(chuàng)建了filter,如果需要獲取filter的變化信息還需要調(diào)用此接口進行查詢。

此接口的參數(shù)就是上面接口返回的id。

返回的結(jié)果根據(jù)名字我們大家基本上就能知道大概的意思,此處不做過多解釋,看一個具體的返回結(jié)果:

// Requestcurl -X POST --data '{"jsonrpc":"2.0","method":"eth_getFilterChanges","params":["0x16"],"id":73}'// Result{"id":1,"jsonrpc":"2.0","result": [{"logIndex":"0x1",// 1"blockNumber":"0x1b4"http:// 436"blockHash":"0x8216c5785ac562ff41e2dcfdf5785ac562ff41e2dcfdf829c5a142f1fccd7d","transactionHash":"0xdf829c5a142f1fccd7d8216c5785ac562ff41e2dcfdf5785ac562ff41e2dcf","transactionIndex":"0x0",// 0"address":"0x16c5785ac562ff41e2dcfdf829c5a142f1fccd7d","data":"0x0000000000000000000000000000000000000000000000000000000000000000","topics": ["0x59ebeb90bc63057b6515673c3ecf9438e5058bca0f92585014eced636878c9a5"]? ? },{? ? ? ...? ? }]}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

組合使用這兩個接口,就可以實現(xiàn)監(jiān)聽某個地址的交易變化或新生成區(qū)塊或交易。特別是對智能合約的執(zhí)行的監(jiān)聽有很好的用武之地。

使用陷阱

這也是本篇文章要引出的重點。如果說如何使用這兩個接口看一下官方文檔就可以輕易解決,但有些經(jīng)驗之談就需要實踐采坑之后才能獲得。這里給大家分享幾點實踐中的經(jīng)驗。

區(qū)塊間隔不易設(shè)置過程

在創(chuàng)建filter的時候,如果我們把fromBlock和toBlock設(shè)置的間隔特別長,比如從第一個塊到最新塊,那么啟動程序之后要么會等待很久很久,要么直接拋出超時異常。

針對超時異常在可容忍的區(qū)塊區(qū)間之中為了避免異常出現(xiàn),可將超時時間設(shè)長。

針對pending交易的監(jiān)聽需要慎重,引入pending交易可能因為無法查到交易出現(xiàn)異常。

慎重重啟節(jié)點

首先我們要明確一下,創(chuàng)建的filter其實是放在所鏈接的節(jié)點的內(nèi)存當(dāng)中,如果節(jié)點重啟,那么對應(yīng)的filter也就隨之失效,節(jié)點重啟之后需要重新創(chuàng)建filter,重新進行監(jiān)聽。

歷史交易無法追溯

在使用的時候我們要明確一點,filter雖然可以設(shè)置fromBlock但是已經(jīng)發(fā)生且不會變化的交易是無法通過eth_getFilterChanges獲取到的。顧名思義,只有changes的交易才能獲取到。比如監(jiān)聽在某個區(qū)塊區(qū)間,這個區(qū)塊區(qū)間的交易已經(jīng)被打包確認(rèn),此時再創(chuàng)建filter,eth_getFilterChanges是無法拿到被打包確認(rèn)的交易,只能獲取到創(chuàng)建filter之后發(fā)生變化的交易。

因此,在實際使用的過程中要時刻注意filter是否存活。

下篇預(yù)告

本篇文章就介紹到這里,下篇文章將給大家講解一下使用web3j的過程中遇到此問題的幾個異常場景。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容