零知识证明 - zkSNARK入门

本文是零知识证明zkSNARK的入门指南,通过阿里巴巴的比喻解释其基本概念,阐述了零知识证明的逻辑框架,包括多项式问题的转化、随机挑选验证、同态隐藏和零知识四个组成部分。文章还介绍了NP问题、NPC问题以及QSP问题,为理解zkSNARK技术打下基础。最后,详细讲解了QSP问题的zkSNARK证明过程,涉及多项式问题的证明、有线群论基础、配对函数和δ偏移等概念。
摘要由CSDN通过智能技术生成

网络上讲解零知识证明的文章就不多,这些文章要不太浅显,要不太深入,很少有能给入门者整体框架上的认识。

比如,阿里巴巴零知识证明就是一个非常好的通俗理解零知识证明的例子:

阿里巴巴被强盗抓住,为了保命,他需要向强盗证明自己拥有打开石门的密码,同时又不能把密码告诉强盗。他想出一个解决办法,先让强盗离开自己一箭之地,距离足够远让强盗无法听到口令,足够近让阿里巴巴无法在强盗的弓箭下逃生。阿里巴巴就在这个距离下向强盗展示了石门的打开和关闭。

这个整个过程就是零知识证明,证明者能够在不向验证者提供任何有用信息(石门的口令)的情况下,使验证者相信某个论断(阿里巴巴知道打开石门的方法)是正确的。

技术人除了通俗的理解零知识证明外,还需要对零知识的理论和推导过程深入理解运用。以太坊的一篇blog,比较适合想深入理解零知识证明的小伙伴。

https://blog.ethereum.org/2016/12/05/zksnarks-in-a-nutshell/

这篇文章也是这篇blog的翻译和我自己的理解。通过这篇文章,能快速建立零知识证明的逻辑框架。虽然这篇文章有些推导公式,但是相对简单,小伙伴可以耐心阅读。

先给出零知识证明的逻辑框架:

在这里插入图片描述

0 - 零知识证明的基本概念

零知识证明,zkSNARKzero-knowledge Succint Non-interactive ARguments of Knowledge的简称:

  • Succinct:证明的数据量比较小
  • Non-interactive:没有或者只有很少交互。
  • ARguments:验证者只对计算能力有限的证明者有效。拥有足够计算能力的证明者可以伪造证明。这也叫“计算可靠性"(相对的还有”完美可靠性")。
  • of Knowledge:对于证明者来说在不知道证据(Witness,比如一个哈希函数的输入或者一个确定 Merkle-tree 节点的路径)的情况下,构造出一组参数和证明是不可能的。

零知识证明大体由四部分组成:

  • 多项式问题的转化 - 需要证明的问题转化为多项式问题 t(x)h(x) = w(x)v(x),证明者提交证明让验证者确认多项式成立。
  • 随机挑选验证 - 随机选择验证的数值s,验证t(s)h(s) = w(s)v(s)。相对于验证多项式相等t(x)h(x) = w(x)v(x),随机挑选验证,简单,验证数据少。随机挑选验证,安全性肯定不及多项式等式验证,但如果确实足够随机,安全性还是相当高的。
  • 同态隐藏 - 同态隐藏指的是函数的一种特性。输入的计算和输出的计算保持“同态”。以加法同态为例,满足如下的三个条件的函数E(x),称为加法同态:1. 给定 E(x),很难推导出x. 2. 不同的输入,对应不同输出 3. E(x+y) 可以由 E(x),E(y)计算出来。乘法同态类似。
  • 零知识 - 证明者和验证者之间除了“问题证明与否”知识外,不知道其他任何知识(不知道随机挑选值,不知道挑选值的多项式计算结果等等)。

在了解零知识的基础概念上,慢慢推导整个零知识证明过程,先从NP问题说起。

1- NP问题以及约化

解决一个问题需要花费时间。如果解决问题需要的时间与问题的规模之间是多项式关系,则可以称该问题具有多项式复杂度。一般问题可分成两类:P问题NP问题。P问题指的是在多项式时间内可解的问题。 NP问题(Non-Deterministic Polynomial Problem,非确定性多项式问题),指不能在多项式内可解,但是可以在多项式时间内验证的问题。

很显然,P问题也是NP问题,但是是否NP问题是P问题,NP=P?,目前为止还没有人能证明。一般认为,NP问题不等于P问题,也就是说,NP问题不存在多项式解法。

约化(Reduction),可以理解成问题的转化。对任意一个程序A的输入,都能按某种法则变换成程序B的输入,使两程序的输出相同,那么,可以说,问题A可约化为问题B。

NPC问题,是一个NP问题,并且,其他所有的NP问题都能归约到它。简单的说,NP问题之间可以相互归约,一个NP问题求解,其他NP问题一样能求解。

举例说明,NP问题以及NP问题的归约。

布尔公式满足性问题(SAT问题,boolean formula satisfiability) 就是一个NP问题。布尔公式定义如下:

  • 假设变量 x 1 x_1 x1, x 2 x_2 x2, x 3 x_3 x3, … 是布尔公式

  • 假设f是布尔公式, ¬ f \lnot f ¬f也是布尔公式(取反)

  • 假设f和g是布尔公式, f ∧ g f \land g fg f ∨ g f \lor g fg也是布尔公式(与和或)

一个布尔公式可满足,指输入是0/1的情况下,存在输出为真。SAT问题指,找出所有可满足的布尔公式。SAT问题看上去,除了枚举一个个可能的布尔公式外,没有更好的办法,也就是多项式时间内不可解。如果知道一个可满足的布尔公式,验证非常方便(输入是0/1的情况下,看看输出是否为真)。SAT问题是NP问题。

