Day 10
【实战4.1】女巫地址识别规则设计:风险评分系统
分析女巫地址行为特征,设计多维度风险评分系统,用Dune SQL识别可疑地址集群,构建反女巫评分模型
2026-03-20
实战项目Dune女巫检测Sybil风险评分空投安全
实战项目 4.1:女巫地址识别规则设计
项目信息
项目编号:4.1
所属方向:反女巫检测
难度:⭐⭐⭐⭐ 高级
预计时间:5-6小时
前置技能:空投设计(实战3.1)、用户分群(实战1.1)
项目目标
设计一套女巫风险评分系统,能够基于链上行为自动识别可疑地址
产出清单:
├── ✅ 女巫特征分析报告
├── ✅ 可疑地址识别 Dashboard(Dune SQL)
└── ✅ 反女巫评分系统设计
Task 1:女巫特征分析
女巫行为画像
典型女巫工作室操作流程:
═══════════════════════════════════════════════════════════
Step 1:批量创建钱包
CEX 提款 → 分发合约 → 100+ 子钱包
特征:同一时间窗口创建、初始资金来源相同
Step 2:脚本化交互
所有钱包按相同顺序执行操作:
├── Bridge 到 L2
├── Swap Token A → B
├── 添加 LP
├── Mint NFT
└── 治理投票
特征:操作序列高度一致、时间间隔规律
Step 3:保持最低活跃
每月执行 1-2 笔交易,维持"活跃"状态
特征:活跃模式极其规律(如每月 1 号交易)
Step 4:空投到手后
所有钱包同时 claim → 转到同一地址 → 卖出
特征:claim 时间集中、资金归集明显
═══════════════════════════════════════════════════════════
核心 SQL — 识别同源资金地址
-- 项目4.1 Task 1: 识别从同一地址批量接收 ETH 的钱包群
-- 这是女巫最常见的特征:一个"母钱包"给多个"子钱包"转 Gas
WITH funding_patterns AS (
SELECT
"from" as funder,
"to" as funded_wallet,
value / 1e18 as eth_amount,
block_time,
COUNT(*) OVER (PARTITION BY "from") as wallets_funded_by_same_source
FROM ethereum.transactions
WHERE block_time >= NOW() - INTERVAL '90' DAY
AND value > 0
AND value / 1e18 BETWEEN 0.005 AND 0.1 -- 典型 Gas 转账范围
AND gas_used < 25000 -- 简单转账
),
suspicious_funders AS (
SELECT
funder,
COUNT(DISTINCT funded_wallet) as num_wallets_funded,
MIN(block_time) as first_funding,
MAX(block_time) as last_funding,
AVG(eth_amount) as avg_funding_amount,
STDDEV(eth_amount) as funding_amount_stddev,
DATE_DIFF('minute', MIN(block_time), MAX(block_time)) as funding_span_minutes
FROM funding_patterns
GROUP BY funder
HAVING COUNT(DISTINCT funded_wallet) >= 10 -- 给 10+ 个钱包转过 Gas
)
SELECT
funder,
num_wallets_funded,
ROUND(avg_funding_amount, 4) as avg_eth_per_wallet,
ROUND(funding_amount_stddev, 4) as amount_stddev,
funding_span_minutes,
CASE
WHEN num_wallets_funded >= 50 AND funding_span_minutes < 60
THEN '极高风险 - 批量创建'
WHEN num_wallets_funded >= 20
THEN '高风险 - 可能女巫'
ELSE '中风险 - 需人工审核'
END as risk_level
FROM suspicious_funders
ORDER BY num_wallets_funded DESC
LIMIT 100
核心 SQL — 行为同步检测
-- 项目4.1 Task 1: 检测多个地址在短时间内执行相同操作
-- 女巫特征:多地址同时 swap 相同 Token
WITH swap_events AS (
SELECT
taker,
token_bought_symbol,
token_sold_symbol,
DATE_TRUNC('hour', block_time) as swap_hour,
block_time
FROM dex.trades
WHERE block_time >= NOW() - INTERVAL '30' DAY
AND blockchain = 'ethereum'
AND project = 'uniswap'
),
hourly_pattern AS (
SELECT
swap_hour,
token_bought_symbol,
token_sold_symbol,
COUNT(DISTINCT taker) as unique_swappers,
ARRAY_AGG(DISTINCT taker) as swapper_list
FROM swap_events
GROUP BY 1, 2, 3
HAVING COUNT(DISTINCT taker) >= 5
),
-- 找到在多个小时内重复出现的"同步交易组"
repeated_groups AS (
SELECT
a.swapper_list,
COUNT(*) as times_synced,
MIN(a.swap_hour) as first_sync,
MAX(a.swap_hour) as last_sync
FROM hourly_pattern a
INNER JOIN hourly_pattern b
ON a.swapper_list = b.swapper_list
AND a.swap_hour <> b.swap_hour
GROUP BY a.swapper_list
HAVING COUNT(*) >= 3 -- 同步 3 次以上
)
SELECT
times_synced,
CARDINALITY(swapper_list) as group_size,
first_sync,
last_sync
FROM repeated_groups
ORDER BY times_synced DESC
LIMIT 50
Task 2:风险评分系统设计
多维度评分模型
女巫风险评分系统 v1.0
═══════════════════════════════════════════════════════════
总分 = 高风险信号 + 中风险信号 - 正向信号
━━━ 高风险信号(每项 +30-50 分)━━━
H1: 资金来源聚类(+50 分)
同一"母钱包"给 10+ 地址转 Gas
检测方法:资金转入图谱分析
H2: 行为时间同步(+40 分)
与 5+ 地址在 10 分钟内执行相同操作
检测方法:交易时间戳聚类
H3: 合约创建的钱包(+30 分)
通过工厂合约批量创建
检测方法:creation_traces 检查
H4: 资金归集(+50 分)
多地址最终将资金转到同一地址
检测方法:转出目标地址聚合
━━━ 中风险信号(每项 +10-20 分)━━━
M1: 首笔交易即交互目标协议(+15 分)
钱包创建后立刻使用"被空投"的协议
正常用户通常有其他交互历史
M2: 只完成最低要求(+20 分)
恰好满足空投资格门槛,不多做一步
如:恰好 3 笔交易、恰好 3 个月活跃
M3: 规律性活跃模式(+15 分)
每月固定日期交易 1 笔(脚本行为)
正常用户活跃模式随机
M4: 极低 Gas 使用效率(+10 分)
每笔交易金额极小但 Gas 成本高
说明在"刷交互"而非真实需求
M5: 休眠后精准活跃(+15 分)
快照日前突然活跃,快照后立即停止
━━━ 正向信号(每项 -10 到 -30 分)━━━
P1: ENS 域名持有(-15 分)
持有 ENS = 投入成本(年费)+ 身份绑定
P2: Gitcoin Passport 高分(-20 分)
多平台验证 = 真人概率高
P3: 链上历史 > 1 年(-10 分)
长期活跃 = 不太可能是临时女巫
P4: NFT 收藏(-10 分)
持有非金融类 NFT(PFP/艺术品)
P5: DAO 治理参与(-15 分)
在多个 DAO 投过票
P6: DeFi 深度使用(-20 分)
借贷+LP+质押多种操作 = 真实用户
━━━ 判定阈值 ━━━
0-30 分:🟢 低风险(通过)
31-50 分:🟡 中风险(人工审核)
51-80 分:🟠 高风险(大概率女巫)
81+ 分:🔴 确认女巫(拒绝空投)
═══════════════════════════════════════════════════════════
核心 SQL — 综合评分查询
-- 项目4.1 Task 2: 女巫风险评分(简化版)
WITH wallet_features AS (
SELECT
taker as wallet,
COUNT(*) as total_trades,
COUNT(DISTINCT DATE_TRUNC('day', block_time)) as active_days,
COUNT(DISTINCT DATE_TRUNC('month', block_time)) as active_months,
SUM(amount_usd) as total_volume,
MIN(block_time) as first_trade,
COUNT(DISTINCT token_bought_symbol) as unique_tokens,
STDDEV(EXTRACT(DAY FROM block_time)) as day_of_month_stddev
FROM dex.trades
WHERE block_time >= NOW() - INTERVAL '365' DAY
AND blockchain = 'ethereum'
GROUP BY taker
),
scored AS (
SELECT
wallet,
total_trades,
active_days,
total_volume,
-- 中风险信号
CASE WHEN total_trades <= 5 AND active_months >= 3
THEN 20 ELSE 0 END as minimal_activity_score,
CASE WHEN day_of_month_stddev < 2
THEN 15 ELSE 0 END as regularity_score,
CASE WHEN total_volume < 100 AND total_trades >= 3
THEN 10 ELSE 0 END as low_value_score,
-- 正向信号
CASE WHEN first_trade < NOW() - INTERVAL '365' DAY
THEN -10 ELSE 0 END as history_bonus,
CASE WHEN unique_tokens >= 10
THEN -20 ELSE 0 END as diversity_bonus,
CASE WHEN total_volume >= 10000
THEN -15 ELSE 0 END as volume_bonus
FROM wallet_features
)
SELECT
wallet,
total_trades,
active_days,
total_volume,
(minimal_activity_score + regularity_score + low_value_score
+ history_bonus + diversity_bonus + volume_bonus) as risk_score,
CASE
WHEN (minimal_activity_score + regularity_score + low_value_score
+ history_bonus + diversity_bonus + volume_bonus) >= 51
THEN '🔴 高风险'
WHEN (minimal_activity_score + regularity_score + low_value_score
+ history_bonus + diversity_bonus + volume_bonus) >= 31
THEN '🟡 中风险'
ELSE '🟢 低风险'
END as risk_level
FROM scored
WHERE (minimal_activity_score + regularity_score + low_value_score
+ history_bonus + diversity_bonus + volume_bonus) >= 20
ORDER BY risk_score DESC
LIMIT 200
Task 3:评分系统验证与优化
验证方法
评分系统验证框架:
═══════════════════════════════════════════════════════════
1. 已知女巫回测
用 LayerZero 公开的女巫列表验证
├── 覆盖率:我们的系统能识别多少已知女巫?
├── 目标:覆盖率 > 80%
└── 如果 < 80% → 补充缺失的检测维度
2. 误杀率检测
随机抽取 100 个"高风险"地址,人工审核
├── 误杀率:有多少其实是正常用户?
├── 目标:误杀率 < 10%
└── 如果 > 10% → 调高阈值或增加正向信号权重
3. 边界案例分析
分析 31-50 分(中风险)区间的地址
├── 这些地址的行为有什么共性?
├── 能否增加新的维度来区分?
└── 中风险区间是人工审核重点
4. 对抗性测试
思考:如果你是女巫工作室,如何绕过这个系统?
├── 对策1:随机化操作时间 → 增加行为序列检测
├── 对策2:买 ENS 刷正向分 → 限制正向信号上限
└── 对策3:使用不同资金来源 → 交叉链分析
═══════════════════════════════════════════════════════════
评分系统优化方向
| 版本 | 新增能力 | 预期效果 |
|---|---|---|
| v1.0 | 基础规则评分 | 覆盖 60% 女巫 |
| v1.1 | + 资金流图谱 | 覆盖 75% |
| v2.0 | + ML 异常检测 | 覆盖 85% |
| v2.1 | + 跨链行为分析 | 覆盖 90% |
面试题准备
Q: 设计一个防女巫方案,如何平衡安全性和用户体验?
30 秒版本: 分层处理 — (1) 自动过滤明显的批量地址(同源资金+同步行为),这一步零用户感知;(2) 风险评分为灰色地带地址打分,高风险直接拒绝,中风险进入人工审核;(3) 正向验证让用户通过 Gitcoin Passport / ENS 等方式自证非女巫,这一步用户主动参与。核心原则:宁可漏过一些女巫,也不要误杀真实用户 — 误杀的负面口碑远大于漏过女巫的损失。
下一步
完成本项目后,推荐继续:
- 项目 4.2:社区驱动的女巫猎人机制
- 项目 4.3:基于图分析的女巫检测