bobslayerX/crypttrace
GitHub: bobslayerX/crypttrace
一款 OSINT 加密货币调查 CLI 工具,通过追踪链上资金流向并标记已知实体来辅助被盗资金调查。
Stars: 4 | Forks: 0
# crypttrace
OSINT 加密货币调查 CLI。给它一个可疑地址;它会提取公开的链上历史记录,标记已知实体(交易所、混币器、受制裁钱包),评估风险,并追踪资金的流向——这一切都在你的终端中完成。
专为常见的调查流程而构建:*某人的加密货币被盗了,这是那个钱包,钱去哪儿了?*
## 安装
```
cd crypttrace
pip install -e .
export ETHERSCAN_API_KEY=xxxx # free key: https://etherscan.io/myapikey
```
一个 Etherscan v2 密钥即可适用于所有受支持的 EVM 链(eth、bsc、polygon、arbitrum、optimism、base)。
## 用法
```
# 这个地址是什么?(使用本地 label DB,离线工作)
crypttrace label 0x28c6c06298d514db089934071355e5743bf21d60
# 完整画像:balance、活动窗口、风险、主要 counterparties
crypttrace profile 0xADDRESS --chain eth
# 追踪资金流向深度 N hops,渲染为彩色树状图
crypttrace trace 0xADDRESS --chain eth --depth 4 --branching 3
# 追踪 token 而不是原生 ETH(大多数盗窃案件涉及 stablecoins)
crypttrace trace 0xADDRESS --asset usdt --depth 4
# 地址的 token 持有量,以 USD 计价
crypttrace tokens 0xADDRESS
# 谁为这个钱包支付了第一笔 gas?顺藤摸瓜追溯到 exchange/KYC 点
crypttrace funder 0xADDRESS --hops 6
# 这个地址是 exchange 的 deposit address 吗(cash-out / off-ramp)?
crypttrace offramp 0xADDRESS
# 完整的调查报告已保存到磁盘(Markdown + JSON)
crypttrace report 0xADDRESS --chain eth --asset usdt --depth 3
# 下载最新的 label 列表(OFAC sanctions 等)
crypttrace update-labels
# 支持的 chains
crypttrace chains
```
### 标签
该工具内置了一个小型的精选种子集(主要交易所、Tornado Cash、桥接器、著名的黑客事件)。运行 `crypttrace update-labels` 来拉取权威的公开列表——目前是 OFAC SDN 受制裁地址列表——并将它们合并到本地数据库中(缓存在 `~/.crypttrace/`)。发生冲突时,精选种子集始终优先,因此其更丰富的名称将被保留。可以在 `labels/labels.py` → `SOURCES` 中添加更多来源。
### 资产与 USD 价值
默认情况下,追踪器会跟随区块链的原生代币(ETH)。传入 `--asset` 以追踪 ERC-20 token——可以是已知代币符号(`usdt`、`usdc`、`dai`、`weth`、`wbtc`)或任何 `0x` 合约地址。由于当今大多数盗窃行为都会转移稳定币,因此 token 追踪至关重要。显示的金额将附带近似的 USD 价值(稳定币固定为 $1,其他货币通过 CoinGecko 定价;如果处于离线状态,USD 将显示为 `—`)。`tokens` 命令会列出某个地址的 token 持有量及其 USD 价值。
### 出金检测
当洗过的资金到达交易所时,它们会落入一个特定用户的*充值地址*(有数百万个,因此都不在标签列表中),然后该地址会将资金转发到交易所的热钱包。`crypttrace offramp` 通过行为来检测这一点:如果一个地址将其大部分流出价值转发给已标记的交易所,它就会被标记为可能的充值地址——即提现点,交易所在此持有存款人的 KYC。`trace` 会自动应用相同的启发式规则,将一个匿名的中转地址转变为“→ Binance 充值 (KYC 节点)”。
### 首笔资金提供者(去匿名化)
`crypttrace funder` 会向后追溯某个钱包的*资金提供*链接:谁发送了它的第一笔 gas 费,然后是谁为那个提供者提供了资金,依此类推。一个新创建的洗钱钱包必须从某个地方获得初始资金,而这条链条通常会在中心化交易所的提现处终止——这是一个 KYC 身份识别点,通过法律请求可以揭示所有者。这是将“不相关”的钱包关联回同一个控制者的核心基础操作。(使用外部交易;如果是通过内部合约调用首次获得资金的钱包,则需要内部交易数据,这是计划中的扩展功能。)
### 报告
`crypttrace report` 会运行全面的分析,并将一份独立完整的报告写入 `~/crypttrace-reports/`(使用 `--out` 覆盖)。每次运行都会生成两个文件:一份易于阅读的 Markdown 报告(包含评估、摘要、关键发现、交易对手、完整的资金流向追踪以及方法说明)和一个包含原始结构化数据的 `.json` 文件,以便进行进一步处理。
追踪输出示例:
```
⚪ 0xaaaa…0001 (victim)
├── ──50.00 (1 tx)──▶ ⚪ 0xbbbb…0002
│ └── ──48.00 (1 tx)──▶ 🟣 Tornado Cash: Router
│ └── ↳ trail ends here (identifiable entity — subpoena / off-chain)
└── ──10.00 (1 tx)──▶ 🟢 Binance 14 (hot wallet)
└── ↳ trail ends here (identifiable entity — subpoena / off-chain)
```
图例:🟢 交易所 · 🟣 混币器 · 🔴 受制裁/诈骗 · 🌉 桥接器 · ⚪ 未知
## 工作原理
区块链是公开的——每一笔交易都是可查询的。`crypttrace` 会:
1. 通过 Etherscan 获取地址的完整交易历史(缓存在 SQLite 中,因此重复追踪不会再次请求 API)。
2. 将地址与本地标签数据库(`labels/known.json`)进行匹配——包括交易所、Tornado Cash、桥接器、受制裁钱包。
3. 对于 `trace`,递归跟随最大的流出转账,直到到达可识别的实体(交易所/混币器/受制裁地址)为止——这就是 OSINT 的移交点。
## 诚实的局限性
- **假名性。** 你只能看到资金落入了 `0xABC`,而不知道谁拥有它。该工具将线索追踪到一个*身份识别点*(通常是进行了 KYC 的交易所)。最终的真实姓名来自于向该交易所发起的法律请求,而不是来自链上。
- **混币器会切断线索。** Tornado Cash / 隐私池会切断链上的联系。要在那里追回资金需要依赖时间/金额的启发式方法,且无法保证成功。
- **标签的准确性取决于数据库。** 这里的种子集很小。实际使用时意味着需要导入 OFAC SDN、Chainabuse 和交易所充值地址集合。
## 布局
```
src/crypttrace/
cli.py # typer CLI: profile / trace / label / chains
config.py # chains, API key, paths
fetchers/
etherscan.py # Etherscan v2 client + SQLite cache
labels/
known.json # seed label DB
labels.py # lookup + risk scoring
trace.py # recursive fund-flow tree
render.py # rich terminal rendering
```
## 路线图设想
- `watch` 命令:当受监视的地址转移资金时发出警报(telegram/webhook)
- `report --pdf`:将报告导出为 PDF,用于向交易所/警方提交申诉
- 跨链:通过桥接器跟踪价值到其他网络
- ERC-20 / 稳定币追踪(已通过 `get_token_txs` 获取数据)
- 实体聚类:gas 资金启发式算法,共同输入所有权(BTC)
- 更多标签来源:Chainabuse、CryptoScamDB、交易所充值地址集
标签:逆向工具