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

By [gm365.eth](https://paragraph.com/@gm365-2) · 2022-05-15

---

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

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

非也！

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

何谓 Dune？
--------

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

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

何谓数据仓库？
-------

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

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

何谓 SQL？
-------

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

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

![SQL 语言](https://storage.googleapis.com/papyrus_images/7cb6557c2cf80289cd046a0a27109054d47c26fb5b9222c5bf5098a435b38fbc.png)

SQL 语言

何谓数据表？
------

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

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

![Dune New Query 页面](https://storage.googleapis.com/papyrus_images/21f4268d50981238b418fb4064df4406a72de86db2b764293d33116da1eb3017.jpg)

Dune New Query 页面

常用数据表
-----

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

![Dune 常用数据表](https://storage.googleapis.com/papyrus_images/f5c786260c8a58db1c6d5484cc071573dbbb76287a514edf1ba3818b7ee176b3.jpg)

Dune 常用数据表

数据表里有什么？
--------

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

以 `"ethereum.transactions"` 为例，表内提供了:

*   `block_time` 区块时间
    
*   `from` 发起地址
    
*   `to` 转入地址（或调用的合约地址）
    
*   `value` 转账金额，
    
*   `data` 附加数据（合约调用的input data）
    

等诸多数据

![transactions 数据表](https://storage.googleapis.com/papyrus_images/f1f790427713a81d96e6db2ad8d696e287afb513875eda3939cdcaa3f94fe231.jpg)

transactions 数据表

SQL 查询语句怎么写？
------------

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

*   `select`: 取什么数据
    
*   `from`: 从哪里取数据
    
*   `where`: 限制条件是什么
    
*   `order by`: 根据什么排序
    
*   `limit`: 限制取回的数据条数
    

![SQL 查询语句](https://storage.googleapis.com/papyrus_images/091ee404520b341fe9d1e5cf2661eb4620a54420c0d135ae16595cf2b3e2715c.jpg)

SQL 查询语句

你的第一条 Dune 查询语句
---------------

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

👉 `select * from ethereum.transactions limit 5`

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

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

![首条 Dune 查询语句](https://storage.googleapis.com/papyrus_images/5c0af3c2b8a0e85f32787061b72f342deb2ddab92167bc9b6ba09586c08424e0.jpg)

首条 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](https://t.co/I59NaGsig2)

![更复杂的查询语句](https://storage.googleapis.com/papyrus_images/0ce30b7bd689c5009e86e782708311055b428eca98af946a6d1b9db321d1f58f.jpg)

更复杂的查询语句

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

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

    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_time` 和 `value`

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

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

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

Query链接：[https://dune.com/queries/728779](https://t.co/684ryLWPCo)

![更有用的查询语句](https://storage.googleapis.com/papyrus_images/b0a0f493774901d5d4bed96b2236f79cb1422f6c3e8d7d7c1a826cfbbd624ffa.jpg)

更有用的查询语句

你的第一个可视化图表 📈
-------------

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

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

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

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

![首个可视化图表📈](https://storage.googleapis.com/papyrus_images/abdc2bf8c9bbb07dcef06e444ded712a90a1f56f504d1f7efdb50cadd207f436.jpg)

首个可视化图表📈

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 求和函数](https://storage.googleapis.com/papyrus_images/3a7009f9d68a9c2692e1598cefdb169576e573773f45b7531a4b87286e9a8bc0.jpg)

sum 求和函数

计数 count
--------

`SUM`、`AVG`、`MAX`、`MIN`、`COUNT` 统称为聚合函数，用于将组中的行汇总为单个值。

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

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

👉 `select count(*)`

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

![count 计数](https://storage.googleapis.com/papyrus_images/a3f43730620ab85bd3da016fa71db051f90325388b302741e6d9bdb4cbeefbdf.jpg)

count 计数

你的第一个 Dune 数据看板
---------------

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

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

👉 [dune.com/gm365/:-V-YYDS](http://dune.com/gm365/:-V-YYDS)

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

分类汇总 group by
-------------

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

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

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

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

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

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

![分类汇总](https://storage.googleapis.com/papyrus_images/b801e24a32a8f882a9db77ce38d51eb5b9a481c0ef838a8989bb5202f7a39200.jpg)

分类汇总

累计求和 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

![累计求和](https://storage.googleapis.com/papyrus_images/1a11d57f21661bf3c98e8985542a082c6dd106b153c256dd9f3844119d13b1aa.jpg)

累计求和

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](http://dune.com/queries/326596/621471)

![ENS 每日持币人数 Query](https://storage.googleapis.com/papyrus_images/b1c2d9aa43578e692d0c2a2ef24a141167f1ee9c4e354540c5fe573d32cd817f.jpg)

ENS 每日持币人数 Query

Dune 零基础实战
----------

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

当然！

👉 [https://dune.com/gm365/Syndicate](https://t.co/U4OdkykAIL)

这个 [@SyndicateDAO](https://twitter.com/SyndicateDAO) 看板，所用到的基础知识在前面全部有所涉及。事实上，这也是我近期学习并用 Dune 做的第一个数据 Dashboard。

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

![Syndicate Dune Dashboard](https://storage.googleapis.com/papyrus_images/d35dced65cac59468981f2abd52b2a8ecd8ff2ac9bc02f88b0e46dc661f2b44c.jpg)

Syndicate Dune Dashboard

总结
--

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

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

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

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

### 致谢

本文写作过程中，参考了其他前辈与大神的诸多教程和文章。这里尤其感谢大神 [@Pro\_0xBi](https://twitter.com/Pro_0xBi) 的三篇 Mirror 教学文章，敬请移步大神置顶推文获取更多 Dune 秘籍。

备注
--

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

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

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

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

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

参考文献
----

*   [0xBi Mirror](https://0xbi.mirror.xyz/)
    
*   [从0到1构建你的Dune Analytics看板（实战篇）](https://0xbi.mirror.xyz/603BIaKXn7s2_7A84oayY_Fn5XUPh6zDsv2OlQTdzCg)
    
*   [Dune Analytics introduction tutorial](https://medium.com/zengo/dune-analytics-introduction-tutorial-with-examples-d2c764600d6)
    
*   [SQL语言基础](https://www.runoob.com/sql/sql-intro.html)

---

*Originally published on [gm365.eth](https://paragraph.com/@gm365-2/dune-analytics)*
