gl0bal01/chainmap
GitHub: gl0bal01/chainmap
一个零后端、零构建步骤的纯客户端 EVM 资金流向图谱探索器,通过可视化方式辅助链上交易调查与区块链学习。
Stars: 0 | Forks: 0
# chainmap
[](https://github.com/gl0bal01/chainmap/actions/workflows/ci.yml)
**English** · [Français](README.fr.md)
粘贴一个地址 → chainmap 将通过 Etherscan v2 API 获取其交易记录,并绘制一个
有向的**地址 → 地址**图,按你选择的深度进行广度优先扩展。然后它
在此之上叠加了调查工具:过滤器、边捆绑、合约调用解码、环路
检测、汇集/发散中心,以及每个节点的风险评分。
- **完全客户端运行** — 无后端、无构建步骤、无遥测。
- **你的 API key 和数据都保留在你的浏览器中。** 唯一会被联系的外部站点是
`api.etherscan.io`,这由严格的内容安全策略 (Content-Security-Policy) 强制执行。
- **英语 + 法语**,完全本地化。
- **237 个单元/集成测试** 覆盖了不依赖 DOM 的核心逻辑。

## 目录
- [快速开始](#quick-start)
- [功能](#features)
- [了解区块链的工作原理](#learn-how-blockchains-work)
- [架构](#architecture)
- [隐私、安全与道德](#privacy-security--ethics)
- [开发与测试](#development--tests)
- [支持的链](#supported-chains)
## 快速开始
零安装 — 它是原生的 ES modules。
```
git clone https://github.com/gl0bal01/chainmap.git && cd chainmap
python3 -m http.server 8000
# 打开 http://localhost:8000/
```
**没有 API key?** 点击 **Demo mode** — 它会加载一个内置的示例调查,让你可以
立即探索所有功能。
**实时扫描:** 在 获取一个免费的 key → *API Keys*,将其粘贴到 UI 中,
选择一条链,粘贴一个地址,点击 **Start**。一个 key 即可跨所有受支持的链使用
(Etherscan v2 是一个统一的多链 endpoint)。
## 功能
- **BFS 扩展** — 从一个根地址递归扩展到任何深度,具有每个地址的采样
大小限制、严格的安全上限,以及一个能真正中止正在进行的请求的 **Stop** 功能。
- **三大交易 (tx) 族** — 普通、内部以及 ERC-20/721/1155 token 转账,每种都有
一条不同颜色的边。
- **Calldata 解码** — 4-byte selector → 人类可读的方法名 + 解码后的主要参数,因此
`transfer()` 的真实接收者(隐藏在 calldata 中)会被展现出来。
- **降噪** — 金额/日期/零值/垃圾信息过滤器,以及边捆绑(将
多次 A→B 转账折叠为一个加权的箭头)。
- **调查图层** — 往返(环路)检测、汇集/发散中心、按时间着色、
已知地址标签,以及一个*可解释的*单节点风险评分。
- **链探测器** — 粘贴任何地址;它会在你扫描前告诉你链的类型
(或非 EVM)。
- **导出** — PNG、PDF 和 CSV(内置了采样说明)。支持保存/加载工作区。
- **设计上的诚实** — 使用大整数金额(绝不使用浮点数),剔除失败的交易 (txs),
并在各处体现采样状态。
## 了解区块链的工作原理
chainmap 还可以作为一个**实践课程**。每一个区块链概念 — 账户、三大
交易族、基础单位与小数位、calldata、token 标准、BFS 图、
采样、失败的 txs、多链以及调查启发法 — 都映射到你可以在工具中*看到并操作*的事物,并包含 **8 个指导性实验**。
📚 **[完整课程 + 实验指南 → docs/LEARN.md](docs/LEARN.md)** · **[法语版 → docs/LEARN.fr.md](docs/LEARN.fr.md)**
## 架构
原生的 ES modules,**无打包工具**。设计原则是:**`graphStore` 是唯一的
事实来源。** 每一次状态变更都会通过它进行;它会发出事件;渲染层通过订阅将其镜像到 vis-network DataSets 中。过滤器/图层是覆盖在该镜像之上的*显示投影*
(vis `DataView`s),因此即使视图被过滤,store 也始终持有完整的图以供 CSV/详情使用。
```
BFS scan ──► graphStore (truth) ──emits events──► render/network ──► vis DataViews ──► canvas
▲ │ ▲
etherscanClient ui.js / main.js (composition root) filters · bundling · overlays
▲
rateLimiter
```
对正确性要求极高的核心逻辑是**不依赖 DOM 的,并在 Node 中进行了单元测试** (`format`、
`etherscanClient`、`graphStore`、`scanner`、`display`、`roundTrips`、`riskScore`、…)。
DOM/vis 层 (`render/*`、`ui.js`) 非常轻量。请参阅 [`INTERFACES.md`](INTERFACES.md) 了解
固定的模块契约。
## 隐私、安全与道德
- **除了对 `api.etherscan.io` 的调用外,不会有任何数据离开你的浏览器** — 没有后端、代理、
分析工具或第三方信标。你可以在 DevTools → Network 中进行验证。
- **本地内置的库** (`vis-network`、`jsPDF`) — 无 CDN — 使用 **SRI (Subresource Integrity)** 固定版本。
严格的 **CSP** 将 `script-src` 限制为 `'self'`,将 `connect-src` 限制为
Etherscan API。
- **任何不受信任的字符串都不会触及 `innerHTML`** — 别名和 API token 符号都被渲染为
DOM 文本节点;该分析在构造上就是无法被 XSS 利用的。
- **OSINT 道德:** 该图只是一个**样本**,而非证据。公共链数据是化名的,
而不是匿名的,并且并不总是看起来像表面那样(伪造的 token 名称、粉尘攻击、交易所
综合钱包)。明确你的局限性;在下结论之前要进行佐证。
## 开发与测试
测试是**仅限开发使用的**(它们从不在生产环境中运行,也不是使用该应用程序所必需的)。
```
bun install # dev deps only (happy-dom, playwright-core)
bun test # 237 unit + integration tests
```
`bun test` 覆盖了不依赖 DOM 的模块(金额计算、去重 key、BFS 防护、失败 txs
过滤、环路检测、ABI 解码、风险评分、英/法文 key 对齐等),外加一个 happy-dom 集成测试,该测试针对模拟的 vis/fetch 驱动真实的 `main.js` 运行。CI 会在每次推送时运行该测试套件
以及供应商完整性检查(SRI + SHA-256)。
## 支持的链
Ethereum · Sepolia (testnet) · BNB Chain · Polygon · Arbitrum One · Optimism · Base ·
Avalanche C-Chain · Fantom. 添加一条链 = 只需在 `src/config.js` 中添加一个条目。
## 鸣谢
- 链探测器的区块链地址格式模式改编自 **[gl0bal01](https://github.com/gl0bal01)** 的 [`discord-osint-assistant`](https://github.com/gl0bal01/discord-osint-assistant)。
- 图形渲染由 [vis-network](https://github.com/visjs/vis-network) 提供;
- PDF 导出由 [jsPDF](https://github.com/parallax/jsPDF) 提供。
- 感谢 OiY 提供的点子 ;)
## 许可证
[MIT](LICENSE)
标签:ESC4, OSINT, Web前端, 以太坊, 区块链, 数据可视化