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

Node.js 使用web3.js获取钱包地址拥有的所有NFT,node.js,ethereum,web3js,Node.js,Ethereum,Web3js,我是区块链新手 我做了一些研究,下面是我使用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

我是区块链新手

我做了一些研究,下面是我使用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());
}
balance=ERC721.methods.balanceOf(walletAddress.call();
对象=[];
对于(i=0;i

我可以使用上述方法获取ERC721令牌URI的列表,但性能非常差。我想知道OpenSeas如何在相同功能上实现光速性能。

在大多数情况下,存储或缓存数据可以减少加载时间

您可以将
对象
值存储在DB中(例如MongoDB)并定期更新-如果您有可管理数量的
walletAddress
项,或者仅针对某些高优先级项

您甚至可以订阅令牌合约上的事件日志(在您的情况下是
传输
事件),而不必轮询更改。(如果您的订阅失败,可能作为备用方案进行投票。)

对于其余的
walletAddress
项(优先级较低的项),您可以将它们缓存在临时存储中(如Redis)。因此,第一次加载会很慢(因为它将从外部资源加载-就像您当前的代码段所做的那样),而其他加载(直到TTL过期)将只是从缓存加载,而不会命中外部资源