返回 Web3 笔记
Day 32

Day 32:Dune 进阶(协议级表与多表关联)- Aave/Uniswap 行为拆解

用协议级表和多表关联搭建 Aave/Uniswap 的用户行为分析框架,产出可复用查询与指标口径

2025-02-11
Dune协议级表多表关联AaveUniswapDay32Week5

Day 32: Dune 进阶(协议级表与多表关联)- Aave/Uniswap 行为拆解

今日目标

完成三件事:

  1. 识别协议级核心数据表(交易、事件、价格、地址标签)
  2. 搭建 Aave / Uniswap 多表关联查询框架
  3. 输出 1 套可复用指标口径(活跃、规模、用户结构)

今日学习重点

1. 协议级表优先(先定义问题,再选表)

  • Uniswap 关注:Swap、Pool、Liquidity 相关事件
  • Aave 关注:Supply、Borrow、Repay、Liquidation 行为
  • 同一问题尽量统一时间粒度与地址口径,避免口径漂移

2. 多表关联思路(行为表 + 价格表 + 维度表)

  • 行为表:回答“发生了什么”
  • 价格表:回答“规模有多大(USD)”
  • 维度表:回答“是谁在做(新老用户/鲸鱼/普通地址)”

SQL 模板(可直接改后运行)

模板 1:Uniswap 每日 Swap 用户与交易规模

WITH swaps AS (
  SELECT
    DATE_TRUNC('day', evt_block_time) AS day,
    tx_hash,
    sender AS wallet,
    amount0,
    amount1
  FROM uniswap_v3_ethereum.Pair_evt_Swap
  WHERE evt_block_time >= NOW() - INTERVAL '30' day
)
SELECT
  day,
  COUNT(DISTINCT wallet) AS swap_users,
  COUNT(DISTINCT tx_hash) AS swap_txs
FROM swaps
GROUP BY 1
ORDER BY 1;

模板 2:Aave 每日借贷行为(Borrow / Repay)

WITH actions AS (
  SELECT DATE_TRUNC('day', evt_block_time) AS day, user, 'borrow' AS action
  FROM aave_v3_ethereum.Pool_evt_Borrow
  WHERE evt_block_time >= NOW() - INTERVAL '30' day
  UNION ALL
  SELECT DATE_TRUNC('day', evt_block_time) AS day, user, 'repay' AS action
  FROM aave_v3_ethereum.Pool_evt_Repay
  WHERE evt_block_time >= NOW() - INTERVAL '30' day
)
SELECT
  day,
  COUNT(DISTINCT user) AS active_users,
  SUM(CASE WHEN action = 'borrow' THEN 1 ELSE 0 END) AS borrow_cnt,
  SUM(CASE WHEN action = 'repay' THEN 1 ELSE 0 END) AS repay_cnt
FROM actions
GROUP BY 1
ORDER BY 1;

模板 3:新增地址占比(7 天滚动)

WITH first_seen AS (
  SELECT wallet, MIN(day) AS first_day
  FROM (
    SELECT sender AS wallet, DATE_TRUNC('day', evt_block_time) AS day
    FROM uniswap_v3_ethereum.Pair_evt_Swap
    UNION ALL
    SELECT user AS wallet, DATE_TRUNC('day', evt_block_time) AS day
    FROM aave_v3_ethereum.Pool_evt_Borrow
  ) t
  GROUP BY 1
),
daily_active AS (
  SELECT DATE_TRUNC('day', evt_block_time) AS day, sender AS wallet
  FROM uniswap_v3_ethereum.Pair_evt_Swap
  WHERE evt_block_time >= NOW() - INTERVAL '30' day
  UNION
  SELECT DATE_TRUNC('day', evt_block_time) AS day, user AS wallet
  FROM aave_v3_ethereum.Pool_evt_Borrow
  WHERE evt_block_time >= NOW() - INTERVAL '30' day
)
SELECT
  a.day,
  COUNT(DISTINCT a.wallet) AS active_wallets,
  COUNT(DISTINCT CASE WHEN f.first_day = a.day THEN a.wallet END) AS new_wallets
FROM daily_active a
LEFT JOIN first_seen f ON a.wallet = f.wallet
GROUP BY 1
ORDER BY 1;

Day 32 可交付 Dashboard(最小版本)

  • 图表 1:Uniswap 每日 Swap 用户 / 交易数
  • 图表 2:Aave 借贷行为数量(Borrow vs Repay)
  • 图表 3:新增地址占比趋势(跨协议)

建议命名:

  • Query 1: momoweb3_day32_uniswap_activity
  • Query 2: momoweb3_day32_aave_actions
  • Query 3: momoweb3_day32_new_wallet_ratio

今日执行清单(2-3h)

  • 跑通 3 条查询并确认字段口径
  • 将 3 个查询组装成 1 个 Day 32 Dashboard
  • 记录 2 条跨协议行为洞察
  • 写 1 段 30 秒面试表达

面试表达(30 秒)

Day 32 我从“单表统计”升级到“协议级多表分析”:先明确产品问题,再用行为表、价格表、维度表组合成可解释指标。这样不仅能看见链上发生了什么,还能判断规模变化和用户结构变化,为后续功能优先级提供依据。


明日预告

Day 33:指标体系固化(增长/留存/转化),把 Day 31-32 查询沉淀为复用模板。