如何用Web3.js和Node.js获取钱包地址的全币种余额
基于Node.js + Web3.js 获取钱包地址代币信息的通用流程
1. 先搭好开发环境
- 初始化Node.js项目:终端执行
npm init -y生成package.json - 安装依赖:核心用Web3.js做链上交互,再加dotenv管理配置(比如RPC地址),执行
npm install web3 dotenv - 准备RPC节点地址:找以太坊公开节点(比如Infura、Alchemy的免费节点)或自建节点,把地址存在.env文件里方便调用
2. 查原生ETH余额的步骤
ETH是链上原生资产,直接用Web3内置方法即可查询:
- 实例化Web3对象:传入RPC地址,比如
const web3 = new Web3('你的RPC地址') - 调用
web3.eth.getBalance(钱包地址),返回值为Wei单位的余额(1ETH=1e18Wei) - 用
web3.utils.fromWei(余额, 'ether')将Wei转换为ETH单位,得到可读数值 - 注意:所有链上操作都是异步的,必须用async/await或.then()处理,不能同步取值
3. 查ERC-20代币余额的核心逻辑
合规ERC-20代币遵循统一标准,核心调用合约的balanceOf和decimals两个方法:
- 先获取目标代币的合约地址(比如USDT合约地址是0xdAC17F958D2ee523a2206206994597C13D831ec7)
- 准备极简ABI:无需全合约ABI,仅保留两个关键方法的片段即可:
[ { "constant":true, "inputs":[{"name":"_owner","type":"address"}], "name":"balanceOf", "outputs":[{"name":"","type":"uint256"}], "type":"function" }, { "constant":true, "inputs":[], "name":"decimals", "outputs":[{"name":"","type":"uint8"}], "type":"function" } ] - 实例化合约对象:
const tokenContract = new web3.eth.Contract(abi, 代币合约地址) - 调用
tokenContract.methods.balanceOf(钱包地址).call(),返回代币最小单位的余额(比如USDT为6位小数,返回对应整数) - 调用
tokenContract.methods.decimals().call()获取小数位数,将余额除以10^小数位数,转换为可读的代币数量
4. 批量查询多个ERC-20代币的优化
若要查询USDT、USDC等多个代币,避免串行查询降低效率:
- 先整理常用代币配置列表:
const tokens = [ { name: 'USDT', symbol: 'USDT', address: '0xdAC17F958D2ee523a2206206994597C13D831ec7' }, { name: 'USDC', symbol: 'USDC', address: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48' } ] - 用
Promise.all()并行调用所有代币的余额和小数位数查询:const tokenBalances = await Promise.all(tokens.map(async (token) => { const contract = new web3.eth.Contract(abi, token.address) const balance = await contract.methods.balanceOf(walletAddress).call() const decimals = await contract.methods.decimals().call() return { ...token, balance: (balance / (10 ** decimals)).toString(), decimals } })) - 最后将结果整理为结构化数据即可
5. 整合流程与错误处理
- 将ETH查询和ERC-20查询封装为统一函数,比如
getWalletAssets(walletAddress),方便调用 - 增加输入验证:用
web3.utils.isAddress(walletAddress)检查地址格式,格式错误直接返回提示 - 捕获异常:处理RPC连接失败、合约调用失败(如地址无效、代币不合规)等情况,返回明确错误信息
重点提醒
- 免费RPC节点有请求次数限制,高频查询建议使用付费节点或自建节点
- 链上所有数值均为整数,必须转换为对应单位后再展示,避免显示超长数字
- 所有链上操作均为异步,禁止使用同步写法,避免逻辑异常
内容的提问来源于stack exchange,提问作者Volodymyr Nabok
相关产品推荐
相关产品推荐

