Node.js 一键查询以太坊主币与代币余额的超详细指南

·

核心关键词:以太坊余额查询Node.js 区块链开发Web3 查询 eth代币余额查询以太坊地址余额智能合约 ABIfromWei 转换以太坊主网

对于前端开发者,能亲手用 Node.js + Web3 获取链上数据,就像获得了一把打开新世界大门的钥匙。本文将按实战节奏拆解:如何以最少代码快速查询以太坊主币(ETH)与任意 ERC-20 代币余额,并穿插详细示例与可抄作业的完整脚本。


准备工作:三分钟搞定运行环境

  1. Node.js ≥ 14(LTS 系列即可)。
  2. 安装依赖

    npm i web3@latest
  3. 选定一个 以太坊主网 RPC 节点

    • Alchemy、Infura 都可。
    • 把拿到的 https:// 地址存入环境变量 ETH_RPC_URL,方便脚本复用。

👉 点击获取可直接跑通的主网 RPC 节点示例脚本,省去 90% 踩坑时间


查询 ETH 主币余额:两行代码到位

场景回顾

代码展示

const Web3 = require('web3');
const web3 = new Web3(process.env.ETH_RPC_URL);

async function getETHBalance(wallet) {
  let wei = await web3.eth.getBalance(wallet);        // 返回 BigInt 串
  let eth = web3.utils.fromWei(wei, 'ether');         // 转换为 ether
  console.log(`地址 ${wallet} 持有 ${eth} ETH`);
  return eth;
}

// 调用示例
getETHBalance('0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045');

关键点速记


查询 ERC-20 代币余额:五步法必胜

场景回顾

STEP-1:准备 ABI

最精简的 ERC-20 ABI 只需包含四个方法名:

[
  {"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"type":"function"},
  {"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"type":"function"},
  {"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint8"}],"type":"function"},
  {"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"type":"function"}
]

记事本保存为 abi.json 即可,约 500 字节。

STEP-2:封装通用查询函数

const fs = require('fs');
const abi = JSON.parse(fs.readFileSync('./abi.json', 'utf8'));

async function getTokenBalance(wallet, contractAddr) {
  const contract = new web3.eth.Contract(abi, contractAddr);

  const [name, symbol, decimals, balanceWei] = await Promise.all([
    contract.methods.name().call(),
    contract.methods.symbol().call(),
    contract.methods.decimals().call(),
    contract.methods.balanceOf(wallet).call()
  ]);

  const balance = balanceWei / (10 ** decimals);  // 手动计算更直观
  console.log(`${wallet} 持有 ${balance} ${symbol}(${name})`);
  return { name, symbol, balance };
}

STEP-3:实战演练

拿 USDT 合约地址(0xdAC17F958D2ee523a2206206994597C13D831ec7)测一下:

getTokenBalance('0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045',
                '0xdAC17F958D2ee523a2206206994597C13D831ec7');

输出示例:

0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045 持有 123.456 USDT

👉 解锁完整工程模板:让团队在 1 小时内批跑上百个地址的余额抓取


真实项目技巧:把请求包一层缓存


常见问题 FAQ

阅读前先扫一眼,也许你的困惑就在这里。

Q1:查询结果总是 0,是哪里错了?
A:99% 发生在 合约地址写错钱包地址大小写没转 checksum。用 web3.utils.toChecksumAddress 再做一次标准化即可。

Q2:远程 RPC 调用超时怎么办?
A:换节点,或把单次并发降到 3 个以内。节点服务商对不同套餐的 QPS 限制差异极大。

Q3:fromWei 和手动除法,两者优劣?
A:fromWei 内部已封装 BigNumber 精度,直接用它最简单。手动除法需保证 decimals 正确,否则容易算成科学计数法。

Q4:主网与测试脚本能共用吗?
A:只要把 ETH_RPC_URL 换成测试网(Goerli、Sepolia 等)即可。同一接口,一行环境变量就搞定。

Q5:如何一次查询多个代币?
A:把合约地址数组化,用 Promise.all 并行请求。务必加并发限制。


结语:把脚本镶嵌到业务流程

拿到本文代码,你就能以 极简脚本以太坊余额查询 嵌入 Node.js 管道,开发效率直线上扬。祝你项目一路绿灯!