在Web3.js中监听智能合约事件是一个常见的需求,下面我将详细介绍如何实现这一功能。 基本方法1. 创建合约实例首先,你需要有一个合约的ABI和地址: javascript
const contractABI = [...; // 你的合约ABIconst contractAddress = '0x...'; // 你的合约地址// 创建合约实例const contract = new web3.eth.Contract(contractABI, contractAddress);
2. 监听事件Web3.js提供了几种监听事件的方式: 方式一:使用events方法javascript
// 监听特定事件contract.events.EventName({ filter: {myParam: [1, 2, 3}, // 可选的过滤条件 fromBlock: 'latest' // 可选的起始区块}, function(error, event) { console.log(event);}).on('data', function(event){ console.log('事件数据:', event);}).on('changed', function(event){ // 事件被从区块链中移除时触发}).on('error', console.error);
方式二:使用once方法(只监听一次)javascript
contract.once('EventName', { filter: {myParam: [1, 2, 3}, fromBlock: 'latest'}, function(error, event) { console.log(event);});
方式三:使用getPastEvents获取历史事件javascript
async function getPastEvents() { const events = await contract.getPastEvents('EventName', { filter: {myParam: [1, 2, 3}, fromBlock: 0, toBlock: 'latest' }); console.log(events);}
实际示例假设我们有一个名为TokenTransfer的事件: solidity
event TokenTransfer(address indexed from, address indexed to, uint256 value);
监听这个事件的代码: javascript
contract.events.TokenTransfer({ filter: {from: '0x123...'}, // 可选,只监听特定地址的转账 fromBlock: 'latest'}).on('data', event => { console.log(`转账事件: 发送方: ${event.returnValues.from} 接收方: ${event.returnValues.to} 金额: ${event.returnValues.value} `);}).on('error', err => { console.error('监听错误:', err);});
注意事项性能考虑:监听历史事件可能会消耗大量资源,特别是当从很早的区块开始时。 WebSocket连接:对于持续监听,建议使用WebSocket提供者而不是HTTP: javascript
const web3 = new Web3(new Web3.providers.WebsocketProvider('wss://...'));
错误处理:始终添加错误处理以防止应用崩溃。 重连机制:网络中断时需要实现重连逻辑。 内存泄漏:长时间运行的监听器可能会导致内存泄漏,需要适时清理: javascript
const subscription = contract.events.EventName(...);// 需要时取消监听subscription.unsubscribe();
完整示例javascript
const Web3 = require('web3');const web3 = new Web3('wss://mainnet.infura.io/ws/v3/YOUR_PROJECT_ID');const contractABI = [...; // 你的合约ABIconst contractAddress = '0x...'; // 你的合约地址const contract = new web3.eth.Contract(contractABI, contractAddress);function startEventListener() { const eventSubscription = contract.events.YourEventName({ fromBlock: 'latest' }) .on('data', event => { console.log('新事件:', event); // 处理事件逻辑 }) .on('error', err => { console.error('监听错误:', err); // 错误处理,可以尝试重新连接 setTimeout(startEventListener, 1000); }); return eventSubscription;}const subscription = startEventListener();// 在应用关闭时取消监听process.on('SIGINT', () => { subscription.unsubscribe(); process.exit();});
通过以上方法,你可以有效地使用web3.js监听智能合约的事件。
|