You need to enable JavaScript to run this app. Node.js环境下如何使用Tronweb监听波场网络的原生TRX交易事件
优惠活动
大模型
产品
解决方案
定价
更多

Node.js环境下如何使用Tronweb监听波场网络的原生TRX交易事件

如何监听波场网络原生TRX的转账事件

原生TRX转账不属于智能合约触发的事件,所以无法直接使用tronweb.contract().at(contractAddress).Transfer.watch()这类合约事件监听方法实现,可通过以下两种常用方案实现监听:

  • 方案1:手动轮询区块过滤TRX转账交易
    波场网络平均每3秒出一个区块,你可以定期拉取最新区块,遍历区块内的所有交易,筛选contract_type为TransferContract的交易即为原生TRX转账交易,参考代码如下:

    const TronWeb = require('tronweb');
    // 初始化TronWeb,可根据需求替换为自有节点地址
    const tronWeb = new TronWeb({
      fullHost: 'https://api.trongrid.io'
    });
    
    // 记录上次已处理的区块高度,避免重复处理
    let lastProcessedBlock = 0;
    
    async function scanTRXTransfer() {
      try {
        const latestBlock = await tronWeb.trx.getCurrentBlock();
        const latestBlockNum = latestBlock.block_header.raw_data.number;
        
        // 首次运行初始化处理高度
        if (lastProcessedBlock === 0) {
          lastProcessedBlock = latestBlockNum - 1;
          return;
        }
    
        // 遍历所有未处理的区块
        for (let blockNum = lastProcessedBlock + 1; blockNum <= latestBlockNum; blockNum++) {
          const block = await tronWeb.trx.getBlock(blockNum);
          if (!block?.transactions) continue;
    
          // 遍历区块内所有交易筛选TRX转账
          for (const tx of block.transactions) {
            if (tx.raw_data.contract[0].type === 'TransferContract') {
              const transferInfo = tx.raw_data.contract[0].parameter.value;
              const fromAddress = tronWeb.address.fromHex(transferInfo.owner_address);
              const toAddress = tronWeb.address.fromHex(transferInfo.to_address);
              // sun单位转换为TRX
              const transferAmount = transferInfo.amount / 1e6;
              const txHash = tx.txID;
    
              // 此处添加自定义业务处理逻辑
              console.log(`TRX转账事件:哈希${txHash},转出${fromAddress},转入${toAddress},金额${transferAmount}TRX`);
            }
          }
          lastProcessedBlock = blockNum;
        }
      } catch (e) {
        console.error('扫描区块出错:', e);
      }
    }
    
    // 每3秒执行一次扫描,匹配波场出块速度
    setInterval(scanTRXTransfer, 3000);
    
  • 方案2:通过事件订阅接口监听新区块
    无需自己实现轮询逻辑,直接调用tronweb的事件订阅接口监听新生成的区块,再按上述逻辑过滤TRX转账即可,参考代码片段:

    // 订阅新区块事件
    tronWeb.event.subscribe('block', {}, (error, block) => {
      if (error) {
        console.error('区块订阅失败:', error);
        return;
      }
      if (!block?.transactions) return;
      // 遍历交易过滤TRX转账的逻辑和方案1完全一致
      for (const tx of block.transactions) {
        if (tx.raw_data.contract[0].type === 'TransferContract') {
          // 自定义业务处理逻辑
        }
      }
    })
    

提示:如果只需监听特定地址的TRX转入/转出,在过滤交易时补充判断fromAddress或toAddress是否为目标地址即可,无需处理全量TRX转账交易,降低性能消耗。

内容的提问来源于stack exchange,提问作者ADLZ

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.21 04:36:02