3、链上数据获取工具:学会使用API、SQL查询、数据平台(Dune Analytics、The Graph、Glassnode)获取原始交易数据

链上资金流向分析的第一步,也是最关键的一步,是高效、准确地获取原始交易数据。链上数据具有公开、透明、不可篡改的特性,但原始数据体量庞大且结构复杂,直接解析区块数据对普通分析师而言门槛极高。本章将系统讲解三类主流数据获取工具——API、SQL查询平台(以Dune Analytics为代表)以及专业数据服务商(The Graph、Glassnode),帮助你建立从“数据获取”到“字段理解”再到“初步清洗”的完整能力闭环。

链上数据获取工具全景图 数据源层 以太坊节点 (Geth/Nethermind) Solana 节点 (QuickNode) BSC/Arbitrum 节点 索引器/归档节点 工具层 REST/JSON-RPC API Infura / Alchemy / QuickNode eth_getLogs / eth_getBalance SQL 查询平台 Dune Analytics / Flipside ethereum.transactions / traces 专业数据平台 The Graph (GraphQL) Glassnode (指标API) 输出层 原始交易记录 from/to/value/gas 内部交易/事件日志 Transfer/Approval/Swap 地址标签/实体聚类 交易所/巨鲸/基金 衍生指标 净流入/换手率/活跃度

3.1 核心原理:从区块到分析就绪数据的四层架构

理解链上数据获取的本质,需要先建立“四层架构”的认知模型。第一层是节点层,即运行中的区块链客户端,它们维护着完整的账本状态,通过JSON-RPC接口对外提供最原始的区块、交易、收据数据。第二层是索引层,由于直接解析区块数据需要处理RLP编码、Merkle Patricia树等底层细节,索引层将这些原始数据解析为结构化的关系型数据表,Dune Analytics和The Graph的核心价值正在于此。第三层是指标层,Glassnode等平台在结构化数据之上进一步加工,生成“交易所净流入”、“MVRV”等衍生指标。第四层是应用层,即你最终使用的查询界面或API接口。

对于资金流向分析而言,最核心的原始数据字段包括:交易哈希(hash)、发送方(from)、接收方(to)、转账金额(value,以Wei为单位)、交易手续费(gasUsed × gasPrice)、区块时间戳(block_timestamp)以及事件日志(logs)。其中,事件日志中的Transfer事件(ERC-20标准)是追踪代币流动的关键,它记录了代币合约地址、发送方、接收方和代币数量。理解这些字段的语义和精度(例如,以太坊原生ETH的value字段精度为18位小数,而USDT的精度为6位)是避免分析错误的前提。

3.2 操作流程:三种工具的实际使用路径

根据分析场景的不同,选择合适的数据获取工具至关重要。以下从操作路径、适用场景和代码示例三个维度展开。

3.2.1 使用REST API直接获取原始数据

当你需要获取特定地址的余额、某笔交易的详情或某个合约的日志时,直接调用节点API是最快的方式。以Alchemy为例,其增强版API提供了alchemy_getAssetTransfers接口,可以一次性获取某个地址的历史转账记录,避免了逐区块扫描的低效。

// 使用curl调用Alchemy API获取地址的ERC-20转账记录
curl -X POST "https://eth-mainnet.g.alchemy.com/v2/YOUR_" \
  -H "Content-Type: application/json" \
  -d '{
    "jsonrpc": "2.0",
    "method": "alchemy_getAssetTransfers",
    "params": [
      {
        "fromBlock": "0x0",
        "toBlock": "latest",
        "fromAddress": "0x28c6c06298d514db089934071355e5743bf21d60",
        "category": ["erc20"],
        "withMetadata": true,
        "maxCount": "0x3e8"
      }
    ],
    "id": 1
  }'

此接口返回的rawContract.value字段是原始数值,需要根据代币精度进行换算。例如,如果返回的value为0x2386f26fc10000(十进制10000000000000000),且该代币精度为18,则实际金额为0.01个代币。使用API时需注意速率限制(通常为每秒几次到几十次),对于批量获取需求,建议使用异步并发控制。

3.2.2 使用Dune Analytics进行SQL查询

Dune Analytics将链上数据同步到PostgreSQL数据库中,提供了ethereum.transactions、ethereum.traces、tokens.erc20_transfers等核心表。对于资金流向分析,最常用的查询是追踪某个地址的转入转出记录,并关联时间维度进行聚合。

-- 查询某地址近7天的ETH净流入量(单位:ETH)
SELECT 
  DATE_TRUNC('day', block_time) AS day,
  SUM(CASE WHEN to = 0x28c6c06298d514db089934071355e5743bf21d60 THEN value/1e18 
      ELSE -value/1e18 END) AS net_flow
