Dune Analytics 新手教程
Dune Analytics是进行区块链研究的强大工具。它可用于查询,提取和视觉化以太坊区块链上的大量资料。这篇文章介绍了一些基本示例,这些示例说明了如何搜寻和编写基本查询以及如何使用图表将其视觉化。探索的机会是无限的。

Dex交易量百分比
在以太坊等公共区块链中,所有资讯本来就是公共的。你所需要的只是寻找它。到目前为止,回答诸如一个专案有多少使用者或DEX的每日交易量之类的问题很可能需要编写专门的指令码。执行指令码将涉及遍历块,解析资讯,对其进行正确排序以及提取资料。这既耗时又非常专业。像这样的指令码可能能够提取有关一个特定专案的资讯,但需要进行大量修改才能将其幻化。此外,在所有区块上执行本身就是一个漫长的过程,需要一个完整的节点或对外部服务的许多单独查询。
用Dune Analytics 来救你
Dune Analytics可以大大简化此过程的工具。这是一个基于Web的平台,可使用简单的SQL查询从预先填充的资料库中查询以太坊资料。无需编写专门的指令码,只需查询资料库即可提取几乎所有驻留在区块链上的资讯。本指南涵盖了如何在Dune上搜索,编写和视觉化基本查询的基础知识,因此你可以立即从零开始成为区块链分析师。即使你以前从未使用过SQL,几个基本示例就可以帮你走很长一段路。
Dune Analytics如何运作的
Dune Analytics的核心是将来自区块链的原始资料聚合到可以轻松查询的SQL资料库中。例如,有一个表查询所有以太坊交易,并很好地分为几列。列涵盖了传送者,接收者,金额等。

查询5个以太坊交易的示例
所有这些资讯都是免费提供的。免费套餐(需要开设帐户)包括:
- 搜寻查询
- 编写新查询
- 建立视觉化和仪表盘
所有免费查询均可供所有人检视和搜寻。将私有的查询需要一个高阶帐户。Pro账号还提供了一些其他好处,例如汇出资料和去除图表中水印。
来自区块的资讯经过几分钟的延迟后便被解析并填充到Dune的资料库中。除了原始资料块和交易,Dune还具有资产价格资讯和专用表,例如UNI通证的所有持有地址。
现在,让我们熟悉如何使用Dune,现在无需编写任何程式码,之后再看一些SQL基础知识。
开始使用Dune Analytics
开启帐户后,主页 将如下所示:

登入Dune Analytics 应用
你看到的第一个萤幕是常用仪表盘的列表。仪表盘是其他使用者通常围绕特定主题建立的查询和图表的集合。

以太坊gas价格仪表板
有大量的仪表盘可供查询,涵盖了主流的DeFi专案,DEX交易量,以太坊交易的gas使用等等。

你可以在右侧的搜寻栏中搜索特定专案上的仪表盘。如果你在热门仪表盘部分找不到相关的仪表盘,请确保选择“所有仪表盘”(搜寻仅查询所选列表)。
每个仪表盘均包含一个查询。每个图表都可以选择,检视和编辑。
从仪表盘检视的图表本身可以轻松操作。如:放大、选择图表的一部分等。双击图表标题,选择建立图表的特定查询。

在这里,你可以选择 Edit Qeuery
来检视查询或就地进行较小的操作,也可以选择 fork
来将查询复制到你自己的工作区中,之后进行自己的操作,储存更改并建立新图表。我们将在下一部分中介绍如何编辑和建立查询。
搜寻查询
就像搜寻仪表盘一样,你可以从顶部栏中选择查询列表以搜寻查询。

并非所有查询都新增到仪表盘,因此还有更多查询可供筛选。成功找到感兴趣的查询当然取决于作者标记并正确编写它。找到感兴趣的查询后,就可以选择,编辑或fork它,就像仪表盘中的任何查询一样。
仪表盘通常是查询的一部分,作者选择高亮显示。在查询有关特定专案的资讯时,最好先从仪表盘开始,如果找不到所需的内容,在继续在查询列表里搜寻。
如果你找不到想要的东西怎么办?是时候开始尝试使用SQL了。
编写查询
查询特定专案的资讯时,其他Dune使用者的仪表盘和查询是一个不错的起点,但是有时存在的查询不足以回答你正在研究的问题。
幸运的是,Dune使用标准的PostgreSQL查询语言。即使你以前从未编写过SQL,也可以使用它轻松进行一些基本查询。
首先,最有用的入门是仪表盘和其他人编写的查询。如前所述,所有公共查询都可以Fork,或者你可以简单地从其他人复制程式码。这对于对满足你大部分需求的查询进行细微改动,或者只是从他人那里学习新功能和窍门,都非常有用。在这个简短的教程中,将头开始编写一些基本的查询,但是从中寻找相关的灵感总是很有用的。

