找回密码
 立即注册
搜索
热搜: GTokenTool
查看: 113|回复: 1

web3.js如何监听加密合约的event

[复制链接]

212

主题

211

回帖

1228

积分

管理员

积分
1228
发表于 2025-7-23 19:04:29 | 显示全部楼层 |阅读模式
web3.js如何监听加密合约的event

212

主题

211

回帖

1228

积分

管理员

积分
1228
 楼主| 发表于 2025-7-23 19:07:17 | 显示全部楼层
在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监听智能合约的事件。

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Telegram|手机版|小黑屋|GTokenTool

GMT+8, 2025-9-11 03:59 , Processed in 0.023860 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表