再看看另外一个NP问题:PolyZero问题。PolyZero问题指某个多项式满足:多项式输入是0或1的情况下,多项式输出为0。

P o l y Z e r o ( f ) : = 1 PolyZero(f) := 1 PolyZero(f):=1

f满足输入是0/1的情况下,多项式输出为0。

一个布尔表达式f可以通过如下的归约函数r,转化为多项式:

  • r ( x i ) : = ( 1 − x i ) r(x_i) := (1-x_i) r(xi):=(1xi)
  • r ( ¬ f ) : = ( 1 − r ( f ) ) r(\lnot f) := (1-r(f)) r(¬f):=(1r(f))
  • r ( f ∧ g ) : = ( 1 − ( 1 − r ( f ) ) ( 1 − r ( g ) ) ) r(f \land g) := (1- (1 - r(f))(1 - r(g))) r(fg):=(1(1r(f))(1r(g)))
  • r ( f ∨ g ) : = r ( f ) r ( g ) r(f \lor g) := r(f)r(g) r(fg):=r(f)r(g)

也就是说,一个SAT问题,通过归约函数r,可以归约为一个PolyZero问题:f是可满足的,当且仅当r(f)输出为0。

S A T ( f ) = P o l y Z e r o ( r ( f ) ) SAT(f) = PolyZero(r(f)) SAT(f)=PolyZero(r(f))

总结一下,NP问题是在多项式时间内无解,但是可以多项式时间验证的问题。NP问题可以相互归约。

2 - QSP问题

需要证明的问题,肯定是NP问题,如果是P问题,不存在问题解的”寻找“,也就不存在证明。简单的说,zkSNARK问题处理的都是NP问题。既然NP问题相互可以归约,首先需要确定一个NP问题,其他NP问题都可以归约到这个NP问题,再进行证明。也就是,证明了一个NP问题,就可以证明所有NP问题。

QSP问题是个NP问题,也特别适合zkSNARK。为啥特别适合,目前还不需要深究。有相关的论文论证:https://eprint.iacr.org/2012/215.pdf。

QSP问题是这样一个NP问题:给定一系列的多项式,以及给定一个目标多项式,找出多项式的组合能整除目标多项式。输入为 n n n位的QSP问题定义如下:

  • 给定多个多项式: v 0 , . . . , v m , w 0 , . . . , w m v_0, ... , v_m, w_0, ... , w_m v0,...,vm,w0,...,wm
  • 目标多项式: t t t
  • 映射函数: f : { ( i , j ) ∣ 1 ≤ i ≤ n , j ∈ 0 , 1 } → { 1 , . . . m } f: \left\{(i, j) |1\leq i \leq n, j\in{0,1} \right\} \to \left\{1, ... m\right\} f:{ (i,j)1in,j0,1}{ 1,...m}

给定一个证据(Witness)u,满足如下条件,即可验证u是QSP问题的解:

  • a k , b k = 1    如 果 k = f ( i , u [ i ] ) a_k, b_k = 1\ \ 如果 k = f(i, u[i]) ak,bk=1  k=f(i,u[i])

  • a k , b k = 0    如 果 k = f ( i , 1 − u [ i ] ) a_k, b_k = 0\ \ 如果 k = f(i, 1- u[i]) ak,bk=0  k=f(i,1u[i])

  • v a w b 能 整 除   t , 其 中 v a = v 0 + a 1 v 1 + . . . + a m v m , w b = w 0 + b 1 w 1 + . . . + b m w m v_aw_b能整除\ t,其中v_a = v_0 + a_1v_1 + ... + a_mv_m, w_b = w_0 + b_1w_1+ ... + b_mw_m vawb tva=v0+a1v1+...+amvm,wb=w0+b1w1+...+bmwm

对一个证据u,对每一位进行两次映射计算( u [ i ] u[i] u[i]以及 1 − u [ i ] 1-u[i] 1u[i]),确定多项式之间的系数。因为针对证据u的每一位,计算两次,确定多项式之间的系数,如果 2 n < m 2n < m 2n<m,多项式的选择还是有很大的灵活性。

如果证明者知道QSP问题的解,需要提供证据(也就是u)。验证者在获知证据u的情况下,按照上述的规则恢复出多项式的系数,验证 v a v b v_av_b vavb是否能整除 t t t t h = v a w b th=v_aw_b th=vawb。为了方便验证者验证,证明者可以同时提供 h h h。在多项式维度比较大的情况下,多项式的乘法还是比较复杂的。

有个简单的想法,与其验证者验证整个多项式是否相等,不如随机挑选数值进行验证。假设验证者随机挑选验证数值s,验证者只需要验证 t ( s ) h ( s ) = v a ( s ) w b ( s ) t(s)h(s)=v_a(s)w_b(s) t(s)h(s)=va(s)wb(s)

以上是基础知识,下面开始介绍zkSNARK的证明过程。在继续深入一个QSP问题证明细节之前,先看看一个多项式问题的证明过程。

3 - 多项式问题的证明过程

假设一个多项式 f ( x ) = a 0 + a 1 x + a 2 x 2 + . . . + a d − 1 x d − 1 + a d x d f(x)=a_0+a_1x+a_2x^2+ ... + a_{d-1}x^{d-1}+a_dx^d f(x)=a0+a1x+a2x2+...+ad1x

  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值