Web3.py
web3.eth.getFilterChanges(web3_filter.filter_id) 拋出“未找到過濾器”
我正在通過本地 geth 節點收聽乙太坊網路。我通過 web3.py 連接到 geth。我在 python 程式碼中開始了一項工作,該工作會定期從過濾器中獲取新塊。這是程式碼:
def main(): web3 = Web3(HTTPProvider(cfg.eth_node_url)) web3_confirmed_filter = web3.eth.filter('latest') scheduler = BlockingScheduler() scheduler.add_job( func=eth_listener_job.process_blocks(), args=[web3, web3_confirmed_filter], trigger=IntervalTrigger(seconds=cfg.pending_trx_scan_interval), id='block_processor', name='Load new blocks', replace_existing=True) scheduler.start()
這裡的工作方法看起來像
def process_blocks(web3, web3_filter): print('Scanning for new blocks...') .... trx_blocks = web3.eth.getFilterChanges(web3_filter.filter_id) ....
有時我在網上遇到錯誤
trx_blocks = web3.eth.getFilterChanges(web3_filter.filter_id)
ValueError: {'code': -32000, 'message': 'filter not found'}
這個錯誤的原因可能是什麼?
概括
節點 (geth) 正在刪除過濾器,可能是由於不活動,因此返回
filter not found
該 ID。為什麼?
非正式地,過濾器在 json-rpc 上工作,如下所示:
- 發送到節點:“創建帶有參數 X、Y、Z 的過濾器”
- 節點回复:“過濾器已安裝,ID 為 456”
- 發送到節點:“關於過濾器 ID 456 的任何新資訊?”
- 節點回复:“是的,這些變化:$$ … $$"
- 時間流逝…
- 節點決定解除安裝過濾器 456
- 發送到節點:“關於過濾器 ID 456 的任何新資訊?”
- 節點回复:“我沒有過濾器 456 的記錄”
不幸的是,規範沒有太多說明何時允許節點解除安裝過濾器。節點可以隨意進行,無需通知。所以最後,你唯一能做的就是檢查錯誤,如果它消失了,重新創建過濾器…… (呃,我知道)
Web3.py 計劃
完全停止使用該 json-rpc 過濾器機制並保留 web3.py 端的所有過濾器狀態是一個未解決的問題。它正是受到您提出的問題的啟發。