前言

隐私研究院【PrivacyIN】第一期ZK训练营课程精讲内容上线,本期课堂邀请到美国德州农工大学(Texas A&M University)计算机科学与工程学院的助理教授张宇鹏,主要介绍经典零知识证明协议设计原理,课堂主题为《Basic Principles of the Classic ZK Protocols (Groth16 Plonk Stark)》。

课程精讲全文

零知识证明(Zero-Knowledge-Proofs)自1985年由Goldwasser、Micali和 Rackof首次提出至今,随着零知识证明理论和技术的进步,涌现出很多经典零知识证明系统,比如:Groth16,Pinocchio,Plonk,Marlin,Stark,Halo2等,这些零知识证明系统推动着零知识证明从理论逐步进入实用应用,同时理解这些协议的工作机制和构造原理,对于设计ZKP应用系统有着非常重要意义。

本期课堂张宇鹏老师分别对这三种典型协议(non-universal)SNARK、PLONK和STARK进行设计原理分析,主要内容有:多项式承诺、密码学数论简介、PlONK协议、SNARK类协议、STARK协议等。

课堂开始,张宇鹏老师首先对上一堂课的零知识证明系统进行简单回顾,帮助同学们加深对ZKP概念和计算模型的理解。

多项式承诺

多项式承诺(polynomial commitment)是构造零知识证明系统常用密码学工具,其构造模型中prover/verifer为主要参与者,使用交互证明方式构造(可以使用Fiat–Shamir-heuristic转换为非交互方式)。实际可以认为多项式承诺是一个种特殊的零知识证明,其同样满足零知识证明的Correctness、Soundness、Zero-knowledge这些特性。

多项式承诺的基本原理是:

  • prover拥有一个多项式,其构建一个关于这个多项式的承诺commitmentδf\delta_fδf​,然后将承诺δf\delta_fδf​发送给verifier

  • verifier收到的承诺commitmentδf\delta_fδf​,任意取一点a,发送该点给prover,以请求计算该点上的结果

  • prover接收计算请求,使用多项式在a点计算得到f(a)f(a)f(a),并生成一个证明proof,然后将f(a)f(a)f(a)和证明proof都发给verifer进行验证


很多经典的零知识证明协议都基于多项式承诺进行构造,比如Plonk、Dark、Stark、Supersonic等。

KZG多项式承诺是非常经典高效的一种多项式承诺构造实现,尤其在Plonk协议中是非常基础的组件。KGZ多项式承诺基于Bilinear-Pairing和生成群(注:后续内容将详细介绍),其中生成群一般为基于椭圆曲线在一个有限域中生成(如选取椭圆曲线后确定g),KGZ承诺主要步骤:

  1. trust setup生成参数

一般为选取公共参数素数p和g(关联一条椭圆曲线),使用MPC仪式生成:

{g,gs,gs2,gs3,⋯,gsd}\left\{ \begin{matrix} g,g^{s},g^{s^{2}},g^{s^{3}},\cdots,g^{s^{d}} \end{matrix} \right\} {g,gs,gs2,gs3,⋯,gsd​}

其中s为随机数且生成过程中将会被丢弃(s保持为秘密)

  1. 创建承诺和证明

生成群具备加法同态和scale乘法性质,承诺表示为:

gf(s)=g∑cisi=Π(gsi)cig^{f(s)}=g^{\sum{c_{i}s^{i}}}=\Pi\left(g^{s^{i}}\right)^{c_{i}} gf(s)=g∑ci​si=Π(gsi)ci​

基于Schwartz-Zippel Lemma,即对任意选的随机数sss,取一个点aaa打开求值f(a)f(a)f(a),则有:f(s)−f(a)=(s−a)q(s)f(s)-f(a)=(s-a)q(s)f(s)−f(a)=(s−a)q(s),于是可以将f(s)−f(a)f(s)-f(a)f(s)−f(a)、s−as-as−a、q(s)q(s)q(s)使用生成元表示为、gf(s)/gf(a)g^{f(s)}/g^{f(a)}gf(s)/gf(a)、gs−ag^{s-a}gs−a、gq(s)g^{q(s)}gq(s)(可以理解为具备加法同态特性的加密值)。

  1. 承诺+proof验证

