使用 web3.js 获取钱包地址拥有的所有 NFT

Posted

技术标签:

【中文标题】使用 web3.js 获取钱包地址拥有的所有 NFT【英文标题】:Fetch all NFTs owned by wallet address with web3.js 【发布时间】:2021-07-31 06:37:33 【问题描述】:

我是区块链新手。

我做了一些研究,这是我使用 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 如何在同一功能上以光速性能实现这一目标。

【问题讨论】:

【参考方案1】:

在大多数情况下,存储或缓存数据会降低加载时​​间。

您可以将 objects 值存储在 DB(例如 MongoDB)中并定期更新 - 如果您有可管理数量的 walletAddress 项目,或者只是一些高优先级项目。

您甚至可以订阅令牌合约上的事件日志(在您的情况下为 Transfer 事件),而不必轮询更改。 (如果您的订阅失败,也许轮询只是作为后备。)

对于其余的walletAddress 项(优先级较低的),您可以将它们缓存在临时存储中(例如 Redis)。所以第一次加载会很慢(因为它将从外部资源加载 - 正如你当前的 sn-p 所做的那样),而其他加载(直到 TTL 到期)只会从缓存中加载,没有触及外部资源。

【讨论】:

【参考方案2】:

这将在一个数组中返回此钱包拥有的所有代币,而无需循环:

await ERC721.methods.userOwnedTokens.call(walletAddress)

祝你好运!希望这会有所帮助

【讨论】:

我不认为这是令牌标准的一部分 erc-721 的任何地方都不存在这种方法..

以上是关于使用 web3.js 获取钱包地址拥有的所有 NFT的主要内容,如果未能解决你的问题,请参考以下文章

web3.js链接以太坊并查询钱包u余额

获取 ERC20 的所有权数组

尝试发送 USDC 时无法获取钱包签名者 @solana-labs/web3.js

如何使用现有钱包签署使用节点 JS 脚本运行的 solana 交易?

如何获取我拥有的代币列表?

Web3 通过钱包地址获取所有代币