Web3.py

web3.eth.getFilterChanges(web3_filter.filter_id) 拋出“未找到過濾器”

  • January 18, 2022

我正在通過本地 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 上工作,如下所示:

  1. 發送到節點:“創建帶有參數 X、Y、Z 的過濾器”
  2. 節點回复:“過濾器已安裝,ID 為 456”
  3. 發送到節點:“關於過濾器 ID 456 的任何新資訊?”
  4. 節點回复:“是的,這些變化:$$ … $$"
  5. 時間流逝…
  6. 節點決定解除安裝過濾器 456
  7. 發送到節點:“關於過濾器 ID 456 的任何新資訊?”
  8. 節點回复:“我沒有過濾器 456 的記錄”

不幸的是,規範沒有太多說明何時允許節點解除安裝過濾器。節點可以隨意進行,無需通知。所以最後,你唯一能做的就是檢查錯誤,如果它消失了,重新創建過濾器…… (呃,我知道)


Web3.py 計劃

完全停止使用該 json-rpc 過濾器機制並保留 web3.py 端的所有過濾器狀態是一個未解決的問題。它正是受到您提出的問題的啟發。

引用自:https://ethereum.stackexchange.com/questions/41129