如何使用Python订阅监听Polygon区块链的智能合约事件
Polygon链智能合约事件监听问题解决方案
报错根因
你遇到的两类报错均由Polygon RPC节点的服务策略导致:
- 多数公共RPC为控制资源开销,直接禁用了
eth_newFilter系列接口,调用时会返回方法不存在错误 - 少数支持该接口的节点,过滤器有效存活时间通常仅为几分钟,远低于以太坊、BSC节点的默认有效期,长时间不轮询就会触发
filter not found错误
无需遍历全量日志的事件查询方案
不需要遍历全链日志的可行方案有两类:
- 增量区块范围拉取:每次调用
eth_getLogs接口时指定fromBlock为上次同步完成的区块高度、toBlock为当前链上最新高度,同时传入要监听的合约地址、事件topic参数。只要单次拉取的区块范围控制在节点允许的上限内(Polygon公共RPC通常支持单次拉取1000-5000个区块的日志),同步效率和过滤器方案几乎一致,不需要处理全链历史日志 - 事件订阅:支持WebSocket的RPC节点普遍支持
eth_subscribe接口,直接订阅指定合约的logs事件,节点会在新区块生成后主动推送符合条件的事件到客户端,无需客户端主动轮询
WebSocket方案可行性说明
WebSocket完全可以实现需求,也是目前Polygon链事件监听的首选方案:
- 调用
eth_subscribe方法,参数指定订阅类型为logs,同时传入合约地址、要监听的事件topic列表即可完成订阅 - 节点会在符合条件的交易上链后主动推送事件数据,不需要客户端维护过滤器状态,不会出现
filter not found类错误 - 注意WebSocket连接断开后,需要自行记录断开前最后处理的区块高度,重连后用
eth_getLogs补拉断开期间的事件数据,避免数据丢失
内容的提问来源于stack exchange,提问作者elad alkabets
相关产品推荐
相关产品推荐

