node.js - 使用 web3.js 获取钱包地址拥有的所有 NFT
问题描述
我是区块链新手。
我做了一些研究,这是我使用 web3.js 获取某个钱包拥有的 NFT 列表的步骤
balance = ERC721.methods.balanceOf(walletAddress).call();
objects = [];
for (i = 0; i < balance; i++) {
tokens.push(await ERC721.methods.tokenOfOwnerByIndex(walletAddress, i).call());
}
for(i = 0; i < tokens.length; i++){
objects.push(await ERC721.methods.tokenURI(tokenIdList[i]).call());
}
我可以使用上述方法获取 ERC721 令牌 URI 列表,但性能确实很差。我想知道 OpenSeas 如何在相同功能上以光速性能实现这一目标。
解决方案
在大多数情况下,存储或缓存数据会降低加载时间。
您可以将objects
值存储在数据库(例如 MongoDB)中并定期更新它——如果您有可管理数量的walletAddress
项目,或者只是一些高优先级项目。
您甚至可以订阅Transfer
令牌合约上的事件日志(在您的情况下是事件),而不必轮询更改。(如果您的订阅失败,也许轮询只是作为后备。)
对于其余的walletAddress
项目(优先级较低的),您可以将它们缓存在临时存储中(例如 Redis)。所以第一次加载会很慢(因为它将从外部资源加载 - 正如您当前的代码片段所做的那样),而其他加载(直到 TTL 到期)只会从缓存中加载,而不是命中外部资源。
推荐阅读
- go - 为 sns 传输添加服务名称
- c++ - `std::list::splice(std::const_iterator pos, std::list&& other)` 是否保证将 `other` 留空?
- java - mkdirs() 不会在 android 中创建新目录
- javascript - 如何通过鼠标滚轮和滚动条支持重用固定数量的行来创建虚拟表?
- mysql - MYSQL 从不同服务器上的数据库连接表
- python - 尝试通过交替值组合列表时卡在扩展切片上
- android - android BaseFragment 与它自己的 xml 和继承片段的视图在父的 frameLayout
- javascript - 在 sequelize 中序列化 ARRAY 字段的更新
- aws-lambda - 如何在 Netlify lambda 函数之间共享代码
- python - 使用 python manage.py 创建超级用户在 Django 中自定义消息