FROM ethereum.transactions
WHERE (from = 0x28c6c06298d514db089934071355e5743bf21d60 
    OR to = 0x28c6c06298d514db089934071355e5743bf21d60)
  AND block_time >= NOW() - INTERVAL '7 days'
  AND success = true
GROUP BY 1
ORDER BY 1;

Dune的traces表包含了内部交易(如合约调用中的ETH转账),这对于追踪通过合约路由的资金流至关重要。例如,当用户通过Uniswap兑换代币时,transactions表只显示用户与Uniswap Router的交互,而实际收到代币的地址记录在traces表中。因此,完整的资金流向分析必须同时查询两张表。

3.2.3 使用The Graph和Glassnode获取结构化数据

The Graph采用GraphQL查询语言,适合获取特定协议(如Uniswap、Aave)的内部状态数据。例如,查询某个池子的所有Swap事件,可以精确到每次兑换的tokenIn和tokenOut数量。Glassnode则提供了更宏观的链上指标,其API返回的是已经计算好的时间序列数据,如“交易所ETH余额”、“SOPR”等,适合快速了解市场整体情绪。

// The Graph GraphQL查询示例:获取Uniswap V3池子的最近10次Swap
{
  swaps(first: 10, orderBy: timestamp, orderDirection: desc, 
        where: { pool: "0x88e6a0c2ddd26feeb64f039a2c41296fcb3f5640" }) {
    sender
    recipient
    amount0
    amount1
    timestamp
  }
}

3.3 案例拆解:追踪一笔跨合约的复杂资金流

假设我们需要分析一笔从交易所提现到某地址,再通过DEX兑换为稳定币,最终转入借贷协议的全过程。初始现象是:在Dune上查询该地址的transactions表,只看到两笔交易——从交易所提现ETH,以及调用Uniswap Router的swapExactETHForTokens。但目标地址(借贷协议)并没有出现在to字段中。

分析判断过程:资金流在Uniswap Router内部发生了分裂——一部分ETH兑换为USDC,另一部分作为手续费被扣除。实际转入借贷协议的USDC记录在traces表的内部交易中。关键输入数据是Router合约的地址(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D),我们需要查询该交易的哈希,然后追踪其所有内部调用。

实际操作步骤:首先,在Dune中查询该交易的traces记录,过滤条件为tx_hash = '0x...'。然后,筛选出call_type = 'call'且to地址为借贷协议合约的记录。最后,将value字段除以1e6(USDC精度)得到实际金额。结果对比显示,通过traces表捕获的资金流比仅看transactions表多出约30%的关联交易。

风险与代价:追踪内部交易会显著增加查询复杂度,且traces表数据量巨大(每笔交易可能产生多条trace),查询时需注意设置合理的区块范围或时间范围,避免超时。复盘经验是:对于涉及DEX、跨链桥或复杂合约的资金流分析,务必同时使用transactions和traces表,并建立“交易哈希→内部调用链”的关联分析流程。

3.4 常见误区与总结复盘

误区 后果 正确做法
忽略代币精度,直接使用value字段 金额计算错误,偏差可达10^18倍 查询代币合约的decimals()方法,或使用Dune的tokens.erc20_transfers表(已自动换算)
只查transactions表,不查traces表 遗漏合约内部转账,资金流不完整 对涉及合约交互的交易,同时查询traces表
使用API时未处理分页和速率限制 数据缺失或IP被封禁 使用游标分页,控制请求频率,必要时使用批量接口
将Glassnode指标直接用于地址级分析 指标粒度太粗,无法定位具体地址 Glassnode适合宏观分析,地址级分析应使用API或Dune

实战经验总结:建立“三层验证”机制——第一层,使用API获取的原始数据与区块浏览器(如Etherscan)进行抽样比对;第二层,在Dune中编写SQL时,先使用LIMIT 10验证字段含义;第三层,对于关键分析结论,使用The Graph的协议级数据交叉验证。这种多工具交叉验证的习惯,能有效避免因单一数据源错误导致的误判。

风险提示:链上数据是“不可篡改”的,但数据解析和索引过程可能存在延迟或错误。特别是对于分叉链、测试网或非常规交易(如自毁合约、复杂CREATE2部署),不同数据平台的处理方式可能不同。在正式分析前,务必确认数据源的同步区块高度,并关注平台的状态页面。

掌握API、SQL查询和数据平台三种工具,是链上资金流向分析的基础功。API适合精确获取单点数据,Dune适合批量分析和自定义SQL查询,The Graph适合协议内部状态追踪,Glassnode则提供宏观视角。实际工作中,应根据分析目标灵活组合使用。下一阶段,我们将深入探讨如何清洗和标准化这些原始数据,为后续的资金流向建模打下基础。