✨ Dune Analytics零基础极简入门指南

Dune Analytics¹ 号称“平民版 Nansen”、“链上数据分析师神器”,为各路大神所追捧。

然神器在手,奈何找不到适合新手小白的说明书,我等只得望洋兴叹否?

非也!

本文作为一篇入门级的极简教程,适合 Dune 的零基础小白用户,与大家一起掀开 Dune 女神的面纱。

何谓 Dune?

Dune 作为一款链上数据研究分析的强大工具,经过4轮融资,目前估值已达10亿美元²。

用户通过类SQL的数据库查询语言,从 Dune 缓存的区块链数据仓库中检索、筛选、提取、聚合,形成一个个 Query,再对查询到的数据进行可视化,最终汇总而成一个个 Dashboard 面板。

何谓数据仓库?

区块链本质上是一个去中心化的账本,所有过往的交易转账、合约调用形成了一条条的交易记录明细,包含交易时间、转入、转出地址、交易金额、调用信息、合约事件、tx_hash 等数据。

Dune 将以上所有数据分门别类进行存储形成数据仓库,供有需要的人通过类SQL语言来调用、查询、分析(可谓功德无量)。

何谓 SQL?

SQL 即“结构化查询语言”,专用于数据库相关的查询、管理。

在 Dune 中,我们用 SQL³ 查询语句来获取所有想要的数据,构建成对应的 “Query”。

SQL 语言
SQL 语言

何谓数据表?

每一个数据表(table)⁴ 可以视作一个超大的 Excel 表格,按顺序记录了所有与之相关的数据。

Dune 提供了很多内置的知名协议专属的 "数据表dataset"。 注册登陆你的 Dune 账户,点击顶部的 "New Query" 即可打开如下页面: 左侧即为内置数据表,右侧是“查询语句”和“查询结果”

Dune New Query 页面
Dune New Query 页面

常用数据表

除了内置的数据表外,还有些常用的数据表,比如: 最常用的 ethereum.transactions,可以查询所有的以太坊链上交易信息,包括了普通转账和合约调用等信息。

Dune 常用数据表
Dune 常用数据表

数据表里有什么?

不同数据表,提供的内容各有迥异。

"ethereum.transactions" 为例,表内提供了:

  • block_time 区块时间
  • from 发起地址
  • to 转入地址(或调用的合约地址)
  • value 转账金额,
  • data 附加数据(合约调用的input data)

等诸多数据

transactions 数据表
transactions 数据表

SQL 查询语句怎么写?

基本的 SQL 查询语句: SELECT * FROM X

  • select: 取什么数据
  • from: 从哪里取数据
  • where: 限制条件是什么
  • order by: 根据什么排序
  • limit: 限制取回的数据条数
SQL 查询语句
SQL 查询语句

你的第一条 Dune 查询语句

打开 Dune 的 "New Query",粘贴以下语句

👉 select * from ethereum.transactions limit 5

点击 "Run" 稍等即可在"Query Results"看到查询结果

语句中的 * 代表查询所有字段,limit 5 是为了限制数据取回的数量,如果不加这条限制,你就是在告诉 Dune 要取回以太坊链上的所有交易数据(耗时超长且无必要)

首条 Dune 查询语句
首条 Dune 查询语句

更复杂的查询语句

现在让我们来试试更复杂(也更有趣)的 Dune 查询语句:查询 V神钱包 的链上交易信息

这次我们新增了 where "from" 限制条件,只筛选“V神”的钱包地址,order by 语句限定排序条件,desc 表降序

select *
from ethereum.transactions
where "from" = '\x1Db3439a222C519ab44bb1144fC28167b4Fa6EE6'
order by "block_time" desc
limit 10

点击链接即可复制语句,或 fork 后自己该参数运行 dune.com/queries/724390

更复杂的查询语句
更复杂的查询语句

更有用的查询语句

现在,让我们筛选一些“更有用”的信息,比如:转账金额

