目录导读
- 为什么需要掌握Dune Analytics的SQL查询?
- 基础回顾:Dune Analytics的数据结构
- 核心实战:从零编写你的第一条链上SQL查询
- 高级技巧:聚合、时间序列与跨合约查询
- 常见问题与优化建议
- 问答环节:解决你实际使用中的疑惑
在加密货币领域,如果你只是盯着K线图做交易,那可能错过了链上数据这座“金矿”,尤其是当你打开欧易交易所官网进行交易决策时,你会发现,真正懂行的交易者,往往在Dune Analytics上跑着自定义的SQL查询,今天这篇进阶教程,就是要带你从“看别人做的图表”升级到“自己写查询挖数据”,如果你还没用过链上分析工具,不妨先去欧易交易所下载个钱包,然后跟着我一步步操作。

为什么需要掌握Dune Analytics的SQL查询?
很多人觉得SQL是程序员才学的东西,但事实上,在Web3世界里,SQL正在成为新一代“交易员必备技能”,想象一下:你想知道某个新代币的真实持仓分布、巨鲸的买卖规律、或者某个DeFi协议的资金流入流出情况——这些数据,Dune都能给你,但前提是你会写查询。
关键点: Dune Analytics并不是一个简单的“点一下就有结果”的工具,它提供了原始区块链数据的PostgreSQL数据库,你需要通过SQL查询来提取、过滤、聚合数据,如果你只会用现成的看板,你看到的信息永远是别人想让你看到的,只有自己写SQL,才能真正挖掘出属于你的Alpha。
基础回顾:Dune Analytics的数据结构
在写查询之前,你得先理解Dune是怎么组织数据的,Dune把链上活动抽象成几张核心表:
- ethereum.transactions:所有以太坊交易记录,包含from、to、value、data等字段。
- ethereum.logs:事件日志,记录了智能合约触发的各种事件。
- erc20.tokens:ERC-20代币的元数据。
- erc20.transfers:代币转账记录。
举个例子: 如果你想查某个地址的ETH转账记录,你就要去查ethereum.transactions表,如果你想查某个代币的转账记录,那就去查erc20.transfers表。
进阶提示: 不只是以太坊,Polygon、BSC、Arbitrum等链的数据同样可查,在表名前加上链的前缀即可,比如polygon.transactions。
核心实战:从零编写你的第一条链上SQL查询
假设你想知道:过去24小时内,某个热门DeFi协议(比如Uniswap V3)的资金流入情况,我们先从最简单的查询开始。
第一步:查询实时交易数据
SELECT block_time, hash, from, to, value / 1e18 AS eth_value FROM ethereum.transactions WHERE to = '0x1f98431c8ad98523631ae4a59f267346ea31f984' -- 假设这是某协议合约地址 AND block_time >= NOW() - INTERVAL '24 hours' ORDER BY block_time DESC LIMIT 100;
这段查询会返回该地址过去24小时内接收到的所有转账记录,注意,我用了value / 1e18来把wei转换成ETH,这样看起来更直观。
第二步:统计总量
如果你只想看总流入,那就加一个SUM聚合:
SELECT SUM(value / 1e18) AS total_eth_inflow FROM ethereum.transactions WHERE to = '0x1f98431c8ad98523631ae4a59f267346ea31f984' AND block_time >= NOW() - INTERVAL '24 hours';
第三步:分组查看每小时流入
SELECT
DATE_TRUNC('hour', block_time) AS hour,
SUM(value / 1e18) AS inflow_per_hour
FROM ethereum.transactions
WHERE to = '0x1f98431c8ad98523631ae4a59f267346ea31f984'
AND block_time >= NOW() - INTERVAL '24 hours'
GROUP BY 1
ORDER BY 1;
这个查询会给你一个折线图的数据基础——每小时流入多少ETH,如果你把这个查询保存成Dune看板,每天都能自动更新。
小技巧: Dune支持NOW()这种动态时间函数,所以你的查询会自动随着时间推移而更新。
高级技巧:聚合、时间序列与跨合约查询
真正的链上分析高手,不会只查一个合约,他们更关心的是“某个代币的整个交易生态”。
跨合约查询——追踪代币流向
假设你想查某个代币(比如USDC)从某个地址流出的去向,你需要用到erc20.transfers表:
SELECT to_address AS recipient, SUM(value / 1e6) AS total_usdc_received FROM erc20.transfers WHERE from_address = '0x你的地址' AND contract_address = '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48' -- USDC合约 AND block_time >= NOW() - INTERVAL '30 days' GROUP BY 1 ORDER BY 2 DESC LIMIT 10;
这个查询会列出过去30天,你地址的USDC都转给了谁,按接收量从大到小排序。
时间序列——发现异常交易模式
你可以用DATE_TRUNC生成每日数据,然后计算环比变化:
WITH daily_data AS (
SELECT
DATE_TRUNC('day', block_time) AS day,
COUNT(*) AS tx_count,
SUM(value / 1e18) AS volume
FROM ethereum.transactions
WHERE to = '0x你的目标合约'
AND block_time >= NOW() - INTERVAL '90 days'
GROUP BY 1
)
SELECT
day,
tx_count,
volume,
(volume - LAG(volume, 7) OVER (ORDER BY day)) / LAG(volume, 7) OVER (ORDER BY day) AS woW_change
FROM daily_data
ORDER BY 1;
这里面用了窗口函数LAG来计算周环比,如果你看到一个突然的爆发,那可能就是交易机会。
链上+链下数据结合
Dune的自定义数据集功能允许你上传CSV或者API数据,然后跟链上数据做JOIN,你可以把某个代币的社区活跃度数据导入,然后跟链上转账数据做对比。
常见问题与优化建议
-
查询超时怎么办?
Dune免费版有查询时间限制,建议尽量缩小时间范围,或者使用WHERE条件先过滤掉大部分数据。 -
如何找到合约地址?
可以在Etherscan上搜索项目名称,或者在Dune的“排行榜”里找热门项目的地址。 -
不会写SQL怎么办?
先从Dune的官方看板“Fork”开始,点击右上角的“Edit”按钮,看别人是怎么写查询的,然后改改参数试试。
问答环节
Q1:我是在欧易交易所官网做交易,这些链上数据能帮我什么?
A1:链上数据能帮你判断市场情绪,比如某个代币的“巨鲸持仓量”突然下降,可能意味着大户在出货,你可以提前做好准备,你可以通过Dune监控某个新代币的早期持币分布,看是否有“老鼠仓”嫌疑。
Q2:我不会SQL,有没有新手友好的方式?
A2:Dune有个“可视化查询”功能,其实就是帮你把SQL封装成拖拽式操作,但你如果想深入分析,建议还是学点基础SQL,不过别担心,网上有很多免费教程,花一两个小时就能上手。
Q3:我写完查询之后,怎么把它分享给别人?
A3:点击“Save”之后,Dune会生成一个唯一链接,你可以把这个链接直接分享给你的朋友,或者嵌入到自己的博客里。
Q4:Dune的数据更新延迟高吗?
A4:通常延迟在几分钟到十几分钟之间,按照目前区块链的确认速度来说,这个延迟是可以接受的,如果你需要实时数据,那可能需要搭配Web3 API使用。
最后的建议
链上数据分析不是一蹴而就的技能,建议你先从自己感兴趣的项目入手,比如你经常在欧易交易所下载后玩的某个DeFi协议,去Dune上搜搜有没有现成的看板,Fork”下来研究别人的查询逻辑,等你写个二三十条查询,基本就能掌握核心技巧了。
数据就在那里,挖不挖得到金子,就看你的SQL写得好不好了,现在就去Dune上跑一条查询试试吧,说不定你就能发现别人没注意到的市场信号。
标签: 欧易 Dune Analytics