【区块链】跨链验证-Zendoo

简介

zendoo:减小了侧链和主链之间的锚定开销

  • 利用zk-snark
  • 主链只需要从侧链节点获取加密身份验证证书,无需已知侧链的内部结构,如共识机制或支持的交易类型等等

  • 侧链可以建立自己的身份验证和验证证书的规则

  • 侧链可以使用集中式的解决方案,只需要将证明提供给主链即可

与ZK Rollup比较

  • 不需要将侧链的交易数据推送到主链

zk-snark:简洁的非交互式零知识证明

向一个算术约束系统C,证明一组输入满足某个条件

  • 算术约束系统C:一组有限域F上的多项式

由三个部分组成

  • setup:针对一个约束系统C的引导程序,设定安全参数为$\lambda$ 。该程序由一对密钥组成,pk为证明密钥,vk为验证密钥

  • prove:生成证明$\pi$,证明$(a,w)$是一组满足约束系统C的值。其中,a是公共输入,w是需要保密的内容(叫做witness)

  • verify:验证证明$\pi$是否是输入(a,w)满足约束C的有效证明

zendoo:为侧链设计的转账协议

专指比特币场景,以比特币为主链

主链转账到侧链

表示为三元组形式

fig1

分别为:侧链ID,接收者相关元数据(结构在主链中不固定,语义未知),货币数量

可以将这种交易视作不可花费的交易

侧链转账到主链

提款证明

表示为二元组形式

fig3

所有在当前epoch中的(withdrawal epoch),转账到主链的交易,都收集到提款证明Withdrawal Certificate (WCert)中,再将该提款证明提交到主链进行处理(作为主链上的一笔带着提款证明的特殊交易进行处理)

fig4

  • quality:可能会发生同一条侧链在同一个epoch中出现多个提款证明的现象,该现象可能由于侧链的分叉或其他恶意行为。主链会选择最先提交的提款证明,或quality值最高的提款证明来接受
  • BTList为侧链转账到主链的交易列表
  • proofdata为SNARK verify的输入值,注意该字段自由规定(公共输入a)
  • proof为SNARK proof

提款证明还扮演着侧链心跳证明的角色,即使不存在侧链到主链的转账,仍然有提款证明定时发送到主链上

一个withdrawal epoch是由主链上的一系列块来决定的,且每种侧链对应的withdrawal epoch长度不同(在侧链创建时进行设置),因此整个系统是一个异步的状态

主链中的withdrawal epoch划分如下所示

fig2

侧链必须在下一个withdrawal epoch的前submit_len块内提交提款证明,否则就认为当前侧链为中断状态,该侧链之后提交的提款证明将不会再被主链接受

提款证明验证

验证内容如下

fig5

  • proof为提款证明中的proof

  • $vk_{WCert}$是侧链创建时生成的SNARK验证密钥

  • $wcert_sysdata$ 包括提款证明中需要进行验证的交易列表、quality值,以及该提款证明是否对应当前epoch

    用以下式子表示

    fig6

    其中MH(BTList)是交易Merkle tree root,$H(B^{i-1}_{last})$和$H(B^{i}_{last})$是epoch i和i-1的最后一个块的块头哈希

保障系统安全的手段

  • 在主链上创建一个对应侧链的余额变量,来规定转账的总额
Author: iwannaeat
Link: https://iwannaeat.github.io/2023/07/18/【区块链】跨链验证-Zendoo/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.