建立一个空白查询

新查询检视的部分
一些非常有用的表举例:
ethereum .transactions
ethereum .logs
erc20 .ERC20_evt_Transfer
价格.layer1_usd
第一个查询
每个查询都是以研究问题开始。第一步是明确定义我们想知道的内容。举一个简单的例子,让我们看一下最近的5笔交易。
很自然,我们会在包含所有以太坊交易的表中找到答案,因此我们首先在搜寻栏位中搜索该表。在此案例中,搜寻 transaction
将显示相关表的列表,我们可以从中选择ethereum.transactions
。
单击表列表中的表将显示该表中所有可用的列。在此案例中,我们使用 ethereum.transactions
表,其列为hash
,index
,gas_price
等。

单击双箭头将名称复制到查询栏位中
在这个简单的示例中,我们选择*
,这意味着从表 ethereum.transactions
中选择所有列。
在执行此查询之前,必须注意一些查询可能需要很长时间才能完成,并且返回太多资料。尤其是在开始处理查询时,限制返回条目的数量以加快处理速度非常有用。这可以通过新增 limit
子句来完成,这会将返回的行数限制为指定的数。
从以太坊中选择* 。“交易”限制5
编写查询后,按 execute
以执行它。

执行简单查询的结果显示在结果部分
select * from ethereum.”transactions”
order by block_time desc limit 5

与每项工作一样,强烈建议偶尔储存查询,尤其是在进行复杂的查询时(快捷键Ctrl + S/ Cmd + S 亦可以工作)。
简单查询可以在 这里 找到。
视觉化资料
除了简单地储存资料之外,Dune Analytics还提供了一种强大的视觉化方法。在此示例中,我们来看一个稍微复杂的查询。我们想知道过去10天每天传送的ETH的总价值。这也将有助于演示过滤和按时间分组资料。
获取此资料的查询如下:
从以太坊中选择date_trunc(' day ', block_time)作为“ Date ”,sum ( value / 1e18 )作为“ Value ”
。 ”transactions”
where block_time > now () —间隔'10 days '
group by 1 order by 1
让我们分解一下
date_trunc(‘day’,block_time)
:我们不需要选择表中的所有列,而只需选择我们需要的列。在此案例中,需要区块时间和ETH的值。block_time
是Unix时间戳格式,但是我们只对获取它的day
部分感兴趣,因此我们截断了其余资料。as as ”Date“
:为列指定别名。这不是必需的,但是可以使结果更易于阅读,并且图表自动具有更好的标签。sum(value/1e18)
:由于我们汇总了所有已传送的ETH,因此我们使用SUM函式汇总资料。由于ETH的精度为18位小数,因此我们将数字除以1e18,得到的值以ETH为单位,而不是以Wei为单位where block_time > now() — interval ’10 days’
:仅检视过去10天的区块时间。这也将使查询执行更快group by 1 order by 1
:1这是我们选择的第一列(date_trunc)。我们将结果按日期分组并按日期排序。由于我们按天对资料进行分组,因此需要对选择的所有其他列进行汇总。这里使用SUM
,但也可以根据需要使用MAX,MIN,AVG或任何其他汇总函式。

执行查询将生成类似的结果。日期列表以及这些天转移的以太币总和。
现在我们要绘制此资料。选择 New Visualization
以转到视觉化选单。

新建视觉化按钮

Dune Analytics视觉化选单
在此案例中,我们需要一个图表。我们要绘制传送的ETH的总和作为日期的函式。相应选择X和Y轴

