身份分级 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(型号级) | L0 | L1 | L2 |
|---|---|---|---|---|
| 抵押登记 | 不可用 | 不可用 | 可用 | 可用 |
| 保险核保 | 不可用 | 不可用 | 可用 | 可用 |
| 资产池入池 | 不可用 | 不可用 | 可用 | 可用 |
| 市场行情 | 可用 | 可用 | 可用 | 可用 |
| 价格观测 | 可用 | 可用 | 可用 | 可用 |
| 在押持续验证 | 可用 | 可用 | 可用 | 可用 |
机器可读版本: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 原地升级,历史全保留
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——历史一条不丢,且升级动作本身也进链。反向降级不存在:升级不可重复、不可改向。