无法从BSC合约获取响应:原正常运行的ethers代码突然失效求助
你的代码如下:
const { JsonRpcProvider } = require("@ethersproject/providers") const { Contract } = require("ethers") const { Wallet } = require("@ethersproject/wallet"); const abi = require('./abi.json'); const GLOBAL_CONFIG = { PPV2_ADDRESS: "0x18B2A687610328590Bc8F2e5fEdDe3b582A49cdA", PRIVATE_KEY: "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", BSC_RPC: "https://bsc-mainnet.public.blastapi.io" }; const signer = new Wallet(GLOBAL_CONFIG.PRIVATE_KEY, new JsonRpcProvider(GLOBAL_CONFIG.BSC_RPC)); const contract = new Contract(GLOBAL_CONFIG.PPV2_ADDRESS, abi, signer) const predictionContract = contract.connect( signer ) predictionContract.on("StartRound", async (epoch) => { console.log("\nStarted Epoch", epoch.toString()) });
针对代码突然失效的情况,按以下步骤排查:
检查RPC节点可用性
你使用的BlastAPI节点可能出现临时故障、限流或服务调整。替换为官方或稳定的BSC RPC节点试试,比如https://bsc-dataseed1.binance.org/,修改GLOBAL_CONFIG里的BSC_RPC值后重启脚本。
验证节点是否正常:打开终端执行以下命令,看是否能返回最新区块号,超时或报错则说明节点不可用:curl -X POST https://bsc-mainnet.public.blastapi.io -H "Content-Type: application/json" -d '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}'更新合约ABI
目标合约(0x18B2A687610328590Bc8F2e5fEdDe3b582A49cdA)可能已升级,本地ABI过时会导致事件监听和数据读取失败。去BSCscan搜索该合约地址,进入「Contract」标签复制最新ABI,覆盖本地的abi.json文件。简化事件监听代码
你的代码中contract.connect(signer)属于重复操作(初始化Contract时已传入signer),可能引发监听异常。直接使用contract对象绑定事件:// 去掉这一行:const predictionContract = contract.connect(signer) contract.on("StartRound", async (epoch) => { console.log("\nStarted Epoch", epoch.toString()) });另外,添加全局错误捕获,避免脚本静默退出:
process.on('uncaughtException', (err) => { console.error('脚本错误:', err); });确认合约事件是否正常触发
去BSCscan查看该合约的「Events」标签,检查最近是否有StartRound事件产生。如果确实没有新事件,说明是合约本身未触发,而非代码问题。锁定依赖版本并重新安装
虽然你没手动更新代码,但依赖包可能被自动更新导致兼容问题。删除node_modules和package-lock.json,在package.json中指定固定版本:"dependencies": { "@ethersproject/providers": "^5.7.2", "ethers": "^5.7.2", "@ethersproject/wallet": "^5.7.0" }然后执行
npm install,重启脚本。
内容的提问来源于stack exchange,提问作者steve

