看标准源码没有什么好方案,opensea是如何做到扫描一个地址下面全部的NFT?
估计是通过 eth_getLogs 接口扫描合约 Transfer 事件实现的,事件里面有地址和tokenId信息,然后保存到自己的数据库里面。
Transfer
event Transfer(address indexed _from, address indexed _to, uint256 indexed _tokenId);
一种就是先调的 totalsupply,然后根据总量遍历 tokenByIndex查出每个tokenId,接着遍历tokenOfOwnerByIndex,查出用户拥有的tokenid,最后遍历tokenURI查出每个tokenId的元数据,这几个都是标准的ERC721接口
totalsupply
tokenByIndex
tokenOfOwnerByIndex
tokenURI
另一种就是监听合约事件,需提前把交易数据存储到数据库
ERC721扩展方法里面的tokenOfOwnerByIndex函数 通过地址和索引值查询具体的tokenId, 所以会有一个mapping作用是 地址映射到当前地址所拥有的所有tokenID的数组。
ERC721扩展方法里面的tokenOfOwnerByIndex函数 通过地址和索引值查询具体的tokenId, 所以会有一个mapping作用是 地址映射到当前地址所拥有的所有tokenID,