与普通用户在钱包客户端里直观看到资产不同,开发者、审计机构或分析团队常常需要在未导入私钥的前提下,精准抓取某一地址拥有的全部 ERC-20 代币余额。本文将用最简明的中文实操教程,示范如何借助 Chainbase、Alchemy、Moralis 三大主流 Web3 API 分别在 3 分钟内完成自动查询,并给出可直接复制的 JavaScript 代码片段。
核心痛点:为什么不能只看区块链浏览器?
区块链浏览器只展示已“被识别”的代币,冷门或新发行资产可能缺失。API 则可按需分页、可筛选、可批量自动化,为风控、税务、资产审计等场景奠定数据基础。
本文关键词:ERC-20 查询
、钱包资产 API
、Chainbase 教学
、Alchemy SDK
、Moralis 教程
、以太坊链上数据
方案一:Chainbase 免费层 —— 最快上手
Step 1:注册与准备
- 打开 Chainbase 官网 注册免费账号。
- 在控制台新建项目,复制生成的 API KEY。
- 本地或云端任选 IDE,准备钱包地址作为输入参数。
Step 2:三行代码实现查询
=======
// 引入 axios:npm i axios
const axios = require('axios');
async function getAllERC20(address="vitalik.eth", chainId=1) {
const url = `https://api.chainbase.online/v1/account/tokens`;
const { data } = await axios.get(url, {
params: { chain_id: chainId, address },
headers: { 'x-api-key': 'YOUR_API_KEY' }
});
return data.data.slice(0, 5); // 仅示意取前 5 条
}
控制台执行 node index.js
即可输出类似结果:
[
{ name: 'Ethereum', symbol: 'ETH', balance: '...' },
{ name: 'Uniswap V2', symbol: 'UNI-V2', balance: '...' },
...
]
Step 3:进阶技巧
- 查询特定代币:追加
contract_address
参数过滤 - 分页:
page
与limit
组合,避免单一请求超限 - 子图 Add-on:用 GraphQL 进一步聚合历史交易
方案二:Alchemy SDK —— 企业级精准度
Step 1:环境初始化
npm install alchemy-sdk
在 Alchemy 控制台创建新 App,Chain
选 Ethereum Mainnet,同步获取 HTTP URL 与 API KEY。
Step 2:获取原始余额列表
const { Alchemy, Network } = require('alchemy-sdk');
const config = { apiKey: 'YOUR_API_KEY', network: Network.ETH_MAINNET };
const alchemy = new Alchemy(config);
async function getERC20List(address) {
const raw = await alchemy.core.getTokenBalances(address);
return raw.tokenBalances.filter(b => b.tokenBalance !== '0x0');
}
Step 3:补全元数据并格式化
async function enrich(tokenBalance) {
const meta = await alchemy.core.getTokenMetadata(tokenBalance.contractAddress);
return {
contractAddress: tokenBalance.contractAddress,
symbol: meta.symbol,
decimals: meta.decimals,
balance: Number(tokenBalance.tokenBalance) / (10 ** meta.decimals)
};
}
全部代码串接 getERC20List -> map(enrich)
,即可得到名称、符号、精确小数位的 完整资产清单。
方案三:Moralis —— 高并发企业场景首选
Step 1:安装与链接
npm install moralis @moralisweb3/common-evm-utils
到 Moralis 后台 → Settings → Secrets 复制 Web3 API Key。
Step 2:一次性拉取全量资产
const Moralis = require('moralis').default;
await Moralis.start({ apiKey: 'YOUR_MORALIS_KEY' });
const response = await Moralis.EvmApi.token.getWalletTokenBalances({
chain: '0x1', // 对应 Ethereum Mainnet
address: '0x...'
});
console.log(response.toJSON());
返回字段一览:
contract_address
:合约地址name
&symbol
:名称与符号decimals
:小数位balance
:最小单位余额logo(可选)
:官方图标 URL
Step 3:处理大钱包的技巧
若钱包代币过多,建议:
- 分页
offset + limit
- 使用
cursor
实现流式读取 - 结果 异步写入缓存数据库(Redis / PostgreSQL)供后续分析
常见问题 FAQ
Q1:如果查询的地址持有 1,000+ 种代币,会不会超时?
A:三种服务均支持 limit
+ cursor
分页,确保大钱包亦可稳定拉取,建议每页 100–500 条、接口异步并行。
Q2:免费额度用完了怎么办?
A:Chainbase 赠送 100K 调用/天;Alchemy 与 Moralis 提升档按“即用即付”计费,在非敏感产品环境中以 链上缓存+本地索引 降本 70% 以上。
Q3:代币元数据返回为 null,是 Bug 吗?
A:可能原因:合约非标准 ERC-20、尚未被服务收录、或代币已自毁。可结合 contract_address
直接查询 Etherscan ABI 进一步校检。
Q4:Polygon、BSC 等多链怎么办?
A:上述三服务均提供多链网络参数,如 Chainbase 传 chain_id=56
即 BSC;Alchemy SDK 选 Network.MATIC_MAINNET
;Moralis 把 chain
换为 0x89
(Polygon)即可。
Q5:想实时监听转账后余额变化,有开源方案吗?
A:可部署 Alchemy Notify 或自托管 Subgraphs,搭配 WebSocket 订阅 Transfer
事件,实现秒级同步到本地数据库。
小结与行动清单
- 小体量场景:直接 Chainbase,代码最少,5 分钟跑通。
- 企业稳定:选 Alchemy SDK,token metadata 全量、可追溯。
- 高并发业务:用 Moralis,内置缓存、图标 CDN 省事省心。
无论你用哪家服务,牢记三步:注册密钥 → 构造地址参数 → 解析输出。把流程封装成独立模块,即可随时复用于资产审计、空投快照、税务报表等多种业务。