就是这样,我们有一个基本图表。还有更多的可能性可以玩。图表样式,颜色,标签等。
最后,储存图表以新增到查询结果中。可以为每个查询建立多个视觉化。
这里 有示例可以参考。
稍微高阶的查询
到目前为止,我们仅检视单个表中的查询。单个表可能没有我们需要的所有资讯。为了说明这一点,让我们以前面的示例为例,但是我们不显示已传送的ETH数量,而是绘制以ETH表示的美元价值金额。
ethereum.transactions
表没有任何价格资料。幸运的是,Dune为大量资产提供了每分钟的价格资料。
因此我们需要连线(join)交易表和价格表:
以 txs 为 ( select block_time, value , price
from ethereum.”transactions” e
join prices.”layer1_usd” p
on p.minute = date_trunc(' minute ', e.block_time)
where block_time > now () — interval ' 10 天'
and symbol = 'ETH'
)选择date_trunc(' day ', block_time)作为“ Date ”,sum ( value * price / 1e18 )作为“值”来自txs
分组 1顺序1 _ _
让我们逐行将其分解:
首先,我们建立一个新的辅助表,其中包含我们需要的所有资料。以便以后在这个新表可以更轻松地汇总资料。
with txs as
:根据以下资料建立一个名为txs
的新表from ethereum.”transactions” e
:从表ethereum.transactions中获取资料,并将表别名为e
join prices.”layer1_usd” p
:将表与价格表相连,并将其别名为p。联接操作将合并两个表的列on p.minute = date_trunc(‘minute’, e.block_time)
:联接操作要求你通过on 指定联接的列。这里,价格只会每分钟记录一次,因此我们希望将资料与建立区块的时间结合起来。这将为每个交易生成一个条目,但是现在带有来自价格表中的其他资料。where block_time > now() — interval ’10 days’
:和以前一样,仅获取过去10天的资料and symbol ='ETH'
:价格表中有很多代币的价格,我们只对ETH的价格感兴趣select date_trunc(‘day’, block_time) as “Date”, sum(value * price / 1e18) as “Value” from txs
:最后,我们执行与之前相同的查询,但是将ETH中的值乘以价钱。我们也从txs
表中获取资料。
最后,绘制资料将得到下图

查询程式码在 这里
建立仪表盘
现在我们已经有了图表,我们可以将它们聚合到仪表盘中。点选“Create(建立)”->“New Dashboard(新仪表盘)”,为你的仪表盘起一个资讯丰富的名称

可以使用仪表盘面板中的“Add Widget(新增视窗小部件)”按钮或每个查询中每个视觉化中的“Add to Dashboard(新增到仪表盘)”按钮来新增视窗小部件。

检视特定地址
最后,为了演示如何查询与特定地址相关的事件,我们将对查询进行一些修改,以检视与以太坊共同建立者Vitalik Buterin相关的地址所转移的ETH数量。
txs 为 ( select block_time, value , price
from ethereum. "transactions" e
join prices. "layer1_usd" p
on p.minute = date_trunc( 'minute' , e.block_time)
和( "from" = '\x1Db3439a222C519ab44bb1144fC28167b4Fa6EE6'
或 "from" = '\xAb5801a7D398351b8bE11C439e05C5B3259aeC9B' )
和p.symbol = 'ETH'
)
选择date_trunc( 'month' ,block_time)作为 "日期" ,总和(价值*价格/ 1e18)作为 “价值” 来自txs
group by 1 order by 1
该查询与以前几乎相同,只是现在我们在 from
列上添加了一个过滤器。注意地址的格式。在Dune中使用地址时, 它必须以 \x
而不是 0x
开头,因为你很可能会在块浏览器中找到它,这是一个非常常见的错误,因此必须指出这一点。查询及其结果在 这里 可以找到。
Dune的局限性
尽管Dune是一种超级强大的工具,但仍有一些错误和局限性值得一提。首先,当前仅可以查询事件,例如交易和转账。不能在某个特定区块查询区块链的状态。例如,要知道特定地址在某个区块的余额是多少,你将需要建立一个查询,以对该地址的所有转入和转出交易进行汇总。回答“以太坊的总供应量是多少”这个问题目前有点棘手。
尽管平台大多数时候都可以帮助你除错错误的查询,但有时查询会一直挂起直到超时。如果查询花费的时间不合理,则可能得试试储存它再重新载入网页。这些错误可能会在将来被消除。
查询有40分钟的限制,直到超时为止。查询大量资料和多个联接,可以会达到限制。尽可能考虑过滤查询(例如,区块时间或区块编号)。
最后,一个免费使用者一次只能限制3个查询,如果要更新具有多个图表的仪表盘,这可能会受到限制。
推荐文章
合约检查
黑科技工具