使用Alchemy WebSocket Provider时遇“could not detect network”错误求助
问题修复:以太坊地址余额检查脚本的NETWORK_ERROR错误
问题描述
我有一个包含超100万条以太坊地址与对应私钥的文件,每行地址和私钥仅用逗号分隔,示例:0x7256bCf73C2309893AA12d6b26A142AB3097560c,0x5281130a3a84f531a1e30649a881207a65ce17fae084e0ae6e78xxxxxxxxxxxx
希望用Node.js编写脚本,检查每行地址余额是否大于0,并导出符合条件的地址及私钥到新文件,但运行脚本时始终出现以下错误:
var error = new Error(message); ^ Error: could not detect network (event="noNetwork", code=NETWORK_ERROR, version=providers/5.6.8) at Logger.makeError (C:\Users\Asus\Downloads\eth-fast-mnemonic-checker-main\eth-fast-mnemonic-checker-main\node_modules\@ethersproject\logger\lib\index.js:233:21) at Logger.throwError (C:\Users\Asus\Downloads\eth-fast-mnemonic-checker-main\eth-fast-mnemonic-checker-main\node_modules\@ethersproject\logger\lib\index.js:242:20) at WebSocketProvider.<anonymous> (C:\Users\Asus\Downloads\eth-fast-mnemonic-checker-main\eth-fast-mnemonic-checker-main\node_modules\@ethersproject\providers\lib\json-rpc-provider.js:561:54) at step (C:\Users\Asus\Downloads\eth-fast-mnemonic-checker-main\eth-fast-mnemonic-checker-main\node_modules\@ethersproject\providers\lib\json-rpc-provider.js:48:23) at Object.throw (C:\Users\Asus\Downloads\eth-fast-mnemonic-checker-main\eth-fast-mnemonic-checker-main\node_modules\@ethersproject\providers\lib\json-rpc-provider.js:29:53) at rejected (C:\Users\Asus\Downloads\eth-fast-mnemonic-checker-main\eth-fast-mnemonic-checker-main\node_modules\@ethersproject\providers\lib\json-rpc-provider.js:21:65) at processTicksAndRejections (node:internal/process/task_queues:96:5) { reason: 'could not detect network', code: 'NETWORK_ERROR', event: 'noNetwork' }
初始脚本
const fs = require('fs') const ethers = require('ethers') require('colors') const provider = new ethers.providers.WebSocketProvider( 'wss://eth-mainnet.g.alchemy.com/v2/k5d8RoDGOyxZmVWy2UPNxxxxxxxxxxxx' ) const addresses = fs .readFileSync('hits.txt', 'utf8') .split('\n') .map((val) => { return val.split(',') }) ;(async () => { for (let i = 0; i < addresses.length; i++) { const address = addresses[i][0] const balance = await provider.getBalance(address) if (balance.gt(0)) { console.log(address.bgGreen.black, balance.toString().bgGreen.black) console.log('Private Key: '.yellow, addresses[i][1]) } else { console.log(address, 0) } } })()
修复方案
1. 替换WebSocket Provider为HTTP Provider
WebSocket连接易受网络环境干扰,改用HTTP Provider更稳定,适合批量查询:
const provider = new ethers.providers.JsonRpcProvider( 'https://eth-mainnet.g.alchemy.com/v2/k5d8RoDGOyxZmVWy2UPNxxxxxxxxxxxx' )
2. 过滤无效数据与空行
原脚本未处理文件末尾空行或格式错误的行,需添加过滤逻辑:
const addresses = fs .readFileSync('hits.txt', 'utf8') .split('\n') .filter(line => line.trim() !== '' && line.includes(',')) // 剔除空行和无效格式行 .map(line => line.trim().split(','))
3. 添加频率控制与错误捕获
百万级数据批量查询会触发API限流,需加入延迟;同时捕获请求异常避免脚本崩溃:
// 延迟函数,控制请求频率 const delay = ms => new Promise(resolve => setTimeout(resolve, ms)) // 循环内添加异常处理与延迟 for (let i = 0; i < addresses.length; i++) { try { const [address, privateKey] = addresses[i] const balance = await provider.getBalance(address) const ethBalance = ethers.utils.formatEther(balance) if (parseFloat(ethBalance) > 0) { console.log(`${address.bgGreen.black} 余额: ${ethBalance.bgGreen.black}`) console.log('私钥: '.yellow, privateKey) fs.appendFileSync('valid_addresses.txt', `${address},${privateKey}\n`) } else { console.log(`${address} 余额: 0`) } // 每100次请求添加延迟,避开API限流 if (i % 100 === 0 && i !== 0) { await delay(1000) } } catch (err) { console.error(`查询地址${addresses[i][0]}失败:`, err.message) await delay(3000) // 错误时延迟重试 } }
4. 验证API密钥有效性
确认Alchemy API密钥正确,登录后台检查密钥状态,确保已开启以太坊主网权限。
完整修复后的脚本
const fs = require('fs') const ethers = require('ethers') require('colors') // 使用HTTP Provider提升连接稳定性 const provider = new ethers.providers.JsonRpcProvider( 'https://eth-mainnet.g.alchemy.com/v2/k5d8RoDGOyxZmVWy2UPNxxxxxxxxxxxx' ) // 读取并过滤有效地址数据 const addresses = fs .readFileSync('hits.txt', 'utf8') .split('\n') .filter(line => line.trim() !== '' && line.includes(',')) .map(line => line.trim().split(',')) // 延迟函数控制请求频率 const delay = ms => new Promise(resolve => setTimeout(resolve, ms)) ;(async () => { // 初始化结果文件(清空或创建) fs.writeFileSync('valid_addresses.txt', '') for (let i = 0; i < addresses.length; i++) { try { const [address, privateKey] = addresses[i] // 获取余额并转换为ETH格式 const balance = await provider.getBalance(address) const ethBalance = ethers.utils.formatEther(balance) // 检查余额是否大于0 if (parseFloat(ethBalance) > 0) { console.log(`${address.bgGreen.black} 余额: ${ethBalance.bgGreen.black}`) console.log('私钥: '.yellow, privateKey) // 追加写入有效地址文件 fs.appendFileSync('valid_addresses.txt', `${address},${privateKey}\n`) } else { console.log(`${address} 余额: 0`) } // 每100次请求触发延迟,避免API限流 if (i % 100 === 0 && i !== 0) { console.log('--- 触发限流延迟 ---'.gray) await delay(1000) } } catch (err) { console.error(`查询失败(${addresses[i][0]}):`, err.message.red) // 错误时延迟3秒后继续执行 await delay(3000) } } console.log('=== 所有地址查询完成 ==='.cyan) })()
内容的提问来源于stack exchange,提问作者Nikhil Meena
相关产品推荐
相关产品推荐

