以太坊如何查询ERC20代币持有者,实用指南与工具详解
在以太坊生态中,ERC20代币是最常见的代币标准,被广泛应用于稳定币(如USDT、USDC)、治理代币(如UNI、AAVE)、NFT相关代币等多种场景,无论是项目方进行代币分发管理、投资者分析代币分布,还是安全研究员追踪异常资金流向,查询ERC20代币的持有者信息都是核心需求,本文将详细介绍以太坊查询ERC20代币持有者的多种方法,包括区块链浏览器、专业数据API、节点工具及代码实现,帮助不同技术背景的用户高效获取所需数据。
通过区块链浏览器直接查询:适合新手与快速查询
区块链浏览器是以太坊上最直观、最易用的数据查询工具,它将链上数据以可视化界面呈现,无需技术基础即可完成ERC20代币持有者查询。
选择主流区块链浏览器
以太坊常用的区块链浏览器包括:
- Etherscan(https://etherscan.com):最权威的以太坊浏览器,支持代币、地址、交易等多维度查询;
- Ethplorer(https://ethplorer.io):专注于代币数据,界面简洁,适合代币持有者分析;
- BscScan(https://bscscan.com):虽然最初为币安智能链设计,但也支持以太坊ERC20代币查询。
具体操作步骤(以Etherscan为例)
(1)获取代币合约地址
ERC20代币的所有信息(包括持有者列表)都存储在其智能合约中,因此首先需要知道代币的合约地址。
- 方法1:如果代币在交易所上线,可在交易所的代币详情页找到“合约地址”;
- 方法2:通过代币官网或白皮书获取;
- 方法3:在Etherscan搜索框输入代币名称(如“USDT”),筛选出“ERC20 Token”类型的结果,即可看到合约地址。
(2)在浏览器中搜索合约地址
打开Etherscan,在顶部搜索框输入代币合约地址,进入代币详情页,输入USDT的合约地址0xdAC17F958D2ee523a2206206994597C13D831ec7,即可看到代币基本信息(如名称、符号、总供应量等)。
(3)进入“Token Holders”页面
在代币详情页顶部导航栏找到“Token Holders”(代币持有者)标签,点击进入,页面会展示以下关键信息:
- 持有者列表:按持有代币数量从高到低排序,显示地址、持有数量、占比等;
- 分页功能:支持按每页20/50/100/200条记录展示,适合查看不同规模的持有者分布;
- 导出功能:点击“Export”按钮,可将持有者数据导出为CSV或Excel文件,方便后续分析。
(4)高级筛选(部分浏览器支持)
- 地址筛选:输入特定地址(如交易所钱包或项目方钱包),查看该地址的代币余额;

- 数量范围筛选:设置最小/最大持有数量,定位小额或大额持有者;
- 实时更新:数据实时同步链上状态,确保准确性。
优缺点分析
- 优点:操作简单,无需技术背景,数据直观,支持快速导出;
- 缺点:单次查询数据量有限(通常每页最多200条),大规模持有者查询需手动分页,效率较低。
使用专业数据API:适合开发者与批量查询
对于需要频繁查询、批量获取数据或集成到应用中的用户,专业数据API是更高效的选择,这些API由区块链数据服务商提供,封装了复杂的链上交互逻辑,支持通过简单调用获取结构化数据。
常用数据服务商
- Infura(https://infura.io):以太坊官方节点服务商,提供API和SDK,支持查询代币持有者、余额等;
- Alchemy(https://www.alchemy.com):高性能区块链基础设施,提供丰富的API和开发者工具;
- Moralis(https://moralis.io):专注于Web3数据,支持ERC20代币持有者、NFT等多维度查询;
- BNB Chain API(https://binance.org):虽然主打币安链,但也支持以太坊ERC20数据查询。
以Moralis API为例:查询代币持有者
(1)注册并获取API Key
访问Moralis官网,注册账号后进入“Dashboard”,创建新应用即可获取API Key(免费版有一定调用次数限制)。
(2)调用API接口
Moralis提供了getTokenOwners接口,专门用于查询ERC20代币持有者,以下是以Python为例的代码实现:
import requests
import json
# 配置API Key和代币合约地址
API_KEY = "your_moralis_api_key"
CONTRACT_ADDRESS = "0xdAC17F958D2ee523a2206206994597C13D831ec7" # USDT合约地址
CHAIN = "eth" # 以太坊链
# 构建请求URL
url = f"https://deep-index.moralis.io/api/v2.2/erc20/{CONTRACT_ADDRESS}/owners"
# 设置请求头
headers = {
"Accept": "application/json",
"X-API-Key": API_KEY,
}
# 可选参数:分页、排序等
params = {
"chain": CHAIN,
"limit": 100, # 每页返回100条
"offset": 0, # 起始偏移量
}
# 发送GET请求
response = requests.get(url, headers=headers, params=params)
data = response.json()
# 解析结果
if "result" in data:
for owner in data["result"]:
address = owner["owner_of"]
balance = owner["balance"] # 余额为原始数值,需除以代币精度(如USDT精度为18)
print(f"地址: {address}, 余额: {float(balance) / 1e18:.2f} USDT")
else:
print("查询失败:", data.get("error", "未知错误"))
(3)关键参数说明
limit:每页返回结果数量(默认100,最大1000);offset:分页偏移量,用于获取下一页数据(如第一页offset=0,第二页offset=100);chain:链标识(如eth为以太坊,bsc为币安链);to_block:可选参数,指定查询的区块高度(如需历史数据)。
优缺点分析
- 优点:支持批量查询、数据结构化、可集成到应用中,适合开发者;
- 缺点:免费版有调用次数限制,高级功能需付费,需处理API密钥安全问题。
通过以太坊节点直接查询:适合技术深度用户
对于需要完全自主控制数据、避免依赖第三方服务的用户,可以通过搭建以太坊节点,直接调用智能合约的balanceOf方法查询持有者余额,这种方法技术门槛较高,但数据最实时、最可控。
搭建以太坊节点
(1)选择节点客户端
- Geth:最常用的以太坊节点客户端,支持全节点和归档节点(归档节点存储所有历史数据,适合查询早期持有者);
- Nethermind:高性能客户端,支持.NET环境;
- Besu:由ConsenSys开发,支持Java和企业级应用。
(2)同步节点数据
以Geth为例,执行以下命令启动全节点(首次同步需下载大量数据,建议使用SSD硬盘):
geth --syncmode full --http --http.addr 0.0.0.0 --http.port 8545
--syncmode full:同步所有区块数据(归档节点需--gcmode archive);--http:开启HTTP API,方便其他工具调用;--http.addr和--http.port:设置HTTP服务地址和端口(默认8545)。
调用智能合约查询持有者
ERC20代币的持有者余额通过balanceOf(address)方法查询,该方法返回指定地址的代币余额(原始数值,需除以代币精度)。
(1)使用Web3.py(Python库)
from web3 import Web3
# 连接到本地以太坊节点
w3 = Web3(Web3.HTTPProvider("http://127.0.0.1:8545"))
# 代币合约ABI(balanceOf方法的部分)
abi = "[{'constant':True,'inputs