如何订阅任意ERC721或ERC1155合约的所有以太坊日志事件
ERC721/ERC1155日志定向筛选方案
核心逻辑是利用两类NFT标准强制实现的固定事件签名哈希,在RPC日志请求阶段就完成过滤,无需拉取全量日志后再解码筛选:
- 先确认目标事件的固定签名哈希(所有合规ERC721/1155合约的标准事件哈希完全一致)
- ERC721核心转移事件
Transfer(address,address,uint256)的Keccak256哈希为:0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef - ERC1155单币转移事件
TransferSingle(address,address,address,uint256,uint256)的哈希为:0xc3d58168c5ae7397731d3482ef5d6d435d92901a7f6260f6ca17d32c1d31d34a - ERC1155批量转移事件
TransferBatch(address,address,address,uint256[],uint256[])的哈希为:0x4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb
- ERC721核心转移事件
- 调整
eth_getLogs请求参数,除了你原本配置的address字段过滤合约地址外,新增topics参数指定要匹配的事件哈希即可,RPC会直接返回topic0符合任意一个目标哈希的日志:{ "jsonrpc": "2.0", "method": "eth_getLogs", "params": [ { "fromBlock": "latest", "address": ["你的目标合约地址列表"], "topics": [ [ "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", "0xc3d58168c5ae7397731d3482ef5d6d435d92901a7f6260f6ca17d32c1d31d34a", "0x4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb" ] ] } ], "id": 1 } - 补充说明:该方案仅对符合官方ERC标准的合规合约生效,自定义修改了事件结构的非标准合约无法匹配;如果需要筛选授权等其他标准事件,按相同规则计算对应事件的哈希加入topics数组即可。
内容的提问来源于stack exchange,提问作者pguardiario
相关产品推荐
相关产品推荐

