如何编写脚本监听特定合约新交易并接收通知,及web3.js合约监控常用库
Web3.js合约监控相关问题解答
一、合约新交易主动通知脚本编写方法
前置准备
你需要先安装web3.js依赖:npm install web3
注意:必须使用WebSocket或IPC类型的节点Provider,HTTP类型节点不支持主动订阅功能,只能采用低效率的轮询方案,非特殊情况不推荐使用
实现步骤
- 初始化web3实例和合约对象
const { Web3 } = require('web3'); // 填入你的节点WebSocket地址 const web3 = new Web3('wss://你的节点WS地址'); // 填入目标合约地址和对应ABI const TARGET_CONTRACT_ADDR = '0xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'; const CONTRACT_ABI = [/* 替换为目标合约的ABI内容 */]; const targetContract = new web3.eth.Contract(CONTRACT_ABI, TARGET_CONTRACT_ADDR);
- 订阅合约事件/交易
你可以根据需求选择监听范围:
- 监听合约所有交互产生的事件,只要有新交易触发合约事件就会收到通知:
targetContract.events.allEvents({ fromBlock: 'latest' }, (error, event) => { if (error) { console.error('监听出错:', error); return; } // 拿到新交易相关信息 const txInfo = { hash: event.transactionHash, blockHeight: event.blockNumber, eventParams: event.returnValues }; console.log('监测到合约新交易:', txInfo.hash); // 这里写你的通知逻辑,比如调用邮件、钉钉、Telegram bot的推送接口 sendNotification(txInfo); })
- 只监听合约的特定事件,比如Transfer、Mint等,把上面的
allEvents换成对应事件名即可,比如targetContract.events.Transfer(...) - 如果需要监听还没上链的pending交易,可以订阅pending交易池再过滤目标合约地址:
web3.eth.subscribe('pendingTransactions', async (error, txHash) => { if (error) return; const tx = await web3.eth.getTransaction(txHash); if (tx?.to?.toLowerCase() === TARGET_CONTRACT_ADDR.toLowerCase()) { console.log('监测到合约待确认交易:', txHash); // 触发通知逻辑 } })
- 补充异常处理
记得加节点断连重连逻辑,同时缓存已处理的最新区块高度,重连后补查中间漏的区块数据,避免漏掉交易通知。
二、合约监控脚本常用实用库
web3.js/ethers.js:核心链交互库,二选一即可,ethers.js API更简洁、体积更小,新手也可以优先选择dotenv:用来管理节点地址、推送密钥等敏感配置,不用硬编码到代码里,降低泄露风险winston/pino:专业日志库,支持日志分级、落地存储、自动加时间戳,比原生console.log更适合长期运行的监控脚本排查问题node-schedule:如果只能用HTTP节点走轮询方案,可以用这个库实现定时拉取区块的任务调度chalk:给控制台输出增加不同颜色标记,报错标红、新交易通知标绿,查看日志更直观viem:近几年流行的轻量链交互库,性能比web3.js和ethers.js更高,多链监控场景更适用
内容的提问来源于stack exchange,提问作者Neil Christiane Buenaobra
相关产品推荐
相关产品推荐

