返回实战项目
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:基于图分析的女巫检测