区块链(33):状态可验证、数据可取得与跨域可领取各有门槛
一个汇总状态根可以被验证,却不包含恢复每个用户余额所需的全部原始数据。rollup 发布 calldata 或 blob 等承载方式时,要区分“证明此时数据已公布”与“未来可以从什么地方取回”,尤其是 blob 数据保留期限之外的历史重建责任。区块链(32):Optimistic rollup 的挑战窗口给谁留时间的挑战方拿不到输入字节,就无法重算错误状态;有效性证明通过,也不自动替用户解决数据取得问题。
flowchart TD
E[L2 执行与状态承诺] --> P[证明或争议路径]
E --> D[数据发布: calldata/blob 等]
P --> L[L1 结算合约]
D --> R[历史保留/恢复服务]
L --> M[跨域消息: 源域、目标、nonce、状态]
M --> X[目标域核对一次性领取]
R --> X
桥锁定一侧资产再在另一侧铸造或释放,必须证明源消息在认可的历史里成立,并绑定源链、目标链、桥合约、资产、金额和一次性消息标识;从另一个域复制相同字节、或重新播放旧事件,不可再次领取。验证成功仍不说明桥管理员不能暂停提款、升级逻辑、挪走锁定资产;需要独立列控制权限与退出条件。blob 的经济与保留策略是具体 fork、网络和客户端的事实,不用旧白皮书推断。
可验证的根无法代替可取得的历史
假设付款在 L2 批次中把买家减少 70、卖家增加 70,链上只留一个新状态根。根可以被用来核对承诺,却无法凭自身列出卖家订单 ID、买家的剩余余额或其它所有账户历史。即便有证明验证了从旧根转向新根所满足的约束,只要执行数据被扣留,后来加入的用户可能缺少构造退出输入或独立复算视图的材料。calldata 与 blob 都属于发布渠道,但持续保存时间和可检索性取决于具体网络与归档参与者;任何“长期有数据”承诺都需要单独核对保留者和恢复测试。
消息跨域更需区分“看到源域事件”和“资产在目标域可兑现”。可设消息标识包含来源链/合约、目标链/合约、资产、金额及唯一 nonce,目标合约必须验证源域认可的历史并原子记录已消费状态;否则相同字节或跨链复制可能重复领款。源链重组时使用旧块日志构造的证明需要撤销,目标链既有的发放却未必能自动逆转,风险由桥的安全与最终性策略承担。管理员若可无延迟升级或冻结桥,同样改变退出假设。本篇没有真实 blob 网络或桥合约,不拿哈希比较充当跨域证明。
把这些门槛分开测试:examples/blockchain/models/cross_domain.py 的 Batch 设为“转换已接受、批次已终局,但数据不可检索、用户没有自己的退出见证”,can_reconstruct 与 can_exit 都返回假。若用户事先留了自己可用的退出见证,且出口仍开放,则在这个假设允许以个人见证退出的有限模型里能退出;关闭出口或撤去终局标记,又不允许退出。模型没有证明“所有方案只要有个人见证就能提款”,实际退出还须遵守目标合约的证明格式与权限。
SyntheticInbox 只接受预设的源链、源桥、目标链、目标桥与尚未消费的 nonce。模型先收下合成订单的 nonce=7,再分别测试同域重播、更换负载复用该 nonce 和改动任一域字段:均被拒绝;未验证的 nonce=8 也被拒绝。这是域字段与一次性状态的本地逻辑测试。source_verified=True 是测试直接提供的假设,并未校验 Merkle、终局或密码学证明,更没有运行真实数据扣留或跨链转账。运行 python3 examples/blockchain/run_cross_domain_evidence.py,两项测试的原始输出、退出码和三份本地源码 SHA 见 examples/blockchain/evidence/33/20261005T131320Z-45971ff9/。
练习一:历史数据被扣留,只保留状态根与“验证通过”的布尔值,用户能重建完整退出输入吗?答案:通常不能,由系统具体数据方案决定,单个根不是数据副本;预先保存个人退出见证是否足够,还要看具体出口规则。练习二:相同消息从另一条链提交并被目标桥接受,缺什么绑定?答案:缺源域/目标域、合约与消费状态的校验,形成跨域重放。真实 blob/bridge 数据扣留与消息重放实验 NOT_RUN。
可迁移原则:有效性、可用性与领取权限必须分开验收。参考:Ethereum Data Availability、EIP-4844(fork 激活和当前保留规则待核);导航:区块链(32):Optimistic rollup 的挑战窗口给谁留时间 · 33 · 区块链(34):Validity rollup 的证明到底验证哪条命题。





