use*_*151 1 ethereum decentralized-applications ethers.js
我正在构建一个铸造网站,要求我检查铸造的 NFT 数量并向用户实时显示该数字。
起初,我只是每隔几秒钟发出一次请求来检索号码,但后来我想我可以使用事件侦听器来减少请求,因为人们只会在短时间内进行铸造。
然而,使用事件监听器后,请求量大幅增加。看起来它一直在调用 blockNumber、chainId 和 getLogs。这就是事件侦听器在幕后工作的方式吗?或者我在这里做错了什么?
这是下一个 js API 路线,代码如下:
// Next.js API route support: https://nextjs.org/docs/api-routes/introduction
import { ethers } from 'ethers'
import { contractAddress } from '../../helpers'
import type { NextApiRequest, NextApiResponse } from 'next'
import abi from '../../data/abi.json'
const NEXT_PUBLIC_ALCHEMY_KEY_GOERLI =
process.env.NEXT_PUBLIC_ALCHEMY_KEY_GOERLI
let count = 0
let lastUpdate = 0
const provider = new ethers.providers.JsonRpcProvider(
NEXT_PUBLIC_ALCHEMY_KEY_GOERLI,
'goerli'
)
const getNumberMinted = async () => {
console.log('RUNNING NUMBER MINTED - MAKING REQUEST', Date.now())
const provider = new ethers.providers.JsonRpcProvider(
NEXT_PUBLIC_ALCHEMY_KEY_GOERLI,
'goerli'
)
const contract = new ethers.Contract(contractAddress, abi.abi, provider)
const numberMinted = await contract.functions.totalSupply()
count = Number(numberMinted)
lastUpdate = Date.now()
}
const contract = new ethers.Contract(contractAddress, abi.abi, provider)
contract.on('Transfer', (to, amount, from) => {
console.log('running event listener')
if (lastUpdate < Date.now() - 5000) {
getNumberMinted()
}
})
export default function handler(req: NextApiRequest, res: NextApiResponse) {
try {
res.setHeader('Content-Type', 'application/json')
res.status(200).json({ count })
} catch (err) {
res
.status(500)
.json({ error: 'There was an error from the server, please try again' })
}
}
Run Code Online (Sandbox Code Playgroud)
小智 5
如果您使用 AlchemyProvider 或直接使用 StaticJsonRpcProvider(ApchemyProvider 继承),您将消除 chainId 调用;这些用于确保网络没有更改,但如果您使用第三方服务,例如 Alchemy 或 INFURA,则这不是一个问题,这就是 StaticJsonRpcProvider 存在的原因。:)
\n然后,每个pollingInterval, agetBlockNumber都会被调用(因为这是一个相对便宜的调用)来检测新块何时发生;当一个新的块发生时,它使用该getLogs方法查找该块期间发生的任何日志。这最大限度地减少了昂贵方法的数量getLogs。
您可以增加或减少pollingInterval延迟以牺牲服务器资源成本。
这就是事件的工作原理。:)
\n那有意义吗?
\n| 归档时间: |
|
| 查看次数: |
2210 次 |
| 最近记录: |