Thanks


  • 感谢SecbitLabs @郭宇 前两个月分享的Spartan Overview (尽管当时也没太理解), 以及@even 在研究方向上的指引(据说Hyrax 不太好啃),不至于走太多弯路。

我的动机


缘于folding,缘于NOVA,缘于Setty,了解到了Spartan,但并不认识它,所以才有了本篇及接下来的关于它的一切(预备知识)…… 

image.png

关于Spartan,在ZK领域可能时间上相对也有点儿远了,暂且不考虑它在某些方面的争议,它的一些思想其实已经影响到其它比较热门的方向了,比如当下的热点Lasso & Jolt,所以它的研究意义仍然很大。


Overview 


  • 本篇文章主要参考Hyrax 论文前半部分1-4节,即优化前的GKR zk argument

  • GKR 协议本身是Sumcheck协议的一种应用,不带zk argument的GKR 就可以简单认为是多个sumcheck协议的叠加,带zk argument的GKR就会带来很多的细节问题,这也是Hyrax 的起源,所以弄清楚GKR with zk argument 的各个细节后自然也就清楚了Hyrax的意义

数据并行化下的GKR 协议


节选自PAZK 中的图

image.png


何为数据并行化GKR?就是同一个电路描述应用在多组input 数据中的GKR 协议,这样prover 在最开始的claims 中就不再是针对单一电路的output,比如下面的 :

image.png


而是多个子电路的output的汇总 :​

image.png


在GKR协议中prover 要证明也不再是:


而是:​


另外需要备注一下各个notion的含义:

  • N 代表子电路的个数

  • G 代表单个子电路中每层Gate的个数

  • 代表第 层电路编码 Gate编码 上的evaluation 值,的MLE 

  • 代表第 层电路编码 Gate编码  上的evaluation 值,的MLE;同理

  • 分别代表上的加法和乘法Gate的MLE,注意Gate的描述与电路的编码 无关,也跟input witness无关,所以它的计算可以在preprocessing 阶段就开始了,没有必要等到协议中才开始

  • 代表电路编码 与 电路编码 是否一致,的MLE

GKR Protocol with ZK Argument


image.png

仍然以为个图为例来扮演整个协议的过程。其中电路的个数,所以;有限域的moduler 。​


Step ZERO


假设前半部分为public input,后半部分为witness,对witness 的每个元素进行commit,并发送给verifier :


Step ONE


prover 发送电路的output 作为Sumcheck的初始claims,verifier 根据给定的电路第0层的evaluation 值:


可以插值出相应的多项式:


verifier 生成challenge factor,并发送给prover,接下来进入第1层电路的 sumcheck 协议,prover 需要证明:


Step TWO


将第1层的sumcheck 多项式拆解成多个item :


合并item :​


Round one


prover 计算本次round 验证需要用到的proof,也就是单变量多项式


备注:​ 其它编码取值对应的多项式为0,就没有一一枚举出来

则:


prover 需要把多项式的commitment发送给verifier,也就是把该多项式的4个系数的commitment 之后发过去:​


verifier 需要验证:​


根据commitment 加法同态的性质,需要验证:​


验证通过,verfier 发送challenge factor  ,下一个round 需要验证的目标值为:​


Round two


基于 ,prover 计算本次round 验证需要用到的proof,也就是单变量多项式

备注:​ 其它编码取值对应的多项式为0,就没有一一枚举出来


则:​


prover 需要把多项式的commitment发送给verifier,也就是把该多项式的4个系数的commitment 之后发过去:​


verifier 需要验证:


根据commitment 加法同态的性质,需要验证:​


验证通过,verfier 发送challenge factor给prover,下一个round 需要验证的目标值为:


Round three


基于,prover 计算本次round 验证需要用到的proof,也就是单变量多项式

备注:​ 其它编码取值对应的多项式为0,就没有一一枚举出来


则:


prover 需要把多项式的commitment发送给verifier,也就是把该多项式的4个系数的commitment 之后发过去:​


verifier 需要验证:​


根据commitment 加法同态的性质,需要验证:​


验证通过,verfier 发送challenge factor给prover,下一个round 需要验证的目标值为:


Round four


