name: chain-forensics description: 用于区块链安全调查的链上分析和交易取证。提供追踪资金流向、识别可疑模式、MEV分析以及生成事件响应取证报告的能力。 allowed-tools: Read, Grep, Write, Bash, Edit, Glob, WebFetch, WebSearch
链分析/取证技能
用于安全调查和事件响应的专家级链上分析和交易取证。
能力
- 交易追踪:跨地址和协议追踪资金流向
- 模式检测:识别可疑模式(刷单交易、拉地毯骗局、三明治攻击)
- MEV分析:分析MEV活动和Flashbots捆绑交易
- 地址聚类:分组相关地址并识别所有权
- 跨链追踪:追踪跨链桥接的资产
- 取证报告:生成详细的调查报告
MCP/工具集成
| 工具 | 用途 | 参考 |
|---|---|---|
| Phalcon MCP | 交易分析,漏洞利用检测 | phalcon-mcp |
| whale-tracker-mcp | 大额交易监控 | whale-tracker |
| bicscan-mcp | 地址风险评分 | bicscan |
| dune-analytics-mcp | 自定义查询,分析 | dune |
| Etherscan MCP | 区块浏览器数据 | etherscan |
交易追踪
基础流向分析
# 获取交易详情
cast tx 0xTxHash --rpc-url $RPC
# 解码交易输入
cast 4byte-decode $(cast tx 0xTxHash --rpc-url $RPC | grep input)
# 通过Etherscan API获取内部交易
curl "https://api.etherscan.io/api?module=account&action=txlistinternal&txhash=0xTxHash&apikey=$KEY"
使用Tenderly/Phalcon追踪
// Phalcon追踪分析
const trace = await phalcon.analyzeTransaction(txHash);
// 识别关键流向
const flows = {
valueTransfers: trace.transfers.filter(t => t.value > 0),
tokenTransfers: trace.erc20Transfers,
internalCalls: trace.calls.filter(c => c.type === 'CALL'),
delegateCalls: trace.calls.filter(c => c.type === 'DELEGATECALL')
};
地址分析
档案构建
const addressProfile = {
address: '0x...',
// 基础指标
metrics: {
firstTransaction: '2022-01-15',
transactionCount: 1234,
uniqueInteractions: 56,
totalValueTransferred: '1000 ETH'
},
// 活动模式
patterns: {
activeHours: [14, 15, 16], // UTC小时
frequentProtocols: ['Uniswap', 'Aave'],
averageTxFrequency: '5/天'
},
// 风险指标
riskFlags: {
tornadoCashInteraction: false,
sanctionedAddressInteraction: false,
knownExploitPattern: false,
highFrequencyTrading: true
},
// 相关地址
clusters: [
{ address: '0x...', confidence: 0.95, reason: '资金来源' },
{ address: '0x...', confidence: 0.8, reason: '共同收款方' }
]
};
聚类启发式方法
- 存款地址复用:跨交易所使用相同的存款地址
- 多输入交易:在单笔交易中一起使用的地址
- 时序分析:协调的交易时间
- 金额模式:匹配的金额减去手续费
- 合约交互:共享的智能合约使用模式
MEV分析
三明治攻击检测
-- Dune Analytics查询用于三明治攻击检测
WITH potential_sandwiches AS (
SELECT
block_number,
transaction_index,
"from",
"to",
value,
LAG("from") OVER (PARTITION BY block_number ORDER BY transaction_index) as prev_from,
LEAD("from") OVER (PARTITION BY block_number ORDER BY transaction_index) as next_from
FROM ethereum.transactions
WHERE block_number > {{start_block}}
)
SELECT *
FROM potential_sandwiches
WHERE prev_from = next_from
AND prev_from != "from"
-- 针对DEX交互的额外过滤器
Flashbots捆绑交易分析
// 分析flashbots捆绑交易
const bundleAnalysis = {
bundleHash: '0x...',
transactions: [
{ index: 0, type: '前置交易', profit: '0.5 ETH' },
{ index: 1, type: '受害者交易', loss: '0.3 ETH' },
{ index: 2, type: '后置交易', profit: '0.4 ETH' }
],
totalMEV: '0.9 ETH',
miner: '0x...',
minerPayment: '0.45 ETH'
};
可疑模式检测
拉地毯骗局指标
const rugpullIndicators = {
// 合约分析
contract: {
hasHiddenMint: true, // 所有者可以无限增发
hasDisableTrading: true, // 可以禁用卖出
hasBlacklist: true, // 可以封禁地址
highOwnershipConcentration: true, // >50%集中在少数钱包
unverifiedContract: true,
recentDeployment: true // <7天新部署
},
// 代币指标
tokenMetrics: {
liquidityLocked: false,
lockDuration: 0,
holderCount: 50,
top10HoldersPercent: 85
},
// 交易模式
tradingPatterns: {
artificialVolume: true, // 检测到刷单交易
sellPressure: '高',
buyWallsArtificial: true
},
riskScore: 95 // 0-100
};
刷单交易检测
-- 识别循环交易
WITH transfers AS (
SELECT
"from",
"to",
contract_address,
value,
block_time
FROM erc20_ethereum.evt_Transfer
WHERE contract_address = {{token_address}}
AND block_time > NOW() - INTERVAL '7 days'
)
SELECT
a."from" as trader,
COUNT(DISTINCT b."to") as counterparties,
SUM(a.value) as total_volume,
COUNT(*) as trade_count
FROM transfers a
JOIN transfers b ON a."to" = b."from" AND a."from" = b."to"
WHERE a.block_time < b.block_time
AND b.block_time < a.block_time + INTERVAL '1 hour'
GROUP BY a."from"
HAVING COUNT(*) > 10
ORDER BY total_volume DESC
跨链追踪
桥接交易映射
const crossChainTrace = {
originChain: 'ethereum',
originTx: '0x...',
originAddress: '0x...',
bridge: 'Wormhole',
bridgeMessage: '0x...',
destinationChain: 'arbitrum',
destinationTx: '0x...',
destinationAddress: '0x...',
amount: '100 USDC',
timestamp: {
origin: '2024-01-15T10:00:00Z',
destination: '2024-01-15T10:15:00Z'
}
};
多链地址映射
// 跨链追踪地址
const multiChainProfile = {
primaryAddress: '0x...',
chainPresence: {
ethereum: { address: '0x...', balance: '10 ETH', txCount: 500 },
arbitrum: { address: '0x...', balance: '5 ETH', txCount: 200 },
optimism: { address: '0x...', balance: '3 ETH', txCount: 100 },
polygon: { address: '0x...', balance: '1000 MATIC', txCount: 50 }
},
bridgeHistory: [
{ from: 'ethereum', to: 'arbitrum', amount: '5 ETH', date: '2024-01-10' },
{ from: 'ethereum', to: 'optimism', amount: '3 ETH', date: '2024-01-12' }
]
};
取证报告模板
# 区块链取证调查报告
## 执行摘要
- **调查ID**: INV-2024-XXX
- **日期范围**: 2024-01-01 至 2024-01-15
- **调查对象**: [地址/协议/事件]
- **结论**: [简要发现]
## 关键发现
### 1. 资金流向分析
[资金流动的图表和描述]
### 2. 地址归属
| 地址 | 归属 | 置信度 | 证据 |
|---------|-------------|------------|----------|
| 0x... | 攻击者 | 高 | 资金模式 |
| 0x... | 混币器 | 中 | Tornado Cash |
| 0x... | 交易所 | 高 | 已知存款地址 |
### 3. 时间线
| 时间戳 | 事件 | 地址 | 金额 |
|-----------|-------|-----------|--------|
| T+0 | 初始漏洞利用 | 0x... | 1000 ETH |
| T+1h | 资金归集 | 0x... | 1000 ETH |
| T+2h | 混币器存款 | Tornado | 100 ETH |
### 4. 攻击向量
[事件发生的技术描述]
### 5. 总影响
- 损失资金: $X
- 受影响用户: Y
- 被利用合约: Z
## 附录
- 完整交易列表
- 地址聚类数据
- 支持证据
流程集成
此技能与以下集成:
incident-response-exploits.js- 漏洞利用调查economic-simulation.js- 市场影响分析smart-contract-security-audit.js- 审计后监控
工具参考
| 工具 | 用途 | URL |
|---|---|---|
| Etherscan | 区块浏览器,API | etherscan.io |
| Dune Analytics | 自定义查询 | dune.com |
| Nansen | 钱包标签,资金流向 | nansen.ai |
| Arkham Intelligence | 实体归属 | arkhamintelligence.com |
| Chainalysis Reactor | 调查平台 | chainalysis.com |
| TRM Labs | 风险评分 | trmlabs.com |
| Phalcon | 交易分析 | phalcon.blocksec.com |
另请参阅
agents/incident-response/AGENT.md- 事件指挥官代理skills/bug-bounty/SKILL.md- 漏洞披露协调incident-response-exploits.js- 完整事件处理流程