十分钟上手:查询以太坊ERC-20转账数据的GraphQL指南

·

不论是加密研究员、交易机器人开发者,还是链上安全审计师,通常都绕不开「ERC-20转账查询」这道关卡。本文用最简洁的代码示例与场景故事,带你用GraphQL接口一步步抓取、订阅与解析链上的USDT、WETH 等热门代币的实时流转;并教你如何筛选「某地址的收/付款记录」「大额交易排行」等高频需求。所有案例均可直接复制运行,拿到数据分分钟。


ERC-20转账到底是什么

一句话解释:在以太坊上,只要符合 ERC-20 标准的代币(USDT、USDC、DAI、WETH……),每一笔链上移动都可以被看作 ERC-20 转账。字段大致包括:转账金额、代币名、代币符号、发送方、接收方、交易哈希、区块时间等。


准备工作:使用实时数据

  1. 打开浏览器,进入任意 GraphQL 在线 IDE(下文给出的蓝色链接已预填好查询)。
  2. 想查哪个网络,就把 network: eth 换成 bscpolygon 等。
  3. 不用装本地节点,请求会直接落到 实时链上数据

场景一:抓最近 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
      }
    }
  }
}

👉 立即可在线体验这份 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
      }
    }
  }
}

场景三:查某地址的「出/入金」记录

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 }
      }
    }
  }
}

场景四:快速找出「与给定地址交互过的所有地址」

用数组过滤 + 交集函数 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"
  ]
}

场景五:查询「某币当日最大 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转账查询」需求都可直接套壳上线。快把代码搬进你的项目里,让区块链数据真正为你所用。