Events

使用 Web3.py 監聽 Polygon 網路中的事件

  • August 12, 2021

剛開始研究 Web3,我目前正在嘗試使用 Polygon 網路上的智能合約發出的事件

event_filter = contract.events.<MyEvent>.createFilter(fromBlock='latest')

我嘗試了三個不同的提供程序,Infura (https)、maticvigil 和 Alchemy(https 和 wss),但是當呼叫方法 createFilter 我得到響應

{'code': -32601, 'message': 'Unsupported method: eth_newFilter.'}

在乙太坊主網中使用該方法時,一切都很順利,但是一旦我更改為 Polygon 提供者,所有提供者都會遇到類似的錯誤。

如果我了解發生了什麼,這意味著為了讓我使用 Web3 方法監聽事件,提供者必須實現 eth_newFilter

所以我的問題是,有沒有人碰巧知道 Polygon 網路的提供商在他們的 API 上實現了 eth_newFilter 方法?

或者,我希望獲得一些指導/資源,以了解如何在 Polygon 網路上偵聽由智能合約觸發的特定事件,而無需依賴提供商,謝謝。

對於未來的讀者,顯然 Polygon 不支持 eth_newFilter 所以通過 Web3 獲取事件的一種方法是訂閱日誌(目前通過 Web3.js 可用)或使用 get_logs(如果你想在 python 中這樣做),我在 reddit 中找到了一個範例文章,是這樣的:

from web3 import Web3
from web3._utils.events import get_event_data

w3 = Web3(Web3.HTTPProvider("<Infura host>"))
contract = w3.eth.contract(address="0x33..", abi=abi['abi'])
event_template = contract.events.<EVENT_NAME>
events = w3.eth.get_logs({'fromBlock':from_block, 'toBlock': from_block+10000, 'address':"0x33.."})


def handle_event(event, event_template):
   try:
       result = get_event_data(event_template.web3.codec, event_template._get_event_abi(), event)
       return True, result
   except:
       return False, None

for event in events: 
   suc, res = self.handle_event(event=event, event_template=event_template)   
   if suc:
       print("Event found", res)

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