假设一个系统展示了“新状态根有有效证明”,但就是不公布用户这批交易的数据。用户能仅凭一个证明恢复自己账户的状态、重新计算余额,或者安全退出吗?不能直接推出。反过来,把交易数据都发出来,也不等于状态转移经过证明,更不等于实际链已经结算、具有要求的最终性。一个有效性证明只证明它明确编码的关系,不会越过规范的边界替运行者承担数据服务、社会共识或现实交付责任。

把批次拆成五个问题

给定旧状态根 S、新状态根 S′ 和必要的批次公开输入,一份有效性证明可以约束“存在满足给定转移规则的见证,使旧状态按该关系得到 S′”。要达到可用状态还须检查具体证明系统/电路究竟约束了什么:若没有约束签名、交易顺序、余额或者提现条件,验证者不会凭想象补上。再检查证明是否已由期望的结算层或合约接受;“有人本地验真一份 proof”和“相关状态已在期望链上确认”是两种证据。

数据可用性问第三方是否能拿到重建状态、观察账户或退出所需的数据,约束证明真假不能让被扣留的原始字节自动出现。链上发布、外部数据层和有效性证明各有验证和信任假设;即使某阶段可下载,也不表示有永久存储保证。隐私问公开了什么:包含证明和合法性证明可以有大量公开输入,交易数据若直接公布当然可能暴露用户行为;证明系统的零知识能力也要看该实现是否启用、哪些值是公开的。最终结果还须问相关结算交易是否被接受、区块状态是否满足所需确认/最终性,以及应用或现实订单的后续履约。

1
2
3
4
5
6
7
旧状态根 S + 批次数据 ─► 转移规则 ─► 新状态根 S′
│ │ │
能否被各方取得? 什么被证明? 哪条链认可?
│ │ │
发布/保留/退出 有效性证明 结算与最终性

公开输入、公开批次和可推断的小数据空间 → 隐私另查

35 的 examples/cryptography/35_data_availability.py 是有限状态教学模型:合成余额 alice=9,bob=1,转移 4 后重算带长度编码的状态摘要;将 4 改成 5 得另一根,花 10 则违反余额规则。拿走变更列表,只交给接收方一个根,脚本再不能按这个输入重演转移。由于金额仅在 0–9,知道初始余额的人反而可以枚举候选金额找出承诺的结果——即便有承诺也不自动私密。

1
2
python3 examples/cryptography/35_data_availability.py
python3 -m unittest discover -s examples/cryptography -p 'test_35*.py' -v

这些摘要相等和余额判断不是真实有效性证明。真 Groth16 的例子在 34,但它只证明特定 Poseidon 原像与数值比较,并非 rollup 状态变更。35 的真实 rollup 电路、结算合约、数据发布和用户退出均 NOT_RUN;官方文档虽给出研究入口,此环境对某些网页正文访问不稳定,不能声称已对某个在线批次的合约/发布模式完成逐项核查。尤其不能把“有限模型失败对照”和“真实 rollup 网络已经可用”并列标记为通过。

将交易签名与通信通道放回同一时间线上:钱包签名表示特定账本操作的授权,经 HTTPS RPC 提交时 TLS 认证 RPC 并保护这一跳;证明系统按自己编码的状态转移关系验证计算;数据发布与链上结算分别决定外部是否能重建、何时纳入共同历史。四种成功不能替彼此发证,也不自动兑现现实中的订单。

练习及答案

画图题: 有效证明显示 S 可变成 S′,服务不发布批次字节;另一服务发布全部交易却未提供证明。各自在“可核验转移关系”和“独立重建状态”两栏能作什么结论?再加“已确认于指定结算链”一栏。

答案: 在已验证正确公开输入及可信证明密钥/电路的前提下,前者可以对被约束的转移关系提供证明,但只给根无法保证第三方恢复所需数据;第二家在数据足够且可获取时可以尝试重建,却不能以“公布数据”替代正确证明/全节点独立执行。两者是否在期望结算链确认均需独立链上证据,不能凭单个服务自报结论。

实验变更题: 把公开转移量从 4 改成 10,程序在哪一层报错?把 published_root 改为另一正确转移对应的摘要而不改变公开 changes,还能声称重建匹配吗?小范围金额为何可能从根猜出?

答案: transition 的余额规则发现 alice 只剩 9,抛错;换根而不改输入会使 reconstructed_root == published_root 为 false。这两个都只是教学模型的状态与摘要检查,不是零知识证明。若初态和候选金额集合很小,枚举每个候选再对比根即可反推出转移量,所以“根不包含明文”不等于隐私。

资料与衔接