如何使用Web3j判断一笔交易是否属于NFT相关交易
Web3j识别交易代币类型可行方案
修正EIP-165接口调用逻辑
supportsInterface是校验代币标准的首选方案,调用失败大多是参数或调用方式错误导致,注意以下规则:
各标准固定interfaceId为:- ERC20:
0x36372b07 - ERC721:
0x80ac58cd - ERC1155:
0xd9b67a26
Web3j调用时优先用官方封装的标准合约接口类发起eth_call请求,不要手动拼Function参数,避免参数编码错误导致返回异常。例如直接导入Web3j生成的ERC721接口类,调用erc721.supportsInterface(INTERFACE_ID_ERC721).send()即可拿到正确结果,该方案可覆盖95%以上遵循EIP标准的合约。
- ERC20:
基于交易日志特征匹配判断
针对不支持EIP-165的非标合约,可通过匹配日志的事件签名完成判断,你已经拿到TokenID,只要匹配topic0的事件签名即可:- ERC20 Transfer事件签名:
0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef,对应日志共3个topic,data字段存储转账金额,无单独TokenID字段。 - ERC721 Transfer事件签名和ERC20完全一致,但对应日志共4个topic,第4个topic为你获取的TokenID,data字段为空,符合该特征即可判定为ERC721代币。
- ERC1155 单币转账(TransferSingle)签名:
0xc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62,多币转账(TransferBatch)签名:0x4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb,匹配到两个签名任意一个即可判定为ERC1155代币。
Web3j中直接遍历TransactionReceipt.getLogs(),取每个日志的首个topic和上述签名对比即可,无需全量解码日志字段。
- ERC20 Transfer事件签名:
异常场景兼容校验
遇到篡改事件参数的极端非标合约时,可补充调用合约标准方法二次校验:判定为ERC721的可调用ownerOf(tokenId),能正常返回地址即为有效;判定为ERC1155的可调用balanceOf(userAddress, tokenId)做校验,避免错判。
内容的提问来源于stack exchange,提问作者wollenS
相关产品推荐
相关产品推荐

