具有 TronWeb 的事件侦听器:监视 TRC-20 在 TRON 上的传输 — TRON Wiki

具有 TronWeb 的事件侦听器:监视 TRC-20 在 TRON 上的传输

10 分钟阅读 · ⌘K 搜索

实时USDT存款检测为TRON上的交易所、支付网关和游戏平台提供支持。当资金到达受监控地址时,生产系统不会每秒轮询 balanceOf,而是侦听 USDT 合约发出的 Transfer 事件。

本指南涵盖事件机制、TronGrid查询、TronWeb模式和可扩展架构。

TRC-20 转账事件

代码
event Transfer(address indexed from, address indexed to, uint256 value);

Topic0(事件签名哈希):

代码
ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef

索引fromto可以按收件人进行过滤——这对于存款钱包至关重要。

USDT合约:TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t

TronGrid 事件 API

模式(检查最新的 TronGrid 文档以获取确切路径):

代码
GET /v1/contracts/{contractAddress}/events?event_name=Transfer&only_confirmed=true

过滤客户端或通过 API 参数来查找与您的存款钱包匹配的 to 地址。

标题:TRON-PRO-API-KEY

使用 fingerprint 进行分页以实现历史同步。

轮询工作示例

代码
const USDT = 'TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t';
let lastTimestamp = Date.now() - 60_000;

async function pollTransfers(depositAddress) {
  const url = `https://api.trongrid.io/v1/contracts/${USDT}/events?event_name=Transfer&only_confirmed=true&min_block_timestamp=${lastTimestamp}`;
  const res = await fetch(url, {
    headers: { 'TRON-PRO-API-KEY': process.env.TRONGRID_KEY },
  });
  const { data } = await res.json();

  for (const ev of data || []) {
    const to = tronWeb.address.fromHex(ev.result.to);
    if (to !== depositAddress) continue;
    const value = Number(ev.result.value) / 1e6;
    await creditDeposit(ev.transaction_id, value, ev);
  }
  lastTimestamp = Date.now();
}

setInterval(() => pollTransfers(process.env.DEPOSIT_ADDRESS), 5000);

TronWeb 合约活动

代码
const contract = await tronWeb.contract().at(USDT);
// Historical — depends on TronWeb version / node support
const events = await contract.Transfer().get({
  filters: { to: depositAddressHex },
  fromBlock: 0,
  toBlock: 'latest',
});

支持各不相同 - TronGrid REST 对于生产索引器来说更可靠。

每用户充值地址

两种模式:

图案优点缺点
单一热钱包+金额匹配一位听众碰撞风险
每个用户的 HD 钱包唯一地址干净的归因更多需要管理的按键

to 字段上的事件过滤器最适用于唯一地址。

完整支付流程:接受USDT付款API

幂等性

键:transaction_id + event_index 或日志索引

入账前:

  1. 检查数据库中是否存在 txid
  2. 验证交易SUCCESS
  3. 确认合同正式USDT

4、信用用户

缩放

高容量:

  • 运行使用 TronGrid 或自托管事件插件的专用索引器
  • 将事件排队到 Kafka/RabbitMQ
  • 按地址范围分区的水平工作人员
  • 在 Redis 中存档旧游标

延迟预期

TRON ~3s 出块时间 → 轮询间隔 3–5s 合理。更快的用户体验显示“确认”,直到 N 个块固化。

缩放事件索引

在高容量时,运行在 PostgreSQL 中存储事件的专用索引器,而不是从请求处理程序轮询 TronGrid。通过 transactionId + logIndex 进行重复数据删除。处理链重组——在TRON上很少见,但索引blockNumber用于重放逻辑。

转账事件签名参考

USDT 转移事件topic0(keccak256):ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef。过滤 topic2 收件人地址(填充至 32 字节)。将 data 字段解码为 uint256 金额。填充错误会导致错过存款 - 尽可能使用TronWeb ABI 解码器而不是手动十六进制切片。

相关指南 {#相关}

常见问题解答

USDT 在传输时发出什么事件?

TRC-20 Transfer(索引地址,索引地址,uint256 值) — topic0 是 keccak256 事件签名哈希。

TronWeb可以像以太坊上的WebSocket一样订阅吗?

TRON 工具通常使用轮询 TronGrid 事件端点或运行您自己的事件插件 - 与 eth_subscribe 不同。

我可以查询多早之前的事件?

TronGrid 保留索引事件 - 使用分页在新部署上进行完整历史记录同步。

内部交易会发出 Transfer 吗?

USDT transfer 是标准 TRC-20 调用 — 成功时出现在日志中。解析父发送日志。

假USDT事件?

严格过滤contract_address——网络钓鱼代币从错误的合约中发出类似命名的事件。