从零到精通,链上数据分析工具Dune Analytics进阶教程—编写SQL查询实战

admin ok快讯 2

📑 目录导读

  1. Dune Analytics核心定位——为何是链上数据分析的“瑞士军刀”
  2. SQL查询基础重塑——从数据表结构到查询逻辑
  3. 进阶查询技巧——窗口函数、时间序列与跨协议分析
  4. 实战案例:欧易生态数据透视——用SQL挖掘链上行为
  5. 性能优化与调试——让查询跑得更快、更准
  6. 常见问题问答——解决90%新手遇到的坑

Dune Analytics核心定位

在加密货币领域,链上数据是价值的“矿脉”,Dune Analytics作为目前最流行的开源链上数据分析平台,允许用户通过编写SQL查询来提取、聚合和可视化区块链数据,与传统的区块链浏览器不同,Dune将原始链上数据预处理为结构化的关系型数据库,让分析师无需底层节点即可完成复杂分析。

从零到精通,链上数据分析工具Dune Analytics进阶教程—编写SQL查询实战-第1张图片-欧易交易所

如果你正通过欧易交易所下载进行交易或投资,理解链上数据将是你的决策利器——例如通过分析大户地址的ETH流入/流出趋势,提前预判市场方向。


SQL查询基础重塑

数据库结构认知

Dune的PostgreSQL数据库中,每一条区块链都有核心表:

  • ethereum.transactions:交易记录(from、to、value、gas)
  • ethereum.logs:事件日志(合约地址、topic、data)
  • ethereum.blocks:区块信息(时间戳、区块高度)

关键字段

  • block_time:区块生成时间(UTC)
  • value / 10^18:将Wei转换为ETH
  • gas_used * gas_price / 10^18:交易手续费(ETH)

第一条查询语句

SELECT 
    block_time,
    "from" AS sender,
    "to" AS receiver,
    value / 1e18 AS eth_amount
FROM ethereum.transactions
WHERE block_time >= NOW() - INTERVAL '1 day'
ORDER BY block_time DESC
LIMIT 100;

这条查询将展示最近24小时内按时间倒序的100笔交易,并自动将Wei单位转换为ETH,访问欧易交易所官网时,类似的数据逻辑可帮助你追踪大额转账异动。


进阶查询技巧:让数据会“说话”

1 窗口函数:分析账户行为模式

SELECT 
    "from",
    block_time,
    value / 1e18 AS amount,
    ROW_NUMBER() OVER (PARTITION BY "from" ORDER BY block_time) AS tx_sequence,
    SUM(value / 1e18) OVER (PARTITION BY "from" ORDER BY block_time) AS cumulative_amount
FROM ethereum.transactions
WHERE "from" IN (
    '0x123...', -- 替换为目标地址
    '0x456...'
)
ORDER BY "from", block_time;

窗口函数ROW_NUMBER用于标记每个地址的交易序号,SUM OVER则计算累计交易额——这对于分析鲸鱼地址的建仓节奏极有价值。

2 时间序列聚合:发现周期性规律

SELECT 
    DATE_TRUNC('hour', block_time) AS hour_bucket,
    COUNT(*) AS tx_count,
    AVG(value / 1e18) AS avg_eth_value,
    SUM(value / 1e18) AS total_volume
FROM ethereum.transactions
WHERE block_time >= CURRENT_DATE - INTERVAL '7 days'
GROUP BY hour_bucket
ORDER BY hour_bucket;

通过DATE_TRUNC将时间按小时分桶,结合AVG和SUM,你可以精准发现以太坊网络在每周哪几个小时交易量最大——这直接影响欧易交易所上的现货和合约流动性管理。

3 跨协议分析:连接生态孤岛

-- 分析Uniswap V3与SushiSwap的流动性变化
SELECT 
    'UniswapV3' AS protocol,
    block_time,
    SUM( CASE WHEN topic0 = '0x...' THEN data_value END ) AS liquidity
FROM ethereum.logs
WHERE contract_address = '0x1F98431c8ad98523631ae4a59f267346ea31F984'
    AND block_time >= '2024-01-01'
