You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node.js中ERC20代币转账事件触发相关技术问题

解决Node.js中ERC20代币转账的事件触发问题

我看了你的代码,发现几个关键问题导致ERC20转账的事件触发没正常工作,咱们一步步来修复:

一、现有代码的核心问题

  • rawTransaction对象未完成,缺少gasLimit、nonce、data等交易必填字段,无法构建合法交易
  • 没有添加对ERC20合约Transfer事件的监听逻辑,即便交易成功也捕获不到事件
  • 缺少交易签名和发送的完整流程,转账操作根本没有执行,自然不会触发任何事件

二、修复后的完整代码

var events = require('events');
const express = require('express');
const router = express.Router();
const tokenbalance = require('./tokenbalance')
const keythereum = require("keythereum");
const request = require("request");
const Web3 = require('web3');
const Tx = require('ethereumjs-tx').Transaction; // 注意新版本的导入方式
const config = require('../../config');
const log = require('log4js').getLogger("tokenadmin");

var erc20Abi = [
  // 你的ABI内容保持不变,此处省略重复部分
  {
    "anonymous": false,
    "inputs": [
      { "indexed": true, "name": "_from", "type": "address" },
      { "indexed": true, "name": "_to", "type": "address" },
      { "indexed": false, "name": "_value", "type": "uint256" }
    ],
    "name": "Transfer",
    "type": "event"
  },
  {
    "anonymous": false,
    "inputs": [
      { "indexed": true, "name": "_owner", "type": "address" },
      { "indexed": true, "name": "_spender", "type": "address" },
      { "indexed": false, "name": "_value", "type": "uint256" }
    ],
    "name": "Approval",
    "type": "event"
  }
]

const Abiarray = erc20Abi;
const web3 = new Web3(new Web3.providers.HttpProvider(config.rpcURL));

let Tokenadmin = {
  tokenadmin: function(toAddress, myAddress, amount, contractAddress, callback) {
    const tokenContract = web3.eth.contract(Abiarray).at(contractAddress);
    
    // 调试用:打印转账前余额
    tokenContract.balanceOf.call(myAddress, function(err, balance) {
      console.log("转账前转出地址余额: ", balance.toString());
    });
    tokenContract.balanceOf.call(toAddress, function(err, result) {
      console.log("转账前转入地址余额: ", result.toString());
    });

    // 注意:生产环境绝对不要硬编码私钥!建议用环境变量或密钥管理服务
    const privateKey = Buffer.from('cc479124b293d2abd98ea4a57f2670ef7671c90d1eaa382258618d23440b12c2', 'hex');

    // 获取交易nonce(传入'pending'确保获取最新计数)
    web3.eth.getTransactionCount(myAddress, 'pending', function(err, nonce) {
      if (err) return callback(err);

      // 编码ERC20 transfer方法调用数据
      const transferData = tokenContract.transfer.getData(toAddress, amount);

      // 构建完整的原始交易对象
      const rawTransaction = {
        from: myAddress,
        nonce: web3.toHex(nonce),
        gasPrice: web3.toHex(web3.eth.gasPrice),
        gasLimit: web3.toHex(210000), // ERC20转账建议设置足够的gas额度
        to: contractAddress,
        value: web3.toHex(0), // ERC20转账无需ETH,value设为0
        data: transferData
      };

      // 签名交易(根据你的链配置调整chain参数,比如ropsten、goerli等)
      const tx = new Tx(rawTransaction, { chain: 'mainnet' });
      tx.sign(privateKey);
      const serializedTx = tx.serialize();

      // 发送签名后的交易
      web3.eth.sendRawTransaction('0x' + serializedTx.toString('hex'), function(err, txHash) {
        if (err) return callback(err);
        console.log("交易已发送,哈希: ", txHash);

        // --- 方式1:监听当前交易对应的Transfer事件 ---
        tokenContract.Transfer({ transactionHash: txHash }, function(err, event) {
          if (err) return callback(err);
          console.log("捕获到Transfer事件: ", {
            from: event._from,
            to: event._to,
            value: event._value.toString()
          });
          callback(null, { txHash, event });
        });

        // --- 方式2:持续监听合约所有Transfer事件(可选,适合监控场景)---
        // tokenContract.Transfer({}, { fromBlock: 'latest' })
        // .watch(function(err, event) {
        //   if (err) console.error("事件监听错误: ", err);
        //   console.log("新的Transfer事件: ", event);
        // });
      });
    });
  }
}

// 导出模块供外部调用
module.exports = Tokenadmin;

三、关键修复点说明

  1. 完整交易流程:补全了交易构建、签名、发送的全流程,确保转账操作能正常执行
  2. 事件监听实现:
    • 方式1通过交易哈希过滤,精准捕获当前转账触发的Transfer事件,适合单次转账场景
    • 方式2可持续监听合约所有新的转账事件,适合需要实时监控的场景
  3. 安全与适配:
    • 提示了私钥的安全管理方式,禁止硬编码
    • 可根据使用的区块链网络调整交易签名的chain参数
    • 设置了合理的gasLimit,避免因gas不足导致交易失败

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 09:05:39