为什么需要证明?
索引器扫描 PIVX 区块链并构建名称登记簿。可为什么要信任它呢?万一它:
- 捏造一次链上从未发生过的注册?
- 收取错误的费用?
- 把同一个名称注册两次?
- 篡改登记簿的状态?
ZK 证明消除了这些疑问。每一份证明都是一张密码学凭证,表明该次注册被正确处理。任何人都可以独立验证这份证明。
每份证明验证了什么
PIVX 证明生成器使用 SP1——一个 RISC-V 零知识虚拟机。对于每一笔带域名的交易,生成器都会在 zkVM 内部执行以下检查:
- 名称有效性 — 1-64 个字符,小写字母、数字和连字符,位于允许的区域内
- 地址有效性 — 目标地址是正确网络上的 PIVX Sapling 屏蔽地址,且为现代 bech32 形式
- Ed25519 签名 — 对确切被签名消息的签名有效,且由该操作所要求的密钥做出
- 操作不变式 — 所有权、价格状态与 nonce 顺序都与正在执行的操作相一致
- 重放保护 — nonce 严格大于记录中先前的 nonce
- 状态转移 — 默克尔证明重建出旧根,而新根正是应用了这一处变更之后的结果
只要有任何一项检查未通过,证明就无法生成。
证明不检查什么
在这里,精确比听起来令人印象深刻更重要:
- 付款并不在电路内验证。 一笔交易是否支付了正确的费用、一个
BUY是否真的转移了资金,由注册方在 链下强制保障,而任何用已公开的查看密钥重放这条链的人都能加以检查。在 zkVM 内证明票据所有权的代价,将远高于 今天整个批次的成本;而且它给出的保证比复现已经提供的更弱——电路只看得到票据 承诺,而重放的索引器看得到解密后的金额和备注。 - 电路并不证明输入就来自真实的链。 它证明的是:给定这个批次,状态转移符合规则。至于该批次是否 就是真实、完整且顺序正确的命令流,则由复现来确立——参见信任与隐私。
正因如此,PiNS 让欺诈可被察觉,而不是加以阻止:错误的批次根本无法被证明,而并非来自真实链的批次 会被每一个独立索引器反驳。
公开输出
每份证明都承诺 3 个与之永久绑定的值:
| 输出 | 说明 |
|---|---|
old_root | 本次注册之前的默克尔树根 |
new_root | 本次注册之后的默克尔树根 |
end_block_height | 该注册批次的最后一个 PIVX 区块 |
end_block_height 像检查点一样把证明钉在某个具体的 PIVX 区块上。任何人都可以用已公开的查看密钥把链扫描到该高度,确认备注与金额和批次所声称的一致。