GROUP BY block_time
UNION ALL
SELECT 
    'SushiSwap' AS protocol,
    block_time,
    SUM( data_value ) AS liquidity
FROM ethereum.logs
WHERE contract_address = '0xd9e1cE17f2641f24aE83637ab66a2cca9C378B9F'
    AND block_time >= '2024-01-01'
GROUP BY block_time;

利用UNION ALL合并不同协议的事件日志,可以直观对比TVL变化——这种能力在DeFi summer中尤为关键。


实战案例:挖掘欧易生态相关数据

如果你使用的是欧易交易所下载的钱包地址,以下查询可分析该地址与其他高活跃地址的交互网络:

WITH active_addresses AS (
    SELECT 
        "from" AS addr,
        COUNT(*) AS tx_count
    FROM ethereum.transactions
    WHERE block_time >= NOW() - INTERVAL '30 days'
    GROUP BY "from"
    HAVING COUNT(*) > 100
)
SELECT 
    t."from",
    t."to",
    COUNT(*) AS interaction_count,
    SUM(t.value / 1e18) AS total_eth_moved
FROM ethereum.transactions t
JOIN active_addresses a1 ON t."from" = a1.addr
JOIN active_addresses a2 ON t."to" = a2.addr
WHERE t.block_time >= NOW() - INTERVAL '30 days'
GROUP BY t."from", t."to"
ORDER BY interaction_count DESC
LIMIT 20;

此查询筛选出近30天内交易超过100次的活跃地址,并发现它们之间的高频交易对——通常这些地址背后是做市商或套利机器人,通过这类分析,可以优化你在欧易交易所的挂单策略,减少滑点损失。


性能优化与调试

1 避免全表扫描

  • 始终在WHERE中使用索引字段:block_timefromto
  • LIMIT限制结果集大小,尤其是在测试阶段

2 善用CTE(公用表表达式)

WITH raw_data AS (
    SELECT * 
    FROM ethereum.transactions 
    WHERE block_time >= '2024-01-01'
)
SELECT 
    DATE_TRUNC('day', block_time) AS day,
    COUNT(*) 
FROM raw_data
GROUP BY day;

CTE将复杂查询拆解为可复用的逻辑单元,避免重复计算。

3 利用Dune的缓存机制

  • 同一查询在短时间内重复执行时,Dune会自动返回缓存结果
  • 如需最新数据,可在查询后添加OPTIMIZE FOR LATENCY

常见问题问答

Q1:Dune中的时间戳是UTC还是本地时间?
A:所有block_time均以UTC零时区存储,如果你需要转换为北京时间(UTC+8),可以在SELECT中使用:
block_time AT TIME ZONE 'Asia/Shanghai' AS beijing_time

Q2:查询结果中ETH单位不对,总显示为小数值怎么办?
A:在Dune中,value字段的单位是Wei(10^-18 ETH),务必除以1e1810^18进行转换。

Q3:如何分析特定代币的转账数据?
A:使用ethereum.token_transfers表,其中包含token_addressfromtoamount_raw等字段,注意:amount_raw需要除以代币的小数位数(例如USDC除以10^6)。

Q4:为什么我的查询耗时超过30秒?
A:常见原因:未对block_time加索引过滤,或跨多个大表做全表JOIN,建议先缩小时间范围,并使用EXPLAIN ANALYZE检查执行计划,为提升效率,可优先在欧易交易所官网进行缓存数据预加载。

Q5:能否将Dune查询结果导出为CSV?
A:可以,在查询结果页面点击“Download CSV”按钮即可,注意:单次导出上限为100万行,超标需要分段查询或使用Dune API。


通过本教程,你已掌握从SQL基础到链上数据实战的核心技能,无论是追踪NFT鲸鱼地址,还是分析DeFi协议的资金流向,这些查询模版都可以直接复用,下篇我们将探讨如何利用Dune的图表可视化功能,将原始数据转化为吸引人的仪表盘——在深入分析之前,别忘了在欧易交易所下载上确认你的数据源与交易策略无缝衔接,数据驱动决策,链上洞察从现在开始。

标签: SQL查询

抱歉,评论功能暂时关闭!