使用Bilinear-Pairing验证:

e(gf(s)/gf(a),g)=e(gs−a,gq(s)e(g^f(s)/g^f(a),g)=e(g^{s-a},g^{q(s)}e(gf(s)/gf(a),g)=e(gs−a,gq(s)

是否成立,也即验证了f(s)−f(a)=(s−a)q(s)f(s)-f(a)=(s-a)q(s)f(s)−f(a)=(s−a)q(s)成立。

密码学数论基础

零知识证明有着非常重的数论理论要求,为了克服重度的数学问题,帮助大家理解经典协议构造背后的数学原理,课程中张宇鹏老师带领大家从最基本的素数定义和模运算开启数论的学习。

素数p,是一个数p大于或等于2且只能被自身p和1整除的整数;

模态算术,是指任何数或者其算术运算值(包括中间运算)都需要模上指定的正整数(如p),这能保证模态运算后的数都落在(0,p)之间,比如模13运算:

-1mod13=-1 +1x13=12;
-1+2mod13,即:(-1mod13)+(2mod13)=(12+2)mod13=1。

群Group是定义在数集合上,对某个运算符满足:

  • 封闭性closure(群中的元素,执行该操作符运算后依然在定义的群中)

  • 结合律associativity(群中的元素对于该定义操作符运算满足交换律,如:(a+b)+c=a+(b+c))

  • 零元identity element(群中存在一个元素e,任何群中的元素与e执行该定义操作都为元素本身)

  • 逆元inverse element(群中的任何元素a,都存在一个群中的元素b,满足a+b=e)

例如,对加法+的整数群,对加法取模整数群。

域Field是一个群Group,对于操作(+,x)满足:

  • 域Field是一个加法群

  • 域Field是一个剔除加法零元,在「x」操作上的一个群

有理数、实数、复数、整数模素数p(有限域)都是域,有限域是密码学很常用的。

有限域有一个特性,其总是可以找到了一个生成元(Generator),生成元对自己循环乘法操作能够得到有限域所有元素,也即得到一个循环群,因此可以用生成元生成的指数形式元素作为有限域的表示,另外目前具备快速的算法能够找到有限域的生成元。

双线性对Bilinear-Pairing一个非常高效的密码学工具,其将一个base乘法循环群中的两个元素对,映射到一个目标target群,即:

e(pa,Qb)=e(P,Q)ab:G×G→GTe(p^a,Q^b)=e(P,Q)^ab:G \times G \rightarrow G_T e(pa,Qb)=e(P,Q)ab:G×G→GT​

Bilinear-Pairing可以用来验证乘法循环群元素间的乘法关系(是否相等),但是不能用来计算,其实现较为复杂,课程中主要介绍了Bilinear-Pairing的运算特性,并提供使用范例,如:

e(ga,Gb)=e(g,g)ab=e(gab,g)e(g^a,G^b)=e{(g,g)}^ab=e(g^ab,g)e(ga,Gb)=e(g,g)ab=e(gab,g)

PLONK协议

为了更好地讲解Plonk构造原理,张宇鹏老师给出一个通用的ZKP构造模型,其中prover拥有秘密数据secret data,计算问题转换为通用的电路C计算问题,prover向verifier证明自己使用secret data作为输入并执行电路得到输出,verifier验证prover的证明proof是否正确。

Plonk协议是一种universal-trusted-setup的零知识证明协议,它使用SRC(Structure-Reference-String)形如:

{g,gs,gs2,gs3,⋯,gsd}\left\{ \begin{matrix} g,g^{s},g^{s^{2}},g^{s^{3}},\cdots,g^{s^{d}} \end{matrix} \right\} {g,gs,gs2,gs3,⋯,gsd​}
的结构化参数,这些参数具备通用、可更新的特性。Plonk主要通过设计独特的电路表示,基于KZG承诺和置换permutation来实现。Plonk电路门使用Plonkish格式(区别于R1CS)统一来表示电路门的约束,即:

qLiai+qRibi+qMiai×bi+qOici+qci=0q_{L_i}a_i+q_{R_i}b_i+q_{M_i}a_i \times b_i+q_{O_i}c_i+q_{c_i}=0qLi​​ai​+qRi​​bi​+qMi​​ai​×bi​+qOi​​ci​+qci​​=0

这样加、乘、公开输入、输出都可以用这个式子表达。

例如加法门可以表示为:

qL1=1,qR1=1,qM1=0,qO1=−1,qc1=0q_{L_1}=1,q_{R_1}=1,q_{M_1}=0,q_{O_1}=-1,q_{c_1}=0qL1​​=1,qR1​​=1,qM1​​=0,qO1​​=−1,qc1​​=0

例如乘法门可以表示为:

qL2=0,qR2=0,qM2=1,qO2=−1,qc1=0q_{L_2}=0,q_{R_2}=0,q_{M_2}=1,q_{O_2}=-1,q_{c_1}=0qL2​​=0,qR2​​=0,qM2​​=1,qO2​​=−1,qc1​​=0

Plonk协议构建主要分为两大部分:电路门约束处理和复制(线)约束处理。

电路门约束处理主要步骤:

prover、verifier预处理,使用多项式插值求解得到系数多项式qL(x)qL(x)qL(x)、qR(x)qR(x)qR(x)、qM(x)qM(x)qM(x)、qO(x)qO(x)qO(x)、qC(x)qC(x)qC(x);prover得到电路门线输入多项式a(x)a(x)a(x)、b(x)b(x)b(x)、c(x)c(x)c(x),其求解的插值为元根:

x=wi,i=0,…,n−1x=w^i,i=0,\ldots,n-1x=wi,i=0,…,n−1

prover这些多项式压缩成一个多项式,并接着可以得到一个目标多项式t(x)t(x)t(x):

qL(x)a(x)+qR(x)b(x)+qM(x)a(x)b(x)+qo(x)c(x)+qc(x)=VH(x)t(x)q_L(x)a(x)+q_R(x)b(x)+q_M(x)a(x)b(x)+q_o(x)c(x)+q_c(x)=V_H(x)t(x)qL​(x)a(x)+qR​(x)b(x)+qM​(x)a(x)b(x)+qo​(x)c(x)+qc​(x)=VH​(x)t(x)

VH(x)=∏i(x−wi)V_H(x)=\prod_i(x-w^i)VH​(x)=∏i​(x−wi)vanishing polynomial

(注:t(x)t(x)t(x)原论文实现是由电路门约束和复制约束构建两部分的多项式复合而成的)

prover使用KZG承诺创建a(x)a(x)a(x)、b(x)b(x)b(x)、c(x)c(x)c(x)、t(x)t(x)t(x)作为证明,提供给verifier进行承诺打开验证正确性。

Plonk的复制约束主要思路是,通过将相等的电路线进行置换(重排),置换后的元素和元素是相等同的,引入置换多项式,然后进一步转换为等价约束多项式:

并最终转换为基于拉格朗日多项式的特殊多项式Z(X)Z(X)Z(X),然后使用这个多项式和门约束多项式构成一个压缩的新多项式进行证明和验证。


复制(线)约束的处理主要步骤:

  • prover和verifier预处理,多项式插值求解置换permutation多项式:

SID(x),Sδ(x)S_{ID}(x),S_\delta(x)SID​(x),Sδ​(x)

(注:Plonk原论文使用类似多个permutation函数,原理相似)

  • prover对Z(x)Z(x)Z(x)等多项式进行KZG承诺,输出证明。

  • verifier进行KZG承诺打开和多项式关系正确性验证。

Plonk协议整体执行:

Plonk协议整体执行实际就是对门约束和复制约束的处理,然后构建一个大的门约束和复制约束关联的大多项式约束,主要基于KZG多项式承诺和拉格朗日插值来构建完整协议,最后使用Bilinear-Pairing进行验证。

SNARK协议

传统的SNARK协议,主要是指使用非通用trusted-setup生成零知识证明所需要得公共参数和公共key(证明key和验证key),一般基于Billinear-Pairing构建的简洁非交互零知识证明协议,这里比较经典的构造有Pinocchio和Groth16协议,它们主要是使用R1CS构建电路约束,然后转换为QAP构建多项式证明,并使用Billinear-Pairing对多项式进行验证。

传统的SNARK计算问题一般工作流程如下:

  • 将一个计算问题转换为电路问题(表示为电路)

  • 将电路表示为R1CS约束(乘法门约束)

  • 将R1CS约束通过多项式插值求解得到QAP,将QAP多项式和目标多项式t(x)转换到加密形式的群G,作为证明部分

  • 使用Billinear-Pairing对QAP多项式和目标多项式t(x)t(x)t(x)进行验证:
    Verification: e(π1,π2)/e(π3,g)=e(gt(s),π4)\text { Verification: } e\left(\pi_{1}, \pi_{2}\right) / e\left(\pi_{3}, g\right)=e\left(g^{t(s)}, \pi_{4}\right)  Verification: e(π1​,π2​)/e(π3​,g)=e(gt(s),π4​)

STARK协议

STARK是一种无需trusted-setup的简洁非交互零知识证明协议,STARK前端主要采用RAM(Random-Access-Memory)Program的方式进行协构建,一个典型的RAM-program由CPU(包括很多寄存器等), 内存Memory,程序执行指令program等组成。

STARK将证明问题转换为证明RAM Program是否正确地执行,这跟传统zkSNARK协议验证电路执行有很大地差异。STARK使用RAM Program进行前端程序构造使得设计程序可以以很少指令代码来运行大批量次数和循环的指令步骤执行,而不会限制于电路大小;Random Access操作在常数复杂度等优点。

STARK使用RAM-to-cuirt-Reduction的技术进行证明,其将整个计算过程中所有跟RAM的交互、CPU State的变化等记录下来,然后连接或聚合起来,并转换成类似电路形式约束去证明和验证RAW Program是否执行正确。

STARK的算数运算是通过一系列的多项式来表示的,如程序执行步骤1的状态为P1(X,⋯,Y)P1(X,\cdots,Y)P1(X,⋯,Y),执行步骤2的状态为P2(X,⋯,Y)P2(X,\cdots,Y)P2(X,⋯,Y),每个步骤可以构造一个多项式。

STARK的后端实现可以将执行步骤多项式转换为类似SNARK或Plonk方式的多项式约束,然后在某个degree上进行Random linear combination构建一个大的验证多项式,用来证明和验证程序执行正确性。

实际上STARK使用基于默克尔树的FRI protocol (low degree test)来实现后端构建,另外STARK中还需要进行额外的Permutation测试和公共约束,FRI部分的理论较为复杂,课堂中没有深入探讨。

自由讨论环节,张宇鹏耐心地为学员解答了一系列关于协议设计原理的相关问题。

关PrivacyIN

PrivacyIN 隐私学院 (Privacy Institution) 由LatticeX基金会发起,致力于建设开放的密码和隐私技术布道和研究社区。联合全球顶尖的学者、隐私技术开发者推动ZK(零知识证明)、MPC(安全多方计算)、FHE(全同态密码)的创新和落地。

关于LatticeX基金会

LatticeX基金会(LatticeX Foundation)是一家全球范围的开源技术社区,以通过构建复杂计算归还用户数据主权,保护数据隐私,实现数据价值交换为愿景,旨在构建一个完全去中心化的计算互操作网络,在保护数据主权和隐私的前提下促进数据使用权的交易,并为实现LatticeX愿景资助各类学术研究及科研项目。

PrivacyIN Week2 | 张宇鹏博导开讲经典零知识证明协议设计原理相关推荐

  1. PrivacyIN Week1课程回顾 | 张宇鹏博导开讲零知识证明密码学基础研究导论

    转自:PrivacyIN 隐私学院 前言 隐私学院[PrivacyIN]第一期ZK训练营课程精讲内容上线啦,本期课堂邀请到美国德州农工大学(Texas A&M University)计算机科学 ...

  2. 蚂蚁区块链第7课 零知识证明隐私保护原理和蚂蚁BAAS接口调用实现

    1,摘要 本文试图普及隐私保护和零知识证明的相关技术知识,尝试使用更简单的描述来理解复杂的数学算法和技术原理.同时,也提供了蚂蚁区块链已经实现的隐私保护的接口函数说明. 本文涉及的专业知识有零知识证明 ...

  3. 零知识证明经典文献大汇总(可收藏)

    从去年的DAO经典到更早的NFT经典(以及在此之前是最初的加密经典). 本文, 为那些寻求理解.深入和构建零知识的人挑选了一组资源:强大的基础技术,这些基础技术掌握着区块链可扩展性的关键,代表着隐私应 ...

  4. 零知识证明学习资源汇总

    本文将继续会持续进行更新,更新后的版本将在 Github 和知乎上发布,欢迎关注. Github 地址:https://github.com/sec-bit/learning-zkp/blob/mas ...

  5. 零知识证明系列之一——初探零知识证明

    前言 区块链的发展可谓是日新月异,分布式账本,哈希函数,merkle tree,公钥算法,p2p网络,共识机制,智能合约等等很高大上的名词相信大家一定都不会很陌生.区块链像一个有机体,融合了各种不同的 ...

  6. 深入浅出区块链——零知识证明

    引子 隐私保护在区块链领域越来越受到重视,在隐私保护的种种手段中,零知识证明脱颖而出.那么零知识证明到底是什么东西呢? 首先,我们抛出一个问题:如何在不说出秘密的情况下,让对方知道你已经知道了这个秘密 ...

  7. 零知识证明: 抛砖引玉

    当今密码学世界中最酷炫的一件事,莫过于那些优美又神秘的专有名词.我们可以自由的以这些术语给朋克乐队或 Tumbirs 博客起名字,像是"硬核谓词(hard-core predicate)&q ...

  8. 零知识证明学习笔记:背景与起源

    副标题:斯坦福学霸的零知识证明学习笔记(一) 本文作者东泽,来自安比技术社区的小伙伴,目前就读于斯坦福大学,研究方向密码学,本系列文章来源于作者在斯坦福著名的课程<CS 251: Cryptoc ...

  9. 从小故事带你理解零知识证明 | 区块链一千零一问

    开胃小故事 阿里巴巴证明 阿里巴巴被强盗抓住,为了保命,他需要向强盗证明自己拥有打开石门的密码,同时又不能把密码告诉强盗.他想出一个解决办法,先让强盗离开自己一箭之地,距离足够远让强盗无法听到口令,足 ...

最新文章

  1. python 爬虫002-http与urllib2
  2. Qt值得学习吗?详解Qt的几种开发方式
  3. 「雕爷学编程」Arduino动手做(15)——手指侦测心跳模块
  4. Django讲课笔记04:Django项目的调试
  5. 《代码大全2》高质量子程序的5个关键点
  6. 索引 | 学堂原创推文汇总-v2
  7. nagios无法安装check_mysql插件的问题
  8. 10 mysql选错索引
  9. Linux 高性能服务器编程——多进程编程
  10. Qt 人类可读大小 quint64字节转可读字符串 “1.1 GB“
  11. 计算机教室网络同传及保护,用好联想网络同传系统解放信息技术教师
  12. 天翼云虚拟IP地址及其在高可用集群中的应用
  13. 无线发射机中的正交上变频技术--USRP X410软件无线电平台开发
  14. 新科高德发布2009.03版电子眼升级数据升级方法: 1. 新科2440方案机器内
  15. 怎么恢复苹果内置的计算机,苹果还原系统的方法_苹果电脑Mac如何恢复出厂系统-win7之家...
  16. javaktv点歌系统项目(java点歌系统)java点歌管理系统
  17. 大学计算机协会大一面试,大一学生社团面试自我介绍
  18. 探究:Adobe Premiere Pro CC 2018 导入SRT字幕显示不全问题
  19. bim计算机工程师考试,BIM工程师怎么报考?
  20. HQChart使用教程68 - 配置DRAWTEXT, DRAWICON, DRAWNUMBER字体大小

热门文章

  1. qos cbs_如何取消CBS所有访问订阅
  2. UI设计的APP标准规范
  3. 振弦式传感器数据采集到水库大坝监测云平台进行监控和报警
  4. 卡券、直充订单列表(post 表单提交)接口
  5. 通信工程考研英语复试专有名词翻译
  6. 模型小常识,C4D扫描的使用
  7. Unity-VR | AR相关(更新中)
  8. #今日论文推荐# 莫纳什大学最新《长文档摘要》综述,39页pdf长文档摘要的实证研究:数据集、模型和指标
  9. 阿里云客服联系方式汇总
  10. UIdemo 制作一个简单的iPhone相册