求助:如何通过WebSocket实现BSC新币池创建的有效监控?
解决BSC新币池监控问题的修正方案
原代码存在的核心问题
- 错误使用Solana生态地址:代码中引入的
RAYDIUM_PUBLIC_KEY是Solana链上Raydium的合约地址,与BSC完全无关,BSC应监听PancakeSwap工厂合约的PairCreated事件。 - 未发送WebSocket订阅请求:仅建立WebSocket连接但未向节点发送订阅新区块的指令,导致无法持续接收区块数据。
- 错误的消息处理逻辑:原代码期望接收
pairCreated方法的消息,这不符合BSC的JSON-RPC WebSocket协议规范,实际需要解析区块日志筛选目标事件。 - 重连后事件监听失效:重连函数未重新绑定WebSocket事件监听器,导致重连后脚本无法响应新消息。
可用的BSC新币池监控JS脚本
const WebSocket = require('ws'); const { ethers } = require('ethers'); // BSC网络配置 const BSC_WSS_URL = 'wss://go.getblock.io/1718c1c14c0441dd8fb04dfd7146c32d'; // 替换为你的BSC WebSocket节点地址 const PANCAKE_FACTORY_ADDRESS = '0xcA143Ce32Fe78f1f7019d7d551a6402fC5350c73'; // PancakeSwap V2工厂合约地址 const PAIR_CREATED_EVENT_SIG = '0x0d3648bd0f6ba80134a33ba9275ac585d9d315f0ad8355cddefde31afa28d0e9'; // PairCreated事件签名哈希 const SESSION_HASH = 'QNDEMO' + Math.ceil(Math.random() * 1e9); let ws; let subscriptionId = null; // 初始化WebSocket连接 function initWebSocket() { ws = new WebSocket(BSC_WSS_URL, { headers: { 'x-session-hash': SESSION_HASH } }); ws.on('open', () => { console.log('WebSocket连接已建立'); // 订阅新区块头部 subscribeNewHeads(); }); ws.on('message', async (data) => { const message = JSON.parse(data); // 处理订阅的新区块消息 if (message.method === 'eth_subscription' && message.params.subscription === subscriptionId) { const blockHash = message.params.result.hash; await fetchBlockLogs(blockHash); } // 处理订阅ID返回 else if (message.id === 1 && message.result) { subscriptionId = message.result; console.log('成功订阅新区块,ID:', subscriptionId); } }); ws.on('error', (error) => { console.error('WebSocket错误:', error); }); ws.on('close', () => { console.log('WebSocket连接断开,5秒后重连'); subscriptionId = null; setTimeout(initWebSocket, 5000); }); } // 发送订阅新区块的请求 function subscribeNewHeads() { ws.send(JSON.stringify({ jsonrpc: '2.0', id: 1, method: 'eth_subscribe', params: ['newHeads'] })); } // 拉取指定区块的日志并筛选PairCreated事件 async function fetchBlockLogs(blockHash) { try { const response = await fetch('https://go.getblock.io/63a569b81c6940b9b1f1230d6dd7f042', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ jsonrpc: '2.0', id: 2, method: 'eth_getLogs', params: [{ address: PANCAKE_FACTORY_ADDRESS, topics: [PAIR_CREATED_EVENT_SIG], blockHash: blockHash }] }) }); const result = await response.json(); if (result.result && result.result.length > 0) { result.result.forEach(log => { parsePairCreatedLog(log); }); } } catch (error) { console.error('拉取区块日志失败:', error); } } // 解析PairCreated事件日志 function parsePairCreatedLog(log) { // 使用ethers解析日志数据 const iface = new ethers.Interface([ 'event PairCreated(address indexed token0, address indexed token1, address pair, uint)' ]); const eventData = iface.parseLog(log); console.log('\n=== 新币池创建 ==='); console.log('币池地址:', eventData.args.pair); console.log('Token0地址:', eventData.args.token0); console.log('Token1地址:', eventData.args.token1); // 可选:获取代币详细信息(需调用代币合约) // fetchTokenDetails(eventData.args.token0); // fetchTokenDetails(eventData.args.token1); } // 启动监控 initWebSocket();
脚本说明
- 依赖安装:需先安装依赖包:
npm install ws ethers node-fetch - 事件监听逻辑:通过订阅新区块头部,拉取每个区块的日志,筛选PancakeSwap工厂合约的
PairCreated事件 - 日志解析:使用
ethers.js的Interface工具解析事件参数,无需手动处理ABI编码 - 自动重连:连接断开后自动重试,并重发订阅请求
内容的提问来源于stack exchange,提问作者Tomas Netanyahu
相关产品推荐
相关产品推荐