select block_time as "date",
value/1e18 as "value" -- value 字段的值换算为 ETH 单位
from ethereum.transactions
where "from" = '\x1Db3439a222C519ab44bb1144fC28167b4Fa6EE6' -- 交易的发出地址为 V神钱包
and value/1e18 > 0.1 -- 转账金额 > 0.1 ETH
order by "block_time" desc  -- 按照区块时间倒序排序

这次我们 select 选取两个字段: block_timevalue

value 的值,我们通过 value/1e18 这个计算公式,换算为 ETH 单位⁵。

as 关键词为其取一个好听的别名

第5行 and 关键词指 where 下多个限定条件取交集

Query链接:https://dune.com/queries/728779

更有用的查询语句
更有用的查询语句

你的第一个可视化图表 📈

数据已有,可视化图表呼之欲出

对于随时间变动的数值,最普遍使用的图表就是bar chart (条形图📊、柱状图)了

在前一步生成的查询结果顶部点击"New visualization",选择“Bar Chart”,看到系统已经自动帮我们把 X,Y 轴都选好了。

如果在数据较多的情况下,则需要手动选择Y轴数据

首个可视化图表📈
首个可视化图表📈

Sum函数求和

一个最普遍的数据统计需求就是:加总求和

我们对筛选到的数据,直接使用 sum 函数即可

👉 sum(value/1e18) as "total"

select sum(value/1e18) as "total" -- 使用 sum 函数对 value 求和
from ethereum.transactions
where "from" = '\x1Db3439a222C519ab44bb1144fC28167b4Fa6EE6'

然后在可视化图表区域选择 Counter,修改 Title ,就有了如图的汇总数据:83.25万 ETH

sum 求和函数
sum 求和函数

计数 count

SUMAVGMAXMINCOUNT 统称为聚合函数,用于将组中的行汇总为单个值。

前面提到的 sum 用于对数值求和,count 则用于统计查询记录的总数目。

比如我们统计下 V神 钱包总计对外发出交易的次数

👉 select count(*)

select count(*)   -- count 函数用于计数
from ethereum.transactions
where "from" = '\x1Db3439a222C519ab44bb1144fC28167b4Fa6EE6' -- V神 对外发出交易的次数
count 计数
count 计数

你的第一个 Dune 数据看板

保存前面每一个 Query 并取名,现在我们就来搭建你的首个 Dune Dashboard

在首页点击"New Dashboard",或直接在 Query 结果页面点击"Add to dashboard",输入 Dashboard 名字即可

👉 dune.com/gm365/:-V-YYDS

建议:首次取名选简短的英文,这部分内容会被用在url上(只支持英文、数字且后期无法修改)。你可以首次取名并保存之后,再对其改名以显示完成内容(现在可以中英文、emoji表情混用了)

分类汇总 group by

另一个常见的数据统计需求:分类汇总

比如我们想知道 V神 每月的转入、转出ETH总额

Query 代码的第1行中 date_trunc('month', block_time) 称为截断日期函数,用于将时间间隔截断为指定的精度级别(这里我们选取 month 统计每月数值,你还可以选 hourminuteseconddayweekyear 等时间间隔单位 )

select date_trunc('month', block_time) as "Date",
sum(value/1e18) as "Value" -- 当月接收 ETH 求和

第2行中,我们要使用 sum 表示对当月的 ETH 转账金额进行求和

最后一行的 group by 1 即按第一个字段 "date" 进行分类汇总,如果是第二个字段,则为 group by 2,以此类推

分类汇总
分类汇总

累计求和 Cumulative Sum

累计求和,在前一项数据基础上,累加当前数据,不断重复。

一般我们会先按日求和,再不断累加汇总。比如统计某个协议有史以来所有充值到合约地址的ETH总额。

要实现“累计求和”,其 Query 代码稍微有些复杂。

with net as (
select day,
sum("total") as daily_sum 
from (
    select value/1e18 as "total", 
    date_trunc('day', "block_time") as day
    from ethereum."traces" 
    where "from" = '\x1Db3439a222C519ab44bb1144fC28167b4Fa6EE6' -- 从 V神钱包地址 发出的交易
) as "total_amount"
group by day
)

