# Dune Datawarehouse

By [baorui.eth](https://paragraph.com/@baorui) · 2022-05-16

---

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

---

*Originally published on [baorui.eth](https://paragraph.com/@baorui/dune-datawarehouse)*
