跳到主内容
承重漏洞的修法 · 不是回避,是把断言边界写死

身份分级 M / L0 / L1 / L2

每一级都写清「能断言什么、不能断言什么」。L0 不参与任何以「这台设备」为主体的法律行为——这是整套分级唯一的硬规矩。M 级更彻底:它连"这台设备"都不指向。

01 · 为什么要有分级

公开 listing 通常不给序列号。这不是采集没做好,是行业常态——平台没有动机把卖家的资产清单交出来。

早期的设计只有「强身份 / 弱身份」两档,弱身份记录无法回答一个问题:这次看到的这台,是不是上次那台。一被追问就漏。

修法不是"想办法搞到序列号",而是把它做成可升级的三级,并且每一级把「能断言什么、不能断言什么」写死在每一份输出里。分级的价值不在于分级本身,在于它让 L0 记录不能混进以「这台设备」为主体的法律行为。

02 · 三级定义

级别名称 / 依据能断言不能断言跨运营方当前 ID 数
M 型号级供方挂牌
supply_offer_fingerprint
该平台对该型号存在一条公开报价,且该报价的价格变化可被连续记录 不指向任何一台具体设备;同一报价背后可能是成千上万台机器,也可能是零台 不可跨运营方 168
L0 挂牌指纹
listing_fingerprint
同一挂牌前后一致 不保证是同一台物理设备;换平台、换 listing 就是另一个 ID 不可跨运营方 46
L1 序列号可观测
serial_hash
同一物理设备跨运营方、跨平台是同一个 ID 不保证上报者没有说谎——序列号是「被看见」,不是「被证明」 可跨运营方 78
L2 硬件信任根
device_key
设备用自己的密钥签名自证,运营方无法替代设备说话 不保证密钥没被物理提取——防的是远程冒充,不是物理拆解 可跨运营方 4

共 296 个 ID —— 其中设备级 128 个(L0/L1/L2), 型号级 168 个(M)。这两个数不能相加成一个"设备数":M 级描述的是「某平台对某型号的一条报价」, 里面没有设备。占比等比率在数据足够之前不发布——这是「先计数后比率」的纪律。

03 · 每一级能做什么、不能做什么

用途M(型号级)L0L1L2
抵押登记不可用不可用可用可用
保险核保不可用不可用可用可用
资产池入池不可用不可用可用可用
市场行情可用可用可用可用
价格观测可用可用可用可用
在押持续验证可用可用可用可用

机器可读版本:GET /v1/permits?cvin=...&use=抵押登记,返回 {allowed, level, upgrade_to}。

04 · 怎么升上一级

L0 → L1

提交一条带序列号的证据(供应商发票 / 装箱单 / 后台导出 / RMA 工单),POST /v1/promote 完成升级

L0→L1 的 CVIN 会变(序列号哈希取代挂牌指纹),旧 ID 通过别名表永久指向新 ID,历史不丢

L1 → L2

在设备上跑 agent 生成 ed25519 设备密钥,POST /v1/attest 完成首次绑定(绑定后不可换密钥)

L1→L2 不需要重新登记,同一 CVIN 原地升级,历史全保留

M 没有升级路径。型号级挂牌无法升级为设备级身份:它不是"更弱的同一台设备",而是"根本不是设备"。设备级身份必须由设备主体提交序列号(L1)或设备密钥(L2)另行建立。 换句话说:想让一台设备有设备级身份,不能靠"采集得更勤",只能由设备主体自己交序列号或设备密钥。
L0 → L1 升级(写入永远免费)
curl -X POST https://cvin.org/v1/promote \
  -H 'content-type: application/json' \
  -d '{
    "from_cvin": "cvin:nv.h100.sxm.80g:3f9k2m7q1x8b4n6t",
    "serial": "实际序列号(只以单向哈希落库,明文不入库)",
    "evidence_url": "https://…/invoice-2026-1102.pdf",
    "by": "ACME Compute"
  }'

升级会换 CVIN(序列号哈希取代挂牌指纹),旧 ID 通过别名表永久指向新 ID——历史一条不丢,且升级动作本身也进链。反向降级不存在:升级不可重复、不可改向。