2025-07-08 03:02:05

Dune Query 基础入门指南及Sol钱包转账监控实操经验分享Ⅰ

摘要
Dune Analytics 是一个用于分析并发现区块链数据的强大工具,它使用 SQL 语言来查询链上数据,使用者可以将
Dune Analytics 是一个用于分析并发现区块链数据的强大工具,它使用 SQL 语言来查询链上数据,使用者可以将这些数据转换为有用的分析,这篇博客将介绍 Dune 查询的基础用法,并通过一个 Solana 链上链下链监控实践项目来帮助你学会实践中的基础查询技术

介绍

Dune Analytics 是一个用于分析并发现区块链数据的强大工具。它使用 SQL 语言来查询链上数据,使用者可以将这些数据转换为有用的分析。这篇博客将介绍 Dune 查询的基础用法,并通过一个 Solana 链上链下链监控实践项目来帮助你学会实践中的基础查询技术。

Data Explorer 功能介绍

在开始编写查询之前,熟悉 Dune Analytics 左侧的 Data Explorer 是非常重要的。Data Explorer 提供了对数据库中可用数据表和字段的浏览功能。你可以通过它查看不同区块链的数据集、表结构和字段的类型,从而更好地理解哪些数据可以用于查询。例如,你可以在 Solana 区块链下找到 transactions 表,并看到其中的字段(如 block_timepre_token_balances 等),这些信息对你编写查询时非常有帮助。

Data Explorer 的主要功能包括:

  • 浏览不同区块链(例如以太坊、Solana 等)的数据集。
  • 查看每个数据表的字段和数据类型,帮助你了解如何构建查询。
  • 使用过滤功能快速定位特定的表或字段。

利用 Data Explorer 可以帮助你更快地找到你需要的数据,并了解这些数据的结构。

基础语法

Dune 使用 Trino 语法的 SQL,对于很多只写过 MySQL 的人来说,这些语法可能会有一些不同,但大部分基础查询是相似的,基本语法和我们所熟悉的 SQL 应该相当接近。下面对一些常用的 SQL 基础语法用词进行解释:

  • WITH:用于定义公用表表达式(CTE),可以让查询分步骤进行,增加可读性和模块化。
  • SELECT:用于指定查询的列。
  • FROM:用于指定查询的数据表。
  • WHERE:用于过滤数据,指定查询条件。
  • UNNEST:用于将数组字段解包为多行,便于后续处理。
  • AS:为字段或表赋予别名,方便引用。

例如,要查询 Solana 链上特定时间段内的交易,可以使用下面的基本查询语法:

SELECT *FROM solana.transactionsWHERE block_time >= NOW() - INTERVAL '7' DAY;
  • SELECT 语法用于查询指定列。在这个例子中,查询所有交易。
  • FROM 用于指定数据来源,此处为 solana.transactions 表。
  • WHERE 用来过滤数据,例如查询最近7天的交易。

联合用法和基础 UNNEST

在 Dune 中,链上数据常包含运行结果为数组的记录,例如交易的应用数量变更。这时,可以用 UNNEST 。UNNEST 用于将数组字段中的每个元素都作为单独的一行进行处理。比如,在链上交易的数据中,有些字段包含数组(例如一个钱包的多个代币余额),通过 UNNEST 操作,可以将这些数组元素解开,让每个元素变成一行数据。这对于需要分析数组内部各个元素的情况非常有用,这样就可以将数组内容逐条处理,而不是整体作为一个复杂的数据结构。

SELECT t.block_time, pre.ownerFROM solana.transactions t,     UNNEST(t.pre_token_balances) AS preWHERE pre.owner = '6EDJ7JuynXSPaMvufzAX4swSRJZXv6uPi4s6jmo33xj5';
  • UNNEST 语法用来将数组字段解包为多行,此处是 pre_token_balances
  • AS pre 用来为每一行数组记录赋予一个别名pre,便于后面查询。

这个查询实践项目

我们的实践项目是一个用于追踪 Solana 链上特定链下链的代币转账的分析工具。并通过这个查询实现了特定代币的交易跟踪:

WITH filtered_transactions AS (  SELECT *  FROM solana.transactions t  WHERE block_time >= NOW() - INTERVAL '7' DAY  -- 限制时间范围为最近7天),wallet_related_transactions AS (  SELECT *  FROM filtered_transactions t,    UNNEST(t.pre_token_balances) AS pre  WHERE pre.owner = '6EDJ7JuynXSPaMvufzAX4swSRJZXv6uPi4s6jmo33xj5'  -- 为指定链下链地址),token_transfers AS (  SELECT    t.block_time,    pre.owner AS "From",    post.owner AS "To",    post.mint AS "Token",    pre.amount AS "Pre_Amount",    post.amount AS "Post_Amount"  FROM    wallet_related_transactions t,    UNNEST(t.pre_token_balances) AS pre,    UNNEST(t.post_token_balances) AS post  WHERE    pre.owner = '6EDJ7JuynXSPaMvufzAX4swSRJZXv6uPi4s6jmo33xj5'  -- 指定主链包并地址    AND post.owner IS NOT NULL    AND post.mint = 'BYcs8bjoGv6m4LkRrpEDVbJvPESvP9A1migRmaDApump'  -- 指定代币合约地址)SELECT  block_time,  "From",  "To",  "Token",  "Pre_Amount",  "Post_Amount"FROM  token_transfersORDER BY  block_time DESCLIMIT 1000;  -- 限制最多返回 1000 条记录

这个查询的过程

  • 首先在 filtered_transactions 中限制查询最近7天的数据,使数据量更可控。
  • 然后在 wallet_related_transactions 中将这些数据进行 UNNEST,按照为指定链下链的交易进行过滤。
  • 最后在 token_transfers 中进行更详细的解包,并追踪代币从 “From” 到 “To” 的转账。

这样的查询设计使用了多个 CTE 来组织查询过程,通过渐进过滤的方式,使得查询更加高效。

结论

使用 Dune Analytics 可以帮助你对区块链数据进行深入分析。通过基础的 SQL 语法并使用 UNNEST 来处理复杂数据结构,你可以实现特定链下链的转账查询和跟踪。在实践中,使用强化的数据过滤以便将查询范围限制在为你所关心的信息上,这样会更有效率。希望这篇博客能帮助你学会使用 Dune 来开始实现你的区块链数据分析目标。

声明:文章不代表开拓者奇点观点及立场,不构成本平台任何投资建议。投资决策需建立在独立思考之上,本文内容仅供参考,风险自担!转载请注明出处!侵权必究!
热门新闻
热门百科
回顶部