Events
使用 Web3.py 監聽 Polygon 網路中的事件
剛開始研究 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)