履约证据与核验

导出证据包,用独立只读入口核对事件链、签名检查点、合约签名与连接器回执。

证据与接口 4059 字 ·约 10 分钟读完 ·更新于 2026-10-28

datanous-evidence 是可单独构建运行的只读证据验证入口,不依赖运行中平台数据库、不读取平台私钥、不复制平台审核/角色管理,也不发送锚定或监管请求。

已支持现有格式:

  • evidence-bundle:调用 platform.VerifyEvidence,验证 datanous-evidence-v1 的完整提交审计链、checkpoint、签名 snapshot,以及 snapshot 内既有合同/回执签名。
  • audit-export-page:调用 platform.VerifyAuditExport,验证 datanous-audit-export-v1 的单页签名、页内连续性及签名边界。必须匹配配置的起点和头;不自动取后续页,不证明未提交的完整历史,也不恢复被脱敏的原始事件载荷。

anchoroutbox 提供持久发送、未知回执恢复及供应商验证适配器契约。它不是通用第三方真实性证明,本服务不调用其写入或发送方法。

显式配置

无 -mode 或 -config 拒绝运行。配置文件和 CLI token 文件须为权限 0600 的常规文件;拒绝最终路径符号链接、FIFO/设备、超限文件。配置只放公开信任材料、预期边界和 token 摘要,不放平台/连接器签名密钥。CLI 读取的目录由 os.OpenRoot 固定,证据文件路径仅由启动操作者显式提供;HTTP 请求没有路径或 URL 参数。

配置结构如下,示例中的占位值必须替换为操作者确认的材料,原样不可运行:

{
  "version": "datanous-evidence-service-v1",
  "listen": "127.0.0.1:8185",
  "tokenSha256": "REPLACE_WITH_SHA256_OF_RANDOM_BEARER_TOKEN",
  "scopes": ["evidence.verify"],
  "concurrency": 1,
  "timeoutMillis": 1000,
  "trust": [
    {
      "id": "enterprise-a",
      "publicKey": "REPLACE_WITH_OPERATOR_PINNED_PLATFORM_PUBLIC_KEY",
      "scope": "party:enterprise_a",
      "kinds": ["evidence-bundle", "audit-export-page"],
      "expectedHead": {"sequence": 42, "hash": "REPLACE_WITH_EXPECTED_HEAD_SHA256"},
      "expectedFrom": {"sequence": 0, "hash": ""}
    }
  ]
}

scope 必须是一个明确的 party:<id> 或 contract:<id>。expectedHead 必填;选择审计导出页时 expectedFrom 也必填。序号 0 对应空 hash,正序号对应 64 位小写十六进制 hash。只验证 bundle 时可省略 expectedFrom。每个 trust 的 kinds 是允许的证据类型;请求不能自行提供替代 pin、scope、头或起点。

预期头/pin 应来自操作者确认的配置来源,而不是从未经验证的提交中自动采纳。服务只证明与这些配置一致,无法证明配置的来源独立、最新或权威。业务 scope/预期头变更、token 轮换通过修改私有配置并重启完成,没有自动信任更新。

Bearer token 使用独立随机值(建议至少 32 个随机字节后编码为 base64url,无填充),只允许 32–128 个字母、数字、_、-。配置保存 token 文本的 SHA256,不保存明文。不要将 token 放在命令行、URL、浏览器地址或日志中;CLI 从单独私有文件读取,HTTP 从单个 Authorization 头读取。同一 token 可验证其配置内最多 16 个 trust,只有 evidence.verify scope,无多租户用户角色/签发/撤销管理。

请求与启动

请求只是对已有导出 JSON 的包装,不改变原签名格式:

{
  "version": "datanous-evidence-verification-v1",
  "kind": "evidence-bundle",
  "trustId": "enterprise-a",
  "evidence": {"version": "datanous-evidence-v1", "...": "原始导出对象的完整字段"}
}

把原始导出对象完整放入 evidence,不得改写内部签名字符串或业务字段。这里的 ... 仅是说明,占位请求会被严格拒绝。

