prettydeath/coinjoin-tracer

GitHub: prettydeath/coinjoin-tracer

基于公开链上数据的比特币 CoinJoin 混币交易取证与去匿名化分析工具。

Stars: 0 | Forks: 0

# coinjoin-tracer **Bitcoin CoinJoin 取证 —— Whirlpool 与 Wasabi 检测、匿名性评分,以及基于公开链上数据的混币后去匿名化。** ![python](https://img.shields.io/badge/python-3.9%2B-blue) ![license](https://img.shields.io/badge/license-MIT-green) ![data](https://img.shields.io/badge/data-mempool.space-informational) ![status](https://img.shields.io/badge/status-research-orange) `coinjoin-tracer` 接收一个 Bitcoin 交易 ID 或地址,并分析其 参与 **Samourai Whirlpool** 和 **Wasabi** (ZeroLink / WabiSabi) CoinJoin 的情况。它会对混币过程进行分类,对实际达成的匿名性进行评分,剖析 Whirlpool Tx0 的“有毒零钱”,并且——最实用的功能是——找出会破坏混币效果的**混币后合并**交易。它仅使用通过无需密钥的 mempool.space API 获取的**公开**数据,并且不会破坏任何加密体系。 ## 关于 CoinJoin 将等值的比特币集中在一起以混淆输入→输出的映射关系,但这种隐私非常脆弱:金额不等的零钱、地址重复使用,尤其是**随后将混币后的比特币一起花费**都会重新建立关联。`coinjoin-tracer` 能够检测出混币交易并准确暴露出这些错误。完整背景信息请参阅:[`ABOUT.md`](ABOUT.md)。 ## 目录 - [关于](#about) - [工作原理](#how-it-works) - [安装](#install) - [配置](#configure) - [用法](#usage) - [交易 — `tx`](#transactions--tx) - [地址 — `address`](#addresses--address) - [输出](#output) - [项目结构](#project-layout) - [方法论](#methodology) - [局限性](#limitations) - [法律与伦理](#legal--ethics) - [许可证](#license) ## 工作原理 Bitcoin CoinJoin 具有可识别的**结构指纹**: | 类型 | 指纹 | |------|-------------| | Whirlpool 混币 | 5 个输入,5 个输出,全部等于资金池面额 (0.001/0.01/0.05/0.5 BTC) | | Whirlpool Tx0 | 资金池面额的预混币输出 + 协调员费用 + 非面额的**有毒零钱** | | JoinMarket | 少量 (3–15) 等额输出 + 一组数量相近的零钱输出,无协调员费用 | | Wasabi 1.0 | 大规模轮次,包含大量完全相同的输出(基础约 0.1 BTC) | | Wasabi 2.0 | 大规模轮次,其输出大多为 WabiSabi 标准面额 | 一个极小值(dust floor)下限排除了 inscription / Runes 批量交易,这些交易同样包含大量等值输出,但金额极小。随后,该工具会衡量**匿名性**(单笔输出的匿名集、确定性关联、组合匿名比特),隔离出**有毒零钱**,并将**共同输入所有权**启发式算法应用于非 CoinJoin 花费,以检测**混币后合并**——即当混币后的比特币被合并使用,导致混币效果被抵消的情况。 完整说明请参阅:[`docs/METHODOLOGY.md`](docs/METHODOLOGY.md)。 ## 安装 ``` git clone https://github.com/prettydeath/coinjoin-tracer.git cd coinjoin-tracer python -m pip install -r requirements.txt # or: pip install -e . ``` 需要 Python 3.9+ 和 `requests`。无需 API 密钥(mempool.space 是免密钥的)。 ## 配置 配置是**可选的**——该工具开箱即用,可直接对接 mempool.space。如需使用自定义 endpoint 或 blockchair 密钥以获得更高的速率限制: ``` cp config/api.csv.example config/api.csv ``` ``` setting,value base_url,https://mempool.space/api blockchair_key, ``` 目标可以通过命令行传入,也可以通过带有 `value` 列的 CSV 文件传入(参见 `config/txids.csv.example`、`config/addresses.csv.example`)。 ## 用法 所有命令:`python -m coinjoin_tracer ...`(如果已安装,则为 `coinjoin-tracer `)。 ### 交易 — `tx` 对交易进行分类,对匿名性进行评分,并剖析 Whirlpool Tx0: ``` python -m coinjoin_tracer tx [ ...] --out-dir out/tx python -m coinjoin_tracer tx --txids-csv config/txids.csv --out-dir out/tx --trace-change ``` `--trace-change` 会向前追踪 Tx0 的有毒零钱一跳。 ### 地址 — `address` 分析地址的 CoinJoin 参与情况、钱包集群 (CIOH) 以及混币后合并事件: ``` python -m coinjoin_tracer address --out-dir out/addr python -m coinjoin_tracer address --addresses-csv config/addresses.csv --out-dir out/addr --max-txs 60 ``` `--shallow` 跳过输入来源查找(速度更快,但不进行合并检查)。 ### 寻找真实交易进行分析 `tools/find_coinjoins.py` 会扫描指定的区块范围,并列出它发现的 CoinJoin,这样您就可以将真实的 txid 提供给上述命令。它会在运行过程中将结果写入 CSV,并可以通过状态文件从中断的扫描处恢复继续。 ``` python tools/find_coinjoins.py --start-height 833000 --blocks 200 \ --limit 10 --out found_coinjoins.csv # 仅限 Whirlpool mixes: python tools/find_coinjoins.py --start-height 720000 --blocks 500 \ --types whirlpool_mix --out whirlpool.csv ``` ### 常用选项 | 标志 | 含义 | |------|---------| | `--out-dir` | 写入 CSV 报告文件的目录 | | `--api-csv` | 包含 `base_url` / `blockchair_key` 的可选 CSV | | `--max-txs` (address) | 每个地址扫描的最大交易数(默认为 40) | | `--trace-change` (tx) | 向前追踪 Whirlpool Tx0 的有毒零钱 | ## 输出 每个命令都会在控制台打印一份摘要,并在使用 `--out-dir` 时写入纯 **CSV** 文件。 **`tx`** → `detections.csv`, `entropy.csv`, `tx0_breakdown.csv`, `tx0_change_trace.csv` **`address`** → `participations.csv`, `post_mix_consolidations.csv`, `wallet_cluster_cioh.csv`, `address_summary.csv` 示例输出位于 [`examples/`](examples/)。 ## 项目结构 ``` coinjoin-tracer/ ├── coinjoin_tracer/ # Python package │ ├── constants.py # pool denoms, Wasabi params, labels │ ├── config.py # CSV loaders (optional API settings, targets) │ ├── api.py # keyless Bitcoin client (mempool.space + blockchair) │ ├── detect.py # CoinJoin type detection (Whirlpool/Wasabi) │ ├── entropy.py # anonymity-set & entropy metrics │ ├── tx0.py # Whirlpool Tx0 entry + toxic-change trace │ ├── cluster.py # CIOH clustering & post-mix consolidation │ ├── report.py # CSV report writers │ └── cli.py # argparse CLI (tx / address) ├── tools/find_coinjoins.py # scan a block range for real CoinJoins (resumable) ├── config/ # *.example CSVs (real files are git-ignored) ├── examples/ # sample CSV outputs + walkthrough ├── docs/METHODOLOGY.md # detection fingerprints, entropy, heuristics ├── ABOUT.md ├── requirements.txt ├── pyproject.toml └── LICENSE ``` ## 方法论 有关检测指纹、匿名性指标以及 CIOH / 合并启发式算法,请参阅 [`docs/METHODOLOGY.md`](docs/METHODOLOGY.md)。 ## 局限性 - **检测是可靠的;关联则是概率性的。** 请辅证调查线索。 - **Wasabi 2.0** 避免了等额输出,因此其单笔输出的匿名性是一个较弱的信号;不过合并分析依然适用。 - **1 跳**有毒零钱追踪;更深的链需要多次运行。 - **协调员已停止服务**(Whirlpool 于 2024 年 4 月,Wasabi 于 2024 年 6 月)——分析主要基于历史数据,但每一笔交易都依然留在链上可供读取。 - **速率限制。** 公开浏览器会进行节流;大型地址最多扫描至 `--max-txs`。 ## 法律与伦理 仅用于基于**公开**区块链数据的合法合规、调查和学术目的。您有责任遵守所有适用法律以及任何数据提供商的服务条款。本工具不执行任何黑客操作,不利用任何漏洞,也不会泄露任何链上原本未公开的内容。 ## 许可证 [MIT](LICENSE)
标签:CoinJoin追踪, GitHub, Python, 区块链分析, 匿名溯源, 数据取证, 无后门, 比特币, 逆向工具