# Dune基础入门-part1 **Published by:** [sherry](https://paragraph.com/@sherry-3/) **Published on:** 2022-07-05 **URL:** https://paragraph.com/@sherry-3/dune-part1 ## Content 网址:https://dune.com/browse/dashboards dune简介 区块链的本质是一个分布式的公共账本,所有的数据在链上公开透明,包括每一笔转账,每一次的合约调用。Dune将链上数据聚合到可访问的PostgreSQL数据库中,是进行链上数据分析的工具。用户可以通过PostgreSQL查询链上数据并将数据可视化,汇总成dashboard。 常用数据表介绍 Dune数据表架构如下: raw transaction data: 原始交易数据。 decoded data: 解码后的智能合约数据。 abstractions: 更高级别的按照主题聚合的数据表,比如price.usd等。在GitHub上可以找到每张表的创建逻辑,链接如下。 https://github.com/duneanalytics/abstractions/tree/master/ethereum 以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 100where后面表示根据指定条件对结果进行过滤,只筛选出字段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_addresson后面的语句表示将两表连接起来的条件。 在链上交易数据中,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