基于,prover 计算本次round 验证需要用到的proof,也就是单变量多项式

备注:​ 其它编码取值对应的多项式为0,就没有一一枚举出来


则:


prover 需要把多项式的commitment发送给verifier,也就是把该多项式的4个系数的commitment 之后发过去:​


verifier 需要验证:​

根据commitment 加法同态的性质,需要验证:​


验证通过,verfier 发送challenge factor 给prover,下一个round 需要验证的目标值为:​


Round five


基于,prover 计算本次round 验证需要用到的proof,也就是单变量多项式


则:


prover 需要把多项式 的commitment发送给verifier,也就是把该多项式的4个系数的commitment 之后发过去:​


verifier 需要验证:​


根据commitment 加法同态的性质,需要验证:​


验证通过,verfier 发送challenge factor给prover,下一个round 需要验证的目标值为:​


Last Round


目前challenge factor 的组合为:


prover 根据第1层电路的evaluation 值很容易就能插值出相应的MLE 多项式:​


prover 分别计算出三个claims 值的commitment:​


verifier 拿着这三个commitment 完成第1层电路 sumcheck 协议的最后验证:​


mini-protocols ​


第一层电路evaluation 对应的MLE :​


上一个sumcheck 协议的Last Round中prover 新增加了两个claims,也就是:​


引入一个fold factor  我们可以把两个claims fold到一起:​


它的非常重要的特性就是:​


prover 把多项式进行commit后发送给verifier,同样也是多个系数分别commit,该多项式degree 为2,也就是说最多有3个commitment:​


verifier 拿到多项式的commitment 后就可以计算出:


这样就可以验证prover 之前发送的的commitment 是否与当前多项式的commitment 是否一致


为了验证prover 之前发送的的commitment X、Y是否合法,基于多项式的commitment , verifier 随机采样一个challenge factor  并发送给prover,prover 自然可以计算出下一轮sumcheck协议需要证明的evaluation值,即:


同时verifier 计算下一轮sumcheck协议需要证明的 的commitment:


最后我们再明确一点:mini-protocol 的根本目的是把两个claims fold成一个claims,减少prover 的成本,不然prover要分别证明两个claims:​

这样应该能make sense!


Step THREE


同Step TWO 一样,这里我们省略掉N 行文字+公式… 直接进入到Final Step!


Final Step


我们再回顾一下最开始的实例结构图:

image.png

根据最下面一层(public input + witness)的值,我们可以插值出MLE:


Step THREE 的mini-protocol 同样也会归结到证明两个claims,为了方便描述我们假设


多项式


假设fold factor ,把上面的两个claims合并成一个claim:​

备注:简单一句话就是,证明最下面一层(public input+witness)电路、Gate编码为(2, (3, 4)), evaluation 值为2 ,组成的在MLE 多项式上。


同样,verifier 基于prover 提供的的commitment,计算出 的commitment:


verifier 如何验证prover 提供的这个commitment的合法性?对于verifier 来说最下面一层电路的evaluation 分 public input p和 witness w,其中后者未知,假设两者长度相等,按照上图中的实例,也就是说前半部分为public input,后半部分为witness:


因此,我们需要把拆解成两部分


最终是要计算出的commitment,其中public input 部分因为是公开的,所以verifier 可以自行计算出相应的MLE 多项式,并拿到的commitment;另外witness 部分因为在Step ZERO prover 已经把它们的commitment 全部都已经发给verifier 了,verifier 只需要基于此拿到 的commitment就可以了:


最后的最后,我们put it together :​


What’s Next


到此为止,满足ZK argument的Vallina 版本的GKR协议也就完整了,紧接着我们再detail一下Hyrax 在此基础之上都做了些什么?接着再看看Spark 在Hyrax基础之上做了些什么?最后再看看Spartan 的整个全貌?


参考资料


【1】Hyrax 论文:https://eprint.iacr.org/2017/1132.pdf

【2】PAZK by Thaler:https://people.cs.georgetown.edu/jthaler/ProofsArgsAndZK.pdf

【3】trivial GKR 协议:https://learnblockchain.cn/article/6199

【4】sumcheck 协议:https://learnblockchain.cn/article/6188