一、核心解决方案:最快实现合约事件监听
使用 .js 监听智能合约事件,只需三步:
1. 连接以太坊节点:通过 .. 或 创建 。
2. 获取合约实例:使用合约地址、ABI 和 实例化 对象。
3. 注册监听器:调用 .on(, ) 或 .once(, ) 开始监听。
最简示例代码(直接可用):
const { } = ("");
// 连接节点(以以太坊主网为例)
const = new ..(";);
// 合约ABI(仅包含需要监听的事件)
const abi = ["event ( from, to, value)"];
// 合约实例
const = new .("", abi, );
// 监听事件
.on("", (from, to, value, event) => {
.log(转账: ${from} -> ${to}, 金额: ${.utils.(value, 18)} ETH);
.log("事件详情:", event);
});
二、基础知识:理解事件与监听器
1. 智能合约事件(Event)
事件是 中用于记录区块链上特定操作日志的机制。
每个事件可包含 参数(最多3个),用于高效过滤。
事件一经发出即永久存储,可通过日志检索。
2. .js 中的监听器
.on(, ):持续监听,每次事件触发都会执行回调。
.once(, ):只监听一次,事件触发后自动移除监听器。
.off(, ):移除指定监听器。
.([]):移除所有监听器。
三、监听方式详解
1. 按事件名称监听
.on("", (from, to, value, event) => {
// 处理逻辑
});
可以是字符串(事件名)或过滤器对象(见下文)。
2. 一次性监听(once)
适用于只需响应首次事件的场景,如等待某个交易确认。
.once("", (from, to, value, event) => {
.log("首次转账发生");
});
3. 按事件签名监听(适用于匿名事件)
const = "(,,)";
.on(, (from, to, value, event) => {
// ...
});
4. 使用过滤器精确监听
过滤器可基于 参数进行精确匹配,减少无关事件触发。
基础过滤器:
const = ..(, null); // 监听特定发送方
// 或
const = ..(null, ); // 监听特定接收方
// 或
const = ..(, ); // 监听特定发送方和接收方
.on(, (from, to, value, event) => {
// 仅当from匹配时触发
});
使用 ..: 会根据 ABI 自动生成过滤器方法,参数数量应与 参数一致,不关心的参数传入 null。
5. 高级过滤:按区块范围与自定义条件
如需按区块范围或非 参数过滤,需通过 . 手动查询并模拟监听。
// 获取过去10个区块的日志
const = {
: .,
: - 10,
: ,
: [.utils.id("(,,)")] // 可选,按事件签名过滤
};
const logs = await .();
logs.(log => {
const = ..(log);
// 自定义条件:value > 100
if (.args.value.gt(..from(100))) {
.log("大额转账:", .args);
}
});
四、完整实战:监听 USDT 合约的 事件并过滤
以下代码展示如何监听 USDT 合约,只接收金额 ≥ 1000 USDT 的转账,并记录到文件。
const { } = ("");
const fs = ("fs");
// 配置
const = ";;
const = "";
const = .utils.("1000", 6); // USDT 精度为6
// ABI(仅事件)
const abi = [
"event ( from, to, value)"
];
async main() {
const = new ..();
const = new .(, abi, );
// 定义监听器
const = (from, to, value, event) => {
if (value.gte()) {
const = {
: event.,
from,
to,
value: .utils.(value, 6),
: event.,
: new Date().()
};
.log("检测到大额转账:", );
fs.(".log", JSON.() + "n");
}
};
// 开始监听(无过滤,在回调内二次过滤)
.on("", );
.log("开始监听 USDT 事件...");
// 保持进程运行
await new (() => {});
}
main().catch(.error);
五、常见问题与注意事项
1. 如何确保监听不断线?
使用 节点(如 wss://)替代 HTTP 节点,实现实时推送。
监听 的 close 事件并实现自动重连逻辑。
示例(使用 ):
const = new ..("wss://..io/ws/v3/");
const = new .(, abi, );
// 监听后需处理重连
..on("close", () => {
.log("连接断开,5秒后重试...");
(() => (), 5000);
});
2. 如何监听已部署合约的历史事件?
使用 .(, , ) 方法查询历史日志,无需监听实时事件。
const = ..();
const = await .(, , "");
.(event => {
.log(event.args);
});
3. 事件回调的参数顺序和内容
回调参数按事件定义的非 参数在前、 参数在后的顺序排列(但 实际会将所有参数按声明顺序传入, 参数也会包含在内)。
最后一个参数始终是 Event 对象,包含交易哈希、区块号、日志索引等元数据。
4. 性能优化
使用过滤器减少回调触发次数。
避免在回调中执行耗时操作(如数据库写入),可改为异步队列。
定期清理不再需要的监听器(.off)。
5. 错误处理
监听器回调应包含 try/catch,防止未捕获异常导致进程崩溃。
对于 连接,需监听错误事件并实现重试。
6. 支持的节点类型
HTTP :适用于一次性查询和简单监听,但无法实时推送。
:支持实时事件推送,推荐用于生产环境。
、、 等第三方节点服务均支持。
六、权威参考
本文所有代码示例均基于 .js v5.7.2,若使用 v6 版本,API 略有变化,但核心逻辑一致。建议在项目中锁定版本号确保稳定性。

