Dune Analytics入门教程(含示例)

Dune Analytics是区块链数据研究中的超级强大工具

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

Dex交易量百分比([源](https://explore.duneanalytics.com/queries/4323#8547))

在以太坊等公共区块链中,所有信息本来就是公共的。你所需要的只是寻找它。到目前为止,回答诸如一个项目有多少用户或DEX的每日交易量之类的问题很可能需要编写专门的脚本。运行脚本将涉及遍历块,解析信息,对其进行正确排序以及提取​​数据。 这既耗时又非常专业。像这样的脚本可能能够提取有关一个特定项目的信息,但需要进行大量修改才能将其幻化。此外,在所有区块上运行本身就是一个漫长的过程,需要一个完整的节点或对外部服务的许多单独查询。

用 Dune Analytics 来救你

Dune Analytics可以大大简化此过程的工具。这是一个基于Web的平台,可使用简单的SQL查询从预先填充的数据库中查询以太坊数据。无需编写专门的脚本,只需查询数据库即可提取几乎所有驻留在区块链上的信息。本指南涵盖了如何在Dune上搜索,编写和可视化基本查询的基础知识,因此你可以立即从零开始成为区块链分析师。即使你以前从未使用过SQL,几个基本示例就可以帮你走很长一段路。

Dune Analytics如何运作的

Dune Analytics的核心是将来自区块链的原始数据聚合到可以轻松查询的SQL数据库中。例如,有一个表查询所有以太坊交易,并很好地分为几列。列涵盖了发送者,接收者,金额等。

查询5个以太坊交易的示例([源](https://explore.duneanalytics.com/queries/5686/source#11247))

所有这些信息都是免费提供的。免费套餐(需要开设帐户)包括:

  • 搜索查询
  • 编写新查询
  • 创建可视化和仪表盘

所有免费查询均可供所有人查看和搜索。将私有的查询需要一个高级帐户。 Pro账号还提供了一些其他好处,例如导出数据和去除图表中水印。

来自区块的信息经过几分钟的延迟后便被解析并填充到Dune的数据库中。除了原始数据块和交易,Dune还具有资产价格信息和专用表,例如UNI通证的所有持有地址。

现在,让我们熟悉如何使用Dune,现在无需编写任何代码,之后再看一些SQL基础知识。

开始使用Dune Analytics

打开帐户后,主页将如下所示:

登录 Dune Analytics 应用

你看到的第一个屏幕是常用仪表盘的列表。仪表盘是其他用户通常围绕特定主题创建的查询和图表的集合。

以太坊gas价格仪表板([来源](https://explore.duneanalytics.com/dashboard/gas-prices))

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

你可以在右侧的搜索栏中搜索特定项目上的仪表盘。如果你在热门仪表盘部分找不到相关的仪表盘,请确保选择“所有仪表盘”(搜索仅查找所选列表)。

每个仪表盘均包含一个查询。每个图表都可以选择,查看和编辑。

从仪表盘视图的图表本身可以轻松操作。如:放大、选择图表的一部分等。双击图表标题,选择创建图表的特定查询。

从仪表盘中选择图形的示例

在这里,你可以选择Edit Qeuery来查看查询或就地进行较小的操作,也可以选择fork来将查询复制到你自己的工作区中,之后进行自己的操作,保存更改并创建新图表。我们将在下一部分中介绍如何编辑和创建查询。

搜索查询

就像搜索仪表盘一样,你可以从顶部栏中选择查询列表以搜索查询。

并非所有查询都添加到仪表盘,因此还有更多查询可供筛选。成功找到感兴趣的查询当然取决于作者标记并正确编写它。找到感兴趣的查询后,就可以选择,编辑或fork它,就像仪表盘中的任何查询一样。

仪表盘通常是查询的一部分,作者选择高亮显示。在查找有关特定项目的信息时,最好先从仪表盘开始,如果找不到所需的内容,在继续在查询列表里搜索。

如果你找不到想要的东西怎么办?是时候开始尝试使用SQL了。

编写查询

查找特定项目的信息时,其他Dune用户的仪表盘和查询是一个不错的起点,但是有时存在的查询不足以回答你正在研究的问题。

幸运的是,Dune使用标准的PostgreSQL查询语言。即使你以前从未编写过SQL,也可以使用它轻松进行一些基本查询。

首先,最有用的入门是仪表盘和其他人编写的查询。如前所述,所有公共查询都可以Fork,或者你可以简单地从其他人复制代码。这对于对满足你大部分需求的查询进行细微改动,或者只是从他人那里学习新功能和窍门,都非常有用。在这个简短的教程中,将头开始编写一些基本的查询,但是从中寻找相关的灵感总是很有用的。

创建一个空白查询

要创建新查询,请从左上角选择选项。你会看到以下屏幕

新查询视图的部分

左侧的表列表包含可用于创建查询的所有现有SQL表。许多受欢迎的项目都有专门的表格,其中包含专门为其解析的信息。在查看特定项目时这些表可能非常有帮助。尽管它总是可能通过直接解析所有交易的数据字段来获得,但是这可能很麻烦并且并不总是准确的。

一些非常有用的表举例:

  • ethereum.transactions:以太坊上的所有交易
  • ethereum.logs:合约触发的以太坊事件的日志(例如: Transfer)
  • erc20.ERC20_evt_Transfer:发送通证时触发的所有转账事件
  • prices.layer1_usd:以分钟为单位的ETH和许多其他流行代币的价格表

第一个查询

每个查询都是以研究问题开始。第一步是明确定义我们想知道的内容。举一个简单的例子,让我们看一下最近的5笔交易。

很自然,我们会在包含所有以太坊交易的表中找到答案,因此我们首先在搜索字段中搜索该表。在此案例中,搜索transaction将显示相关表的列表,我们可以从中选择ethereum.transactions

单击表列表中的表将显示该表中所有可用的列。在此案例中,我们使用ethereum.transactions表,其列为hashindexgas_price等。

单击双箭头将名称复制到查询字段中

单击表或列名称旁边的双箭头将名称粘贴在查询部分中。这有助于避免手动复制粘贴和输入错误。

在这个简单的示例中,我们选择*,这意味着从表ethereum.transactions中选择所有列。

在运行此查询之前,必须注意一些查询可能需要很长时间才能完成,并且返回太多数据。尤其是在开始处理查询时,限制返回条目的数量以加快处理速度非常有用。这可以通过添加limit 子句来完成,这会将返回的行数限制为指定的数。

select * from ethereum.”transactions” limit 5

编写查询后,按execute以运行它。

运行简单查询的结果显示在结果部分

太好了,我们在结果部分中有一些结果,但这是以太坊有史以来的前 5 个交易。要获取最后一个,我们可以首先在其中一列中按降序对查询进行排序。在此案例中,块时间或块号可能是一个不错的选择

select * from ethereum.”transactions” 
order by block_time desc limit 5

以太坊交易的排序结果

现在,我们有5个来自最新区块的交易。表没有显示实时数据,创建块并将其添加到表之间存在一定的延迟。

与每项工作一样,强烈建议偶尔保存查询,尤其是在进行复杂的查询时(快捷键 Ctrl + S/ Cmd + S 亦可以工作)。

简单查询可以在这里找到。

可视化数据

除了简单地存储数据之外,Dune Analytics还提供了一种强大的可视化方法。在此示例中,我们来看一个稍微复杂的查询。我们想知道过去10天每天发送的ETH的总价值。这也将有助于演示过滤和按时间分组数据。

获取此数据的查询如下:

select date_trunc(‘day’, block_time) as “Date”, sum(value/1e18) as “Value”
from ethereum.”transactions”
where block_time > now() — interval ’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可视化菜单

有几种可视化类型可供选择。最有用的可能用Chart(图表)来绘制简单的图表,但是还有*Counter(计数器)*可以显示单个数据,(pivot table)数据透视表等等。

在此案例中,我们需要一个图表。我们要绘制发送的ETH的总和作为日期的函数。相应选择X和Y轴

就是这样,我们有一个基本图表。还有更多的可能性可以玩。图表样式,颜色,标签等。

最后,保存图表以添加到查询结果中。可以为每个查询创建多个可视化。

这里有示例可以参考。

稍微高级的查询

到目前为止,我们仅查看单个表中的查询。单个表可能没有我们需要的所有信息。为了说明这一点,让我们以前面的示例为例,但是我们不显示已发送的ETH数量,而是绘制以ETH表示的美元价值金额。

ethereum.transactions表没有任何价格数据。幸运的是,Dune为大量资产提供了每分钟的价格数据。

因此我们需要连接(join)交易表和价格表:

with txs as (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 days’
and symbol = ‘ETH’
)select date_trunc(‘day’, block_time) as “Date”, sum(value * price / 1e18) as “Value” from txs
group by 1 order by 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数量。

with txs as (select block_time, value, price
from ethereum."transactions" e
join prices."layer1_usd" p
on p.minute = date_trunc('minute', e.block_time)
and ("from"='\x1Db3439a222C519ab44bb1144fC28167b4Fa6EE6'
     or "from"='\xAb5801a7D398351b8bE11C439e05C5B3259aeC9B')
and p.symbol = 'ETH'
)
select date_trunc('month', block_time) as "Date", sum(value * price / 1e18) as "Value" from txs
group by 1 order by 1

该查询与以前几乎相同,只是现在我们在from列上添加了一个过滤器。注意地址的格式。在Dune中使用地址时, 它必须以\x而不是0x开头,因为你很可能会在块浏览器中找到它,这是一个非常常见的错误,因此必须指出这一点。查询及其结果在这里可以找到。

Dune的局限性

尽管Dune是一种超级强大的工具,但仍有一些错误和局限性值得一提。首先,当前仅可以查询事件,例如交易和转账。不能在某个特定区块查询区块链的状态。例如,要知道特定地址在某个区块的余额是多少,你将需要创建一个查询,以对该地址的所有转入和转出交易进行汇总。回答“以太坊的总供应量是多少”这个问题目前有点棘手。

尽管平台大多数时候都可以帮助你调试错误的查询,但有时查询会一直挂起直到超时。如果查询花费的时间不合理,则可能得试试保存它再重新加载网页。这些错误可能会在将来被消除。

查询有40分钟的限制,直到超时为止。查询大量数据和多个联接,可以会达到限制。尽可能考虑过滤查询(例如,区块时间或区块编号)。

最后,一个免费用户一次只能限制3个查询,如果要更新具有多个图表的仪表盘,这可能会受到限制。

接下来

本教程的目的是熟悉Dune的基本功能并尝试一些基本示例。这不是有关PostgreSQL的详尽教程,而PostgreSQL的资源非常丰富,但是希望可以引入一些基本命令来帮助你入门。

当然,还有很多要探索和发现的东西,包括用于各种DeFi项目的大量预制表,通过拉取请求添加自己的表等。

Dune Analytics是区块链研究库中的超级强大工具。能够快速,简单,快速地查询大量数据真是一种超级大杀器。


本翻译由 Cell Network 赞助支持。

  • 发表于 2020-11-17 18:32
  • 阅读 ( 177 )
  • 学分 ( 165 )
  • 分类:以太坊

0 条评论

请先 登录 后评论
翻译小组
翻译小组

首席翻译官

27 篇文章, 2443 学分