Skip to content

证据链模块 · Evidence Chain Module (Phase 8)

AstraSentinel · 星穹天巡 — 自动化电子证据采集、固定、锚定、评分与法律文书生成的端到端模块。


1. 设计目标

让证据从 「我们说它真」 升级到 「法庭判它真」 ——对标:

  • 最高法《关于民事诉讼证据的若干规定》 第 93、94 条(电子数据真实性认定)
  • SF/T 0076—2020《电子数据司法鉴定通用规范》
  • 《电子签名法》 第 8 条(可靠时间认证)
  • 北京互联网法院《互联网技术司法应用白皮书》(区块链证据互认)
  • W3C Verifiable Credentials (国际机器可验证凭证)

每个证据记录都同时具备:

  1. 不可篡改 — 任何字节变化触发哈希失配,0.5 秒可验
  2. 完整保管链 — 谁/何时/做了什么,append-only 强制
  3. 可独立验证 — 离线 bash verify.sh + openssl ts -verify
  4. 可采性已知 — 0-100 五维评分,每分可 trace 到 DB 行
  5. 关联可证 — 跨证据自动簇分析 + 律师可用 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/portalportal-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:

migrate -path migrations/ -database $PG_DSN up

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