select day, sum(sum("daily_sum")) over (order by day)
from net
group by day
order by day desc

面对这种情况,千万不要气馁。因为我们新人小白也有必杀技: Fork并修改关键参数

比如,我们直接 fork 下面这个 Query ,在其基础之上,只需要修改第8行参数即可

👉 dune.com/queries/732520

累计求和
累计求和

Fork 神技能

作为新人小白,我们一定要掌握的最重要的一门技能:fork 神技

站在前辈大神的肩膀之上,能让我们光速入门。越过陡峭的学习曲线,Fork 大神的代码与劳动成果,然后只需要简单修改核心参数,即可实现同类功能,获取心仪的数据(感恩大神与前辈的付出)

具体到 Dune上,我们在任一 Dune看板的图表区域点击左上角 Query 名字即可查看完整 SQL查询语句。Fork之,修改关键参数,然后点 Run 即可见证奇迹

比如 oxBi 大神做好的一个叫 ”Total Holder by Day - ENS ” 的 Query,统计了 ENS 代币每日的总持币人数。代码有67行之长,语法复杂,艰深无比,我等小白唯有汪洋兴叹的份儿。

但,如果你只是想借用下大神这个 Query 的功能,统计其他代币的每日持币人数,我们 Fork 后修改第14行代码中 Token 地址即可搞定。

站在巨人肩膀之上,轻松无比。

👉 dune.com/queries/326596/621471

ENS 每日持币人数 Query
ENS 每日持币人数 Query

Dune 零基础实战

零基础入门的小白能否直接实战?

当然!

👉 https://dune.com/gm365/Syndicate

这个 @SyndicateDAO 看板,所用到的基础知识在前面全部有所涉及。事实上,这也是我近期学习并用 Dune 做的第一个数据 Dashboard。

在前面基础知识铺垫之上,另一个关键就在于找准协议所对应的合约地址,大家可以点开每一个 Query 查看具体的 SQL 代码,你会发现实现这些链上数据统计功能并没有太难。

Syndicate Dune Dashboard
Syndicate Dune Dashboard

总结

Dune 帮我们保存了珍贵的链上数据,我们要做的便是“各取所需,为我所用”。

大神们构建的Query语句精妙绝伦,却也繁复无比。我们作为小白,只要掌握了最基本的 SQL查询语句,其实已经可以开启神奇的链上数据分析师🧙‍♂️之旅了。

本文只能算作一个相当初级的 Dune 入门指南,无论是对 SQL 还是 Dune 的介绍,都有诸多遗漏。对于有心深入链上数据分析的同学而言,建议可以先从基础的 SQL 入门教程开始,掌握基础语法后,就可以选一个你喜欢的协议来尝试制作你个人版本的 Dune 数据看板了。

比如前面提到的 Syndicate Dashboard,也是我个人尝试的第一个看板。没成想,竟然还被收录到了第29期的官方 Dune Digest 中,属实意外。

致谢

本文写作过程中,参考了其他前辈与大神的诸多教程和文章。这里尤其感谢大神 @Pro_0xBi 的三篇 Mirror 教学文章,敬请移步大神置顶推文获取更多 Dune 秘籍。

备注

[1] Dune 已经将域名从 dune.xyz 跳转到 dune.com

[2] Dune 于 2022.2.2 完成最新一轮 6942万美元融资 www.qianba.com/news/p-429265.html

[3] Dune 实际上使用的是一种叫 PostgreSQL 的查询语言,其兼容大部分 SQL 语句,普通用户无须做更进一步的区分

[4] 实际上, Dune 已经将其改名为 dataset,称为数据集更为准确,但其本质含义并未发生变化

[5] 以太坊的单位默认为 wei, 1个 ETH 相当于10的18次方wei,所以需要把原始单位除以 10的18次方,计算后的结果即为常用的 ETH 单位

参考文献

Subscribe to gm365.eth
Receive the latest updates directly to your inbox.
Verification
This entry has been permanently stored onchain and signed by its creator.