前言
隐私研究院【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承诺主要步骤:
- trust setup生成参数
一般为选取公共参数素数p和g(关联一条椭圆曲线),使用MPC仪式生成:
{ g , g s , g s 2 , g s 3 , ⋯ , g s d } \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保持为秘密)
- 创建承诺和证明
生成群具备加法同态和scale乘法性质,承诺表示为:
g f ( s ) = g ∑ c i s i = Π ( g s i ) c i g^{f(s)}=g^{\sum{c_{i}s^{i}}}=\Pi\left(g^{s^{i}}\right)^{c_{i}} gf(s)=g∑cisi=Π(gsi)ci
基于Schwartz-Zippel Lemma,即对任意选的随机数 s s s,取一个点 a a a打开求值 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 − a s-a s−a、 q ( s ) q(s) q(