不论是加密研究员、交易机器人开发者,还是链上安全审计师,通常都绕不开「ERC-20转账查询」这道关卡。本文用最简洁的代码示例与场景故事,带你用GraphQL接口一步步抓取、订阅与解析链上的USDT、WETH 等热门代币的实时流转;并教你如何筛选「某地址的收/付款记录」「大额交易排行」等高频需求。所有案例均可直接复制运行,拿到数据分分钟。
ERC-20转账到底是什么
一句话解释:在以太坊上,只要符合 ERC-20 标准的代币(USDT、USDC、DAI、WETH……),每一笔链上移动都可以被看作 ERC-20 转账。字段大致包括:转账金额、代币名、代币符号、发送方、接收方、交易哈希、区块时间等。
准备工作:使用实时数据
- 打开浏览器,进入任意 GraphQL 在线 IDE(下文给出的蓝色链接已预填好查询)。
- 想查哪个网络,就把
network: eth换成bsc、polygon等。 - 不用装本地节点,请求会直接落到 实时链上数据。
场景一:抓最近 10 笔 USDT 转账
{
EVM(dataset: realtime, network: eth) {
Transfers(
where: {
Transfer: {
Currency: {
SmartContract: { is: "0xdac17f958d2ee523a2206206994597c13d831ec7" }
}
}
}
limit: { count: 10 }
orderBy: { descending: Block_Time }
) {
Transfer {
Amount
Currency { Name Symbol }
Sender
Receiver
Type
}
}
}
}- 关键词:ERC-20 代币、实时数据、USDT 查询;
- 查询亮点:只要换个合约地址,就能秒查别的币。
场景二:WebSocket 订阅最新 WETH 转账
当你需要用交易机器人捕捉第一时间的大额转账,就用「GraphQL 订阅」保持长连接。
subscription {
EVM(network: eth, trigger_on: head) {
Transfers(
where: {
Transfer: {
Currency: {
SmartContract: { is: "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2" }
}
}
}
orderBy: { descending: Block_Time }
) {
Transaction { Hash }
Transfer {
Amount
Currency { Name Symbol }
Receiver
Sender
Type
}
}
}
}- 关键词:WebSocket、实时订阅、区块链数据;
- 业务场景:量化策略捕获鲸鱼转账、NFT 抢跑监听等。
场景三:查某地址的「出/入金」记录
把 OR逻辑 用 any 包围,即可一次拿到「既当过收款方也当过付款方」的全部转账。
query {
EVM(dataset: combined, network: eth) {
Transfers(
where: {
any: [
{ Transfer: { Sender: { is: "0x881d40237659c251811cec9c364ef91dc08d300c" } } },
{ Transfer: { Receiver: { is: "0x881d40237659c251811cec9c364ef91dc08d300c" } } }
]
}
limit: { count: 100 }
) {
Transfer {
Amount
Sender
Receiver
Currency { Symbol Name }
}
}
}
}- 关键词:地址追踪、资金流向、OR 条件查询;
- 数据注解:每笔转账都附带代币符号,可瞬间识别是 USDC 还是 SHIB。
场景四:快速找出「与给定地址交互过的所有地址」
用数组过滤 + 交集函数 array_intersect,可以一次性拉出「这些地址把钱打给了谁,又收了谁的钱」。
query ($addresses: [String!]) {
EVM(dataset: archive) {
Transfers(
where: {
any: [
{ Transfer: { Sender: { in: $addresses } } },
{ Transfer: { Receiver: { in: $addresses } } }
],
Block: { Date: { after: "2024-04-01" } }
}
) {
array_intersect(
side1: Transfer_Sender
side2: Transfer_Receiver
intersectWith: $addresses
)
}
}
}
# 变量示例
{
"addresses": [
"0x21743a2efb926033f8c6e0c3554b13a0c669f63f",
"0x107f308d85d5481f5b729cfb1710532500e40217"
]
}- 关键词:地址交集、资金网络、链上关系图谱;
- 实战应用:DeFi 协议常用此法做风控白名单、社交推荐算法也用它挖掘潜在合作方。
场景五:查询「某币当日最大 10 笔转账」
做大额监控?把排序改成 Transfer_Amount 降序即可。
query {
EVM {
Transfers(
where: {
Transfer: {
Currency: {
SmartContract: { is: "0xB8c77482e45F1F44dE1745F52C74426C631bDD52" }
}
},
TransactionStatus: { Success: true }
}
orderBy: { descending: Transfer_Amount }
limit: { count: 10 }
) {
Transfer {
Amount
AmountInUSD
Currency { Name Symbol SmartContract }
}
}
}
}常见问题 FAQ
Q1:拿到 Amount 字段有时带 18 个 0,怎么转成正常人能看懂的数量?
A:每种 ERC-20 都有 decimals(精度)字段,比如 USDT 为 6, WETH 为 18。把 Amount 除以 10^decimals 即可得到真实数量。
Q2:查询频率有限制吗?
A:实时接口通常按 IP 或 API Key 维度做限流。批量需求可申请更高配额,或下载历史归档文件。
Q3:USDT 与各个网络的合约地址记不住怎么办?
A:打开任何浏览器 token + explorer + 网络 搜索即可;主流浏览器(Etherscan、BscScan 等)首页都有置顶合约入口。
Q4:如何同时监控多个代币的转账?
A:把 SmartContract:{is:"address"} 换成 in:[address1,address2,…] 即可一次性做多币 listen。
Q5:GraphQL 响应有时过大,如何只取关键字段?
A:在查询里删掉不用的子字段,GraphQL 的“按需取数”天生可避免冗余数据。
Q6:结语里能不能放一些进阶姿势?
A:下一篇我们会讲如何把实时转账喂给 Kafka,再用 Flink 做窗口分析,构建完整的链上风控系统。
有了上面的五连示例,日常开发 90% 的「ERC-20转账查询」需求都可直接套壳上线。快把代码搬进你的项目里,让区块链数据真正为你所用。