# 只读验证显式文件,结果 JSON 输出到 stdout。
datanous-evidence -mode verify -config /private/evidence-config.json \
  -input /private/verification-request.json -token-file /private/evidence-token

# 独立本机 HTTP 服务。
datanous-evidence -mode serve -config /private/evidence-config.json

HTTP 仅支持 POST /v1/verify,请求头 Content-Type: application/json、Authorization: Bearer <token>。在读取请求体之前认证;不接收 query、URL、文件路径、压缩请求、跨站 Origin、cookie 认证或重复 Authorization。无匿名健康或证据查询入口。默认 127.0.0.1:8185,只接受字面 loopback IP 和数字端口,不支持公网监听或 TLS 终止;外部网关、独立域和 TLS 代理不是本次已验收交付。

结果解释

成功返回最小验证报告:输入 evidence 对象的 SHA256、条目数,以及下列分项:

  • signatureIntegrity: verified:既有格式的本地密码学校验通过。合同/回执附带公钥来自已验证的平台 snapshot,不自动证明真实身份。
  • configuredPinMatch / configuredScopeMatch / configuredHeadMatch:与启动时冻结配置匹配;审计页增加 configuredFromMatch。
  • bundle 的 historyCoverage: submitted_bundle_genesis_to_configured_head 仅涵盖提交的签名账本;不证明现实事件无遗漏、当前最新或真实业务内容。
  • page 的 historyCoverage: single_page_only_not_complete_ledger 明确不证明整段历史;pageCompletesHead 只是本页是否到达签名 head,不表示已验证其他分页。
  • independentProof: not_evaluated、trustProvenance: operator_configured_not_externally_attested:未验证第三方锚定、监管确认、真实身份或配置来源权威。

结果不回传事件、合同、party/业务 ID、原始异常或 token;失败没有部分成功结果,错误只返回固定代码。HTTP 401 未授权、400 格式无效、413 超字节预算、422 验证/信任不符、429 忙或超速、408 验证取消。

预算、取消与边界

  • 配置 64 KiB;请求/显式输入 1 MiB;JSON 深度 16、重复键(含大小写/Unicode 等价)和未知字段拒绝。
  • bundle 最多 256 个审计事件;snapshot 256 KiB、最多 64 个回执、最多 2 个合同签名;挑战 8 KiB、单回执 16 KiB。原导出页继续限制最多 100 条。
  • HTTP 同 token 固定 burst 8、每秒补充 4 次;并发配置 1–4,先占并发名额再读体,最多 16 个接入连接。ReadHeaderTimeout 2s、ReadTimeout 5s、WriteTimeout 10s、IdleTimeout 5s,header 8 KiB。
  • 验证时限配置 100–5000ms,调用前/完成后检查取消;既有纯验证 API 不支持逐个签名的 context 中断。同步验证不创建脱离生命周期的后台计算,取消或超时后丢弃结果;这不是 CPU 强制抢占、进程资源沙箱或硬实时保证。服务收到停止信号会取消请求上下文并关闭监听、等待处理结束。
  • 不保存证据或验证历史,不自动抓取分页、不注册/发送 anchoroutbox,不进行第三方证明/监管验收、长期归档、法律效力或真实身份判断。

验证记录

.runtime/evidenceservice-final-race.log:11 个顶层测试通过;.runtime/evidenceservice-page-boundary-race.log:另 1 个分页边界测试通过。合计 12,0 跳过、0 失败。覆盖现有格式签名、party/contract、pin、head/from、类型与篡改负例;深度/字节/条目预算;认证先于读体;并发/速率;真实 loopback HTTP 和配置服务启停;文件权限/符号链接;CLI subprocess 安全错误及无配置拒绝。

首次 CLI 子进程测试误用了复用测试工具的入口名称,未匹配工具固定的 TestAuxCLIProcess;失败日志保留于 .runtime/evidenceservice-cli-race.log、.runtime/evidenceservice-pre-fixture-fix-race.log。只修正测试入口名后回归通过,没有放宽运行时验证。

这一步卡住了?请通过首页客服微信沟通。 ← 返回文档中心