Dune基础入门-part1

网址:https://dune.com/browse/dashboards

dune简介

区块链的本质是一个分布式的公共账本,所有的数据在链上公开透明,包括每一笔转账,每一次的合约调用。Dune将链上数据聚合到可访问的PostgreSQL数据库中,是进行链上数据分析的工具。用户可以通过PostgreSQL查询链上数据并将数据可视化,汇总成dashboard。

常用数据表介绍

Dune数据表架构如下:

raw transaction data: 原始交易数据。

decoded data: 解码后的智能合约数据。

abstractions: 更高级别的按照主题聚合的数据表,比如price.usd等。在GitHub上可以找到每张表的创建逻辑,链接如下。

以ethereum链为例,下图是转移token的过程产生的数据流转。假设现在要在链上转移USDT,就会调用transfer函数,指定接收者和转移的金额,对此条交易进行签名,那么此时链上就会产生calldata数据,dune将这个数据存在了ethereum.transaction表中,这张表主要包含以下字段~from(发送交易的人的地址/签名者),to(合约交互的地址,现在转移的是USDT,那么就是USDT的合约地址),success(这条交易是成功?还是失败?),value(表示的是转移的ETH数值,那现在转移的是USDT,没有转移ETH,所以在这条交易中value的值为0),gas_column(主要记录交易的gas使用情况,有gas limit,gas used,gas price),hash(在链上进行的每次行为都会产生一个唯一的transaction hash,这个值也是用来多表关联的唯一主键),blocknumber,blocktime主要记录交易发生的区块和时间~

转移USDT的合约调用过程,也称为内部交易/子交易,数据存在了ethereum.traces表中。

交易执行的日志数据,包括签名者、接收者、topic、转账金额等等存在ethereum.logs表中。

ethereum.transaction: eth交易数据

ethereum.traces:eth“内部”交易数据

ethereum.logs:eth交易事件日志

SQL基础入门

SQL是结构化查询语言,用于存取、查询、升级和管理相关的数据库系统。我们以三箭资本的一个地址(0x676Aecc97bF721C3cb3329A22D49C0ea0ED375F7)在eth链的交易数据为例展开讲解分析~

  • 查询数据

    select * from ethereum."transactions" order by block_time desc limit 10

其中select后面表示的是需要的数据字段,*代表数据表中所有的字段,如果只想选取其中一些字段,则select后面加上相应的字段名就可以了,from后面为数据表,order by表示按照block_number的顺序排列显示结果,desc为降序,asc为升序。limit是为了限制数据量,否则语句将返回表中全部数据。

  • 过滤数据

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

where后面表示根据指定条件对结果进行过滤,只筛选出字段from=\x676Aecc97bF721C3cb3329A22D49C0ea0ED375F7的数据,即钱包0x676Aecc97bF721C3cb3329A22D49C0ea0ED375F7(三箭资本)的交易数据。

  • 多表连接

比如我想知道这个地址0x676Aecc97bF721C3cb3329A22D49C0ea0ED375F7的账户余额。

with total_token as (
SELECT token_address, sum(amount) as amount
FROM erc20."view_token_balances_latest"
WHERE "wallet_address" IN ('\x676aecc97bf721c3cb3329a22d49c0ea0ed375f7')
group by token_address
),
token_price as (
select contract_address, price
from prices.usd
where minute-date_trunc('minute', now())='-06:00:00' AND contract_address in (select token_address from total_token) and price >0
)
Select sum(a.amount * b.price) as Value
from total_token a left join token_price b on a.token_address=b.contract_address

on后面的语句表示将两表连接起来的条件。

在链上交易数据中,Transaction Hash是唯一的,因此Transaction Hash是将表连接起来的唯一主键。

  • 数据聚合

    select date_trunc('day', block_time) date, sum(value)/1e18 as value

    from ethereum."transactions"

    where "from" ='\x676Aecc97bF721C3cb3329A22D49C0ea0ED375F7'

    and block_time>='2022-01-01'

    and block_time<now()

    group by date_trunc('day', block_time)

    order by date_trunc('day', block_time) desc

group by函数可以根据一列或者多列对结果进行汇总。其中date_trunc('day', block_time)函数为时间截断函数,可以根据指定的日期部分(比如hour,day,month等)对时间戳表达式进行截断。group by date_trunc('day', block_time) 表示按照date_trunc('day', block_time)即date字段进行汇总,也可以简写为group by 1即按照第一个字段汇总。order by date_trunc('day', block_time) desc表示按照date字段降序排列结果。

当有了这种汇总结果后,可以建立我们的第一个数据可视化图表~点击New visualization,可以选择你想使用的可视化图表以及x轴和y轴数据,就对数据进行展示啦。

  • 常用聚合函数

    sum() 求和函数、count() 计数函数、avg() 求平均值函数、min()求最小值函数、max()求最大值函数、Cumulative Sum() 累加函数等等。

    比如我想知道0x676Aecc97bF721C3cb3329A22D49C0ea0ED375F7这个地址一共发出过多少ETH,一共对外发出的交易次数等等。

    select sum(value)/1e18 as sum_value, count(1) as trans_cnt
    from ethereum."transactions"where "from"='\x676Aecc97bF721C3cb3329A22D49C0ea0ED375F7'

可以看出0x676Aecc97bF721C3cb3329A22D49C0ea0ED375F7这个地址一共发出了365454个ETH,一共对外发出交易次数为6887次。

  • 总结

    当会了一些基本的SQL语句后,我们就可以从数据表中查询任何我们需要的数据啦。但是会写SQL只是作为一名数据分析师的基本功,我认为最重要的还是理解数据并用数据讲故事,在数据中能总结发现出一些有意思的东西~

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