Day 15
【实战5.3】异常交易监控系统:告警规则与实时Dashboard
定义链上异常交易模式,设计分级告警规则(LP抽离/巨额转出/价格操纵/异常授权),构建监控Dashboard原型
2026-03-20
实战项目Dune异常检测监控告警实时监控安全运营
实战项目 5.3:异常交易监控系统
项目信息
项目编号:5.3
所属方向:反欺诈分析
难度:⭐⭐⭐⭐ 高级
预计时间:5-6小时
前置技能:Rug Pull 检测(实战5.1)、Dune 进阶(Day 31-32)
项目目标
设计实时异常监控告警系统,在安全事件发生前预警
产出清单:
├── ✅ 异常模式定义文档
├── ✅ 告警规则设计
└── ✅ 监控 Dashboard 原型(Dune SQL)
Task 1:异常模式定义
八大异常交易模式
P0 — 立即响应(资产可能正在流失)
═══════════════════════════════════════════════════════════
模式 1:大额 LP 移除
├── 定义:单次移除 > 总 LP 的 30%
├── 信号强度:🔴 极高
├── 历史案例:几乎所有 Rug Pull 都有此信号
├── 响应:暂停交易建议 + 社区告警
└── SQL 检测:监控 Burn 事件金额
模式 2:巨额单笔转出
├── 定义:协议合约转出 > $1M
├── 信号强度:🔴 极高
├── 历史案例:Euler ($197M), Ronin ($625M)
├── 响应:立即通知安全团队
└── SQL 检测:大额 Transfer 事件
模式 3:闪电贷攻击特征
├── 定义:同一区块内借款→操作→还款
├── 信号强度:🔴 极高
├── 历史案例:bZx, Pancake Bunny
├── 响应:暂停相关功能
└── SQL 检测:同区块借还款模式
═══════════════════════════════════════════════════════════
P1 — 1小时内响应(潜在风险)
═══════════════════════════════════════════════════════════
模式 4:异常批量授权
├── 定义:短时间内 100+ 地址授权同一合约
├── 信号强度:🟠 高
├── 场景:可能是钓鱼合约正在活跃
├── 响应:标记合约 + 预警用户
└── SQL 检测:approve 事件聚合
模式 5:价格异常偏离
├── 定义:价格 1 小时内偏离 > 50%
├── 信号强度:🟠 高
├── 场景:价格操纵 / 预言机攻击
├── 响应:暂停依赖该价格的功能
└── SQL 检测:DEX 价格 vs 预言机对比
模式 6:大户持续卖出
├── 定义:Top20 持有者连续 3 天净卖出
├── 信号强度:🟡 中
├── 场景:内部人抛售 / Slow Rug
├── 响应:预警社区
└── SQL 检测:大户地址交易方向分析
═══════════════════════════════════════════════════════════
P2 — 每日检查
═══════════════════════════════════════════════════════════
模式 7:合约升级
├── 定义:代理合约实现地址变更
├── 信号强度:🟡 中
├── 场景:可能是正常升级也可能是恶意修改
├── 响应:审查新实现合约代码
└── SQL 检测:Upgraded 事件
模式 8:治理异常
├── 定义:大量 Token 集中转移后立即投票
├── 信号强度:🟡 中
├── 场景:治理攻击(如 Beanstalk)
├── 响应:通知治理委员会
└── SQL 检测:投票前的 Token 转移
═══════════════════════════════════════════════════════════
Task 2:告警规则设计
告警规则引擎
告警规则格式:
═══════════════════════════════════════════════════════════
RULE: [规则名称]
WHEN: [触发条件]
THEN: [告警动作]
SEVERITY: [P0/P1/P2]
COOLDOWN: [重复告警间隔]
示例:
RULE: LP_DRAIN_ALERT
WHEN: LP_removed_pct > 30% AND timeframe < 1_block
THEN: push_telegram + push_discord + email_security_team
SEVERITY: P0
COOLDOWN: 0 (每次都告警)
RULE: WHALE_SELL_ALERT
WHEN: top20_holder_net_sell > 3_consecutive_days
THEN: push_discord + dashboard_flag
SEVERITY: P2
COOLDOWN: 24h
RULE: PRICE_ANOMALY
WHEN: price_change_1h > 50% AND volume_spike > 10x
THEN: push_telegram + pause_oracle_dependent_features
SEVERITY: P1
COOLDOWN: 1h
═══════════════════════════════════════════════════════════
告警分级与响应矩阵
| 级别 | 响应时间 | 通知渠道 | 自动动作 | 人工动作 |
|---|---|---|---|---|
| P0 | 即时 | Telegram+电话+Discord | 暂停交易/提款 | 安全团队集合 |
| P1 | < 1 小时 | Telegram+Discord | 标记风险 | 安全团队评估 |
| P2 | < 24 小时 | Discord+邮件 | Dashboard 标记 | 下次会议讨论 |
核心 SQL — LP 异常监控
-- 项目5.3 Task 2: 监控大额 LP 移除事件
WITH recent_lp_events AS (
SELECT
contract_address as pool,
evt_block_time,
CASE
WHEN evt_tx_hash IN (
SELECT evt_tx_hash FROM uniswap_v3_ethereum.NonfungibleTokenPositionManager_evt_DecreaseLiquidity
) THEN 'remove'
ELSE 'add'
END as action,
liquidity
FROM uniswap_v3_ethereum.NonfungibleTokenPositionManager_evt_DecreaseLiquidity
WHERE evt_block_time >= NOW() - INTERVAL '24' HOUR
),
pool_totals AS (
SELECT
pool,
SUM(CASE WHEN action = 'remove' THEN liquidity ELSE 0 END) as removed,
SUM(liquidity) as total_activity
FROM recent_lp_events
GROUP BY pool
)
SELECT
pool,
removed,
total_activity,
ROUND(100.0 * removed / NULLIF(total_activity, 0), 1) as removal_pct,
CASE
WHEN 100.0 * removed / NULLIF(total_activity, 0) > 50
THEN '🔴 P0 - 大规模 LP 移除'
WHEN 100.0 * removed / NULLIF(total_activity, 0) > 30
THEN '🟠 P1 - 显著 LP 移除'
ELSE '🟢 正常'
END as alert_level
FROM pool_totals
WHERE 100.0 * removed / NULLIF(total_activity, 0) > 30
ORDER BY removal_pct DESC
核心 SQL — 价格异常检测
-- 价格异常波动检测
WITH hourly_prices AS (
SELECT
token_bought_symbol as token,
DATE_TRUNC('hour', block_time) as hour,
AVG(amount_usd / NULLIF(token_bought_amount, 0)) as avg_price
FROM dex.trades
WHERE block_time >= NOW() - INTERVAL '48' HOUR
AND blockchain = 'ethereum'
AND amount_usd > 100
GROUP BY 1, 2
),
price_changes AS (
SELECT
token,
hour,
avg_price,
LAG(avg_price) OVER (PARTITION BY token ORDER BY hour) as prev_price,
ROUND(100.0 * (avg_price - LAG(avg_price) OVER (PARTITION BY token ORDER BY hour))
/ NULLIF(LAG(avg_price) OVER (PARTITION BY token ORDER BY hour), 0), 1) as pct_change
FROM hourly_prices
)
SELECT
token,
hour,
avg_price,
prev_price,
pct_change,
CASE
WHEN ABS(pct_change) > 50 THEN '🔴 P1 - 价格异常'
WHEN ABS(pct_change) > 20 THEN '🟡 P2 - 价格波动'
ELSE '🟢 正常'
END as alert_level
FROM price_changes
WHERE ABS(pct_change) > 20
ORDER BY ABS(pct_change) DESC
LIMIT 50
Task 3:监控 Dashboard 原型
Dashboard 布局
监控 Dashboard 四象限布局:
═══════════════════════════════════════════════════════════
┌─────────────────────┬─────────────────────┐
│ 实时告警 Feed │ 异常指标概览 │
│ ├── P0: 🔴 0 条 │ ├── 24h 异常事件: 12│
│ ├── P1: 🟠 2 条 │ ├── LP 移除事件: 5 │
│ └── P2: 🟡 5 条 │ ├── 价格异常: 3 │
│ │ └── 大额转出: 4 │
│ [最新告警详情...] │ [趋势图表...] │
├─────────────────────┼─────────────────────┤
│ Top 风险 Token │ 大户动向追踪 │
│ ├── TOKEN_A: 🔴 82 │ ├── 鲸鱼净卖出: 3天│
│ ├── TOKEN_B: 🟠 65 │ ├── LP 移除: 2 笔 │
│ └── TOKEN_C: 🟡 45 │ └── 大额转入 CEX: 5│
│ │ │
│ [点击查看详情...] │ [地址列表...] │
└─────────────────────┴─────────────────────┘
═══════════════════════════════════════════════════════════
方向五完成总结
三个项目串联:
═══════════════════════════════════════════════════════════
实战 5.1 Rug Pull 检测
→ 事前防护:在买入前识别风险 Token
→ 产出:风险评分模型 + Token 扫描工具 PRD
实战 5.2 钓鱼防护
→ 交易时防护:在签名/授权时拦截钓鱼
→ 产出:钓鱼分类手册 + 钱包安全 PRD
实战 5.3 异常监控
→ 事后预警:在攻击发生时快速检测响应
→ 产出:告警规则 + 监控 Dashboard
安全防护时间线:
买入前 → Token 扫描(5.1)
交易时 → 钓鱼拦截(5.2)
持有中 → 异常监控(5.3)
PM 核心能力验证:
✅ 能设计安全评估模型
✅ 能设计安全产品功能(不牺牲 UX)
✅ 能设计监控运营体系
═══════════════════════════════════════════════════════════
面试题准备
Q: 协议被攻击了,你作为 PM 如何应对?
30 秒版本: 分三阶段 — (1) 前 10 分钟:确认攻击范围(哪些池/多少资金),启动紧急暂停(如果有 Pause 功能),在 Discord/Twitter 发第一条公告("我们发现异常,正在调查");(2) 前 1 小时:与安全团队确认攻击方式,评估是否可追回资金,发布详细声明(受影响范围+临时建议);(3) 后续:制定补偿方案,复盘根因,修复并审计,透明公开全过程。核心:速度>完美,先止血再治疗。
下一步
完成方向五后,推荐继续:
- 方向六 项目 6.1:DEX 协议竞品对比
- 方向七 项目 7.1:治理参与度分析