证据链模块 · Evidence Chain Module (Phase 8)¶
AstraSentinel · 星穹天巡 — 自动化电子证据采集、固定、锚定、评分与法律文书生成的端到端模块。
1. 设计目标¶
让证据从 「我们说它真」 升级到 「法庭判它真」 ——对标:
- 最高法《关于民事诉讼证据的若干规定》 第 93、94 条(电子数据真实性认定)
- SF/T 0076—2020《电子数据司法鉴定通用规范》
- 《电子签名法》 第 8 条(可靠时间认证)
- 北京互联网法院《互联网技术司法应用白皮书》(区块链证据互认)
- W3C Verifiable Credentials (国际机器可验证凭证)
每个证据记录都同时具备:
- 不可篡改 — 任何字节变化触发哈希失配,0.5 秒可验
- 完整保管链 — 谁/何时/做了什么,append-only 强制
- 可独立验证 — 离线
bash verify.sh+openssl ts -verify - 可采性已知 — 0-100 五维评分,每分可 trace 到 DB 行
- 关联可证 — 跨证据自动簇分析 + 律师可用 narrative
2. 架构¶
┌──────────────────────────────────────────────────────────────┐
│ portal-api (Go binary) │
│ │
│ pkg/fingerprint pkg/tsa pkg/anchor │
│ (4-algo+entropy) (RFC 3161) (judicial chains) │
│ │
│ pkg/capture pkg/admissi- pkg/relevance │
│ (7 layers) bility (5维) (12 标识符 + 簇) │
│ │
│ pkg/evidencebundle pkg/legaldocs │
│ (W3C VC ZIP) (5 类文书) │
└──────────────────────────────────────────────────────────────┘
│
┌─────────────────┼─────────────────┐
▼ ▼ ▼
PostgreSQL MinIO External:
(6 张 evidence (capture/<id>/ - FreeTSA / CNNIC TSA
side tables) files/...) - 天平/司法/网通法链
- 公证处 / 鉴定中心
3. 数据库¶
3.1 主表扩展(portal_evidence_chains)¶
迁移 000011_evidence_chain_v2:新增 8 列。
| 列 | 类型 | 含义 |
|---|---|---|
primary_hash |
varchar(128) | 主 SHA-256 内容哈希 |
acquisition_method |
varchar(64) | auto_capture / manual_upload / customer_submission |
acquisition_tool_version |
varchar(128) | 首次采集的工具指纹(不可覆盖) |
chain_of_custody_intact |
bool | 默认 true;TAMPERED 事件后翻 false |
tsa_anchored_at |
timestamptz | 首次 RFC 3161 时间戳时刻(单调) |
blockchain_anchored_at |
timestamptz | 首次链上锚定时刻(单调) |
notarized_at |
timestamptz | 公证完成时刻 |
litigation_ready |
bool | 派生:最新 attestation band == ready |
3.2 六张子表(FK → portal_evidence_chains)¶
| 表 | 用途 | 关键约束 |
|---|---|---|
portal_evidence_hashes |
多算法 hash + 熵 + MIME | UNIQUE (evidence, algorithm, kind, item_index) |
portal_evidence_custody_log |
append-only 保管链 | DB TRIGGER 强制:UPDATE/DELETE 抛 EXCEPTION |
portal_evidence_timestamps |
RFC 3161 TST token | BYTEA 原始 DER + 离线 openssl 复验 |
portal_evidence_anchors |
司法链锚定回执 | tx_id 部分 UNIQUE (NULL 允许) |
portal_evidence_attestations |
5 维评分快照 | CHECK 每分 0-100 |
portal_evidence_identifiers |
12 类标识符抽取 | UNIQUE (evidence, kind, value) |
4. 完整使用流程¶
1. 上传 POST /sync/evidence/file
→ 4 算法 hash + 真 MIME + 熵 + INGESTED log
2. 一键自动采集 POST /evidence/:id/capture/url
→ 5 Go-native 层 (HTTP/DNS/TLS/WHOIS/IP-ASN) 并行
→ worker 后续上传 DOM/screen_rec (2 层)
3. 抽取标识符 POST /evidence/:id/extract-identifiers
→ 12 类: wallet/phone/wechat/qq/telegram/email/domain/ip/...
4. 加 TSA 时间戳 POST /evidence/:id/tsa-stamp
→ 默认 freetsa;可指定 digicert/sectigo/(将来) CNNIC/UNICOM
5. 链上锚定 POST /evidence/:id/anchor
→ 默认 mock;商务获批后可切到 天平/司法/网通法链
6. 评分 POST /evidence/:id/attest
→ 5 维 0-100 加权 → ready / needs_notary / needs_review
7. 取簇 GET /evidence/:id/cluster
→ 节点 + 边 + 标识符统计 + 律师可用 narrative
8. 生成文书 POST /evidence/:id/legal-doc
→ 公证申请书 / 证据清单 / 律师函附件 / 鉴定委托 / 侵权陈述
9. 下载 ZIP GET /evidence/:id/package
→ W3C VC manifest + files/ + hashes/ + timestamps/ + anchors/
+ custody/log.jsonl + bash verify.sh
10. 任何时刻验证 POST /evidence/:id/verify
→ 哈希不匹配 → TAMPERED + 翻 intact=false (不可逆 reset)
5. API 总览(24 个端点)¶
指纹 / 完整性¶
GET /evidence/:id/fingerprint— 当前哈希 + 保管链摘要POST /evidence/:id/rehash— 从 MinIO 重算并刷新基线POST /evidence/:id/verify— 重算并对比 primary_hash
7 层采集¶
POST /evidence/:id/capture/url— 跑 5 Go-native 层POST /evidence/:id/capture/upload— worker 上传 DOM/视频/...GET /evidence/:id/captures— 列出已捕获的所有层
RFC 3161 时间戳¶
GET /tsa/providers— 可用 TSA 列表POST /evidence/:id/tsa-stamp— 请求新戳GET /evidence/:id/tsa-stamps— 列出本证据的所有戳POST /evidence/:id/tsa-stamps/:stamp_id/verify— 复验已存戳
司法链锚定¶
GET /anchors/chains— 注册的链清单(mock/天平/司法/网通法)POST /evidence/:id/anchor— 提交主哈希上链GET /evidence/:id/anchors— 列出锚定记录POST /evidence/:id/anchors/:anchor_id/verify— 复验锚定
可采性评分¶
POST /evidence/:id/attest— 跑评分 + 持久化GET /evidence/:id/attestation— 最新评分GET /evidence/:id/attestations— 评分历史曲线
关联性 / 证据簇¶
POST /evidence/:id/extract-identifiers— 重新抽取标识符GET /evidence/:id/identifiers— 列出已抽取标识符GET /evidence/:id/cluster— 簇图 + narrative
法律文书¶
GET /evidence/:id/legal-doc/types— 5 类文书清单POST /evidence/:id/legal-doc— 生成 + 可选持久化
证据包下载¶
GET /evidence/:id/package— W3C VC 自校验 ZIP
6. W3C VC ZIP 结构¶
evidence-<case>-<date>.zip
├── manifest.json W3C Verifiable Credentials JSON-LD
├── README.md 中英双语摘要 + 验证说明
├── verify.sh 一行:sha256sum -c hashes/sha256sums.txt
├── files/ 所有原始字节
├── hashes/
│ ├── sha256sums.txt coreutils 兼容
│ ├── sha512sums.txt
│ └── merkle.json leaves + root + 哈希算法说明
├── timestamps/ RFC 3161 .tsr 原始 DER + verify 说明
├── anchors/ 每链一份 .json 回执
└── custody/log.jsonl append-only 保管链 + BUNDLE_BUILT 合成事件
自验证演示:
unzip evidence-wemade-mir4-2026-04-001-20260519.zip -d /tmp/ev/
cd /tmp/ev/
bash verify.sh
# AstraSentinel evidence bundle verifier
# ======================================
# Running sha256sum -c hashes/sha256sums.txt ...
# files/capture/http.eml: OK
# files/capture/dns.json: OK
# ...
# OK — all files in files/ match recorded SHA-256 fingerprints.
7. 5 维可采性评分¶
| 轴 | 权重 | 主要加分项 |
|---|---|---|
| 完整性 Integrity | 30 | 保管链未断 (35) / SHA-256 存在 (20) / 4 算法齐 (15) / 日志≥3 (15) / primary_hash 填 (15) |
| 真实性 Authenticity | 25 | acquisition_tool_version (25) / TSA (25) / 链锚 (30) / 双证 cross-witness (20) |
| 合法性 Legality | 20 | tenant 已授权 (40) / 合规采集方式 (30) / 无 TAMPERED 事件 (30) |
| 关联性 Relevance | 15 | actor_id 关联 (40) / case_label (30) / 多层 capture (30) |
| 时效性 Timeliness | 10 | TSA ≤24h (50) / 链锚 ≤7d (30) / 未陈旧 (20) |
| Band | 阈值 | 含义 |
|---|---|---|
ready 🟢 |
≥85 | 可直接呈堂 |
needs_notary 🟡 |
70-84 | 建议公证补强 |
needs_review 🔴 |
<70 | 需复核 |
关键约束:chain_of_custody_intact=false 强制 完整性 = 0 不可恢复。
8. 12 类标识符 + 强度¶
| Kind | 强度 | 提取场景 |
|---|---|---|
wallet / eth / btc / usdt |
1.00 | 0x40-hex / base58 / TRON-T+33 |
phone |
0.95 | CN 1[3-9]xxxxxxxxx / 国际 +x-xxx-xxx |
email |
0.85 | WHOIS contact + 社群消息 |
wechat |
0.85 | "微信号: xxx" / "WeChat: xxx" / "wx: xxx" |
qq |
0.80 | context-anchored "QQ: xxx" |
telegram |
0.70 | @handle / t.me/ / telegram.me/ |
ip |
0.50 | DNS A/AAAA 解析 |
domain |
0.40 | NS / CNAME (可能 CDN 共享) |
username |
0.30 | 通用 @handle |
False-anchor 抑制:>50 证据共享同一 (kind, value) 不入簇边(防 CDN IP 假关联)。
9. 5 类法律文书¶
| 类型 | 法律依据 |
|---|---|
| 公证申请书 (notary_application) | 公证程序规则;面向 杭州互联网公证处 / 中信公证处 |
| 证据清单 (evidence_inventory) | 民诉证据规定 § 53 三列表格 |
| 律师函附件清单 (cease_desist_attachments) | 律师函惯例;14 天异议期 |
| 司法鉴定委托书 (forensic_commission) | SF/T 0076—2020 § 6;委托具备资质的鉴定中心 |
| 侵权事实陈述 (infringement_statement) | 诉状"事实与理由"惯例;基于簇 narrative 自动起草 |
关键设计:
- 输出 Markdown 不出 .docx(避免覆盖律所宏样式)
- Deterministic:同输入 → 同字节;版本归档可追溯
[填写权利人全称]占位符明显,律师 LOOK-FILL- 自动嵌入 SHA-256 / TSA 序列 / tx_id / 五维评分
10. 数据安全与合规¶
| 关注点 | 实现 |
|---|---|
| 保管链不可篡改 | DB-level TRIGGER 拒绝 UPDATE/DELETE on custody_log |
| TSA 隐私 | RFC 3161 设计只传 hash 不传内容;TSA 永远看不到证据 |
| 链上隐私 | 同上:上链 hash 32 字节;不上明文 |
| 跨境数据 | TSA / chain 可由境内 (CNNIC/天平) 或境外 (freetsa/digicert) 提供;不强制 |
| 采集合规叙事 | acquisition_method = "auto_capture" / "manual_upload" 等"公开信息查询服务"合规口径,非"爬虫" |
| EXPORTED audit | ZIP 下载即触发 custody log,谁/何时/什么 IP 全记录 |
11. 部署 / 运维¶
11.1 部署形态(ai-astraweb)¶
- API:
/usr/local/bin/portal由portal-api.service(systemd) 管理 - EnvironmentFile:
/etc/portal/portal.env - Frontend: nginx serve
/var/www/portal/(Phase 8 纯后端,无前端变更) - Deps:
portal-db/portal-redis/portal-minio(docker 容器) - ⚠️ 不要用
deploy/deploy-aws.sh— 已 stale(仍是 P5 前的 docker compose 套路)
11.2 编译 + 部署命令¶
# 1. 本地交叉编译
cd ~/ai/bot/game-guard-portal
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 \
go build -ldflags="-s -w" -o /tmp/portal-linux ./cmd/portal
# 2. 上传 + 备份 + 替换 + 重启
scp /tmp/portal-linux ai-astraweb:/tmp/portal-new
ssh ai-astraweb 'sudo cp /usr/local/bin/portal /usr/local/bin/portal.bak-$(date +%Y%m%d-%H%M%S)
sudo install -m 0755 /tmp/portal-new /usr/local/bin/portal
sudo systemctl restart portal-api'
# 3. 验
curl https://portal.astraeye.ai/health
11.3 数据库迁移¶
AutoMigrate 跑迁移;首次启动后自动建好:
- 6 张 evidence 子表 (Step 1 + Step 8)
- 1 个 PL/pgSQL 函数 + 2 个 TRIGGER (custody_log append-only)
- 1 个 CHECK constraint (attestation 0-100 范围)
如需手动 golang-migrate:
12. 监控与告警¶
| 信号 | 来源 | 告警阈值 |
|---|---|---|
| TAMPERED 事件 | custody_log.action = 'TAMPERED' | 任何一次都告警 |
| TSA 验证失败 | timestamps.verify_status = 'invalid' | 任何一次 |
| 链锚回滚 | anchors.verify_status = 'rolled_back' | 任何一次(极罕见) |
| >30 天未锚定 | chains.synced_at < now - 30d AND chains.blockchain_anchored_at IS NULL | dashboard 黄牌 |
| 评分大幅回退 | attestations 历史最新 weighted_total < 前一行 - 15 | 调查 |
13. FAQ¶
Q: 为什么不一开始就调 LLM 做评分 / 抽取? A: 评分必须可解释 + 可重放;LLM 会让律师 / 法官 / 鉴定中心无法 trace 每一分到 DB 行。抽取也一样——5% NER 错误率在法律语境下 = 关联到错误被告。
Q: 为什么 Markdown 不 .docx? A: 每律所有自家 Word 模板/宏;MD 给原稿,pandoc/律师转 .docx 不被覆盖。
Q: FreeTSA 在中国境内可能不稳?
A: 故有多 TSA 注册表 (/tsa/providers);可一证据多 TSA 加戳;CNNIC 商务获批后切换零代码改动。
Q: 天平链 / 司法链 还没上线怎么办?
A: 接口已抽象 (Anchor interface);目前用 mock 端到端跑通;商务批准后替换 stub 即可,DB / handler / 前端零改动。
Q: 多大的文件可以上传? A: 单文件 32 MB(含视频、PDF、截图);超大文件由 worker 分片后再上传。
Q: ZIP 包多大? A: 取决于 capture 层 + DOM/视频;典型一次完整采集 5-50 MB。
14. 版本对照¶
| 组件 | 版本 |
|---|---|
fingerprint.FingerprintVersion |
fingerprint/v1 |
tsa registry |
freetsa / digicert / sectigo / cnnic / unicom |
anchor registry |
mock / tianping / hzcourt / wangtong |
admissibility.ScorerVersion |
admissibility/v1 |
relevance extractor |
relevance-extractor/v1 |
evidencebundle.BuildVersion |
evidence-bundle/v1 |
legaldocs.GeneratorVersion |
portal-legaldocs/v1 |
capture.CaptureToolVersion |
portal-capture/v1 |
15. 参考标准与法律依据¶
- W3C Verifiable Credentials Data Model 1.1
- RFC 3161 Time-Stamp Protocol (TSP)
- SF/T 0076—2020 电子数据司法鉴定通用规范
- GB/T 29360-2012 电子物证数据恢复检验规程
- 《最高人民法院关于民事诉讼证据的若干规定》 第 53 / 93 / 94 条
- 《电子签名法》 第 8 条
- 北京互联网法院《互联网技术司法应用白皮书》
- DMCA 17 USC § 512
- EU Digital Services Act, Art. 16