Dune Datawarehouse

Dune作为区块链数据仓库,已经颇具规模,目前占据市场主导地位。Dune的商业模式主要是封装所有的区块链数据来源,将结构化明细数据开放给下游使用,帮助开发人员在上面开发看板和完成分析。处理统一的明细数据外,Dune还开放了数据可视化能力,进一步增强了数据的可用性和直观性。

用户在上面的开发,也可以沉淀到平台,正如名字“Dune”,达到聚沙成塔的目的。用户的看板等产品可以被订阅和传播,后期可以进行空投或者组织DAO,前景不可估量。随着区块链数据的进一步丰富,Dune所承载的数据将会越来越多,满足各种数据需求。

下面介绍和记录一些常用数据,帮助大家搭建自己的数据产品。

Dune数据仓库特点

  1. 用PostgreSQL进行数据计算,能一定程度上保证速度。后面如果区块链指数增加,性能会出现瓶颈。目前新的引擎(V2)集成了Spark,但效率仍需考验;

  2. 整体架构目前不太牵扯大数据引擎,直接用Data Pipeline触发实现传参,没有DAG图的概念,没有传统数仓的调度;

  3. 没有口径的概念,大家对数据指标各有定义,链与链之间难以直接比较,口径共识范围较小;

  4. 部分指标受限于性能可能无法实现,比如同环比还有不同的去重数据等;

  5. 存在大量长尾数据,数据治理等需要尽早介入,不然后期包袱越来越重;

  6. 下个周期,非金融数据的丰富,目前的架构一定会无法支持。

Dune数据接入方式

Dune开放一个函数解析接口,项目方可以根据自己的数据结构自主接入,相当于众包模式,让业务方自己准备好明细数据,接入Dune平台。同时,项目方的数据结构等发生变化,Dune没有义务和能力去监控,只能靠项目方自己来更新。

除了项目方自己接入以外,Dune还给了开发者提供了一套解码方式,方便简化一些复杂逻辑,相当于自建UDF。

Dune数据分析模式

目前没有统一的建模方式,基本围绕需求展开,需求全靠脑补,数据分析相对较初级。且不能和其他链下数据相配合,也无法获取用户行为数据,目前只能针对结果数据去处理。

ETH主要数据

ethereum.transaction

block_time 区块时间

nonce 发送地址的交易计数:该账户为外部账户时候,表示该账户创建的交易序号,每做一次交易都会加1。该账户为合约账户时候,表示该账户创建的合约序号,每创建一次会加1。

index

success

from 发起地址

to 转入地址

value 转账金额

block_number

block_hash

gas_limit 本区块中所有交易消耗的Gas上限

gas_price 为交易付出的Gas价格

gas_used 本区块中所有交易使用的Gas之和

data 附加数据(合约调用input data)

hash

type 交易类型,表明该交易是合约创建交易还是一般的message-call 交易(NullTransaction -- 空交易;ContractCreation -- 创建合约的交易,直接忽略地址

access_list

max_fee_per_gas

max_priority_fee_per_gas

priority_fee_per_gas

ethereum.traces

block_time

sub_traces

tx_success

success

block_hash

block_number

tx_hash

from

value

gas

gas_used

tx_index

trace_address

type

address

code

call_type

input

output

to

refund_address

error

ethereum.logs

contract_address

topic1

topic2

topic3

topic4

data

tx_hash

block_hash

block_number

block_time

index

tx_index

以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表中。