酷玩网

深入了解zk-SNARKs

linx
欧意最新版本

欧意最新版本

欧意最新版本app是一款安全、稳定、可靠的数字货币交易平台。

APP下载  官网地址

本文旨在深入探讨zk-SNARKs(零知识证明简化形),尽管不可避免地会涉及一些数学概念,但本文将侧重于揭示这些数学公式背后的深层含义,而非对公式本身进行深入分析。

以下是一些基本假设: 1. Alice拥有一多项式P(x); 2. Bob随机选择一个点s,并将其传递给Alice; 3. Alice计算出P(s)并传回给Bob。

我们的目标是实现以下两点: 1. Alice不知道点s,Bob也不知道多项式P(x)(盲性); 2. 尽管如此,Alice可以向Bob传递P(s),同时Bob能够验证P(s)(可验证性)。这意味着双方均不掌握对方的任何信息,却能共同获得一个可验证的结果。

基于上述假设,我们引入一些基本的数学表达式。所提到的多项式P(x)定义为:P(x) = C_0 + C_1x + C_2x^2 + ... + C_nx^n。

首先,我们介绍Homomorphic Hiding(同态隐藏)。通过同态隐藏,我们能够实现信息隐藏的目的。从数学定义来看,它具有以下特性。首先,E(x)的定义为E(x) = g^x,然后E(x+y) = E(x)*E(y)。

HH支持线性相加,因此下列式子成立:E(ax+by) = g^{ax+by} = g^{ax}*g^{by} = E(x)^a + E(y)^b(*)。HH的假设是:知道E(x),无法反推出x的值。

若我们对P(x)进行同态隐藏,可以得出E(P(x)) = E(C_0 + C_1x + C_2x^2 + ... + C_dx^d) = E(1)^{C_0} * E(s)^{C_1} * E(s^2)^{C_2} * ... * E(s^d)^{C_d}。

也就是说,Bob只需要提供E(1)、E(s)、E(s^2)、...、E(s^d),而不需要提供s(E(s)无法反推出s),Alice就可以计算出E(P(s))的值。借此,我们实现了第一点的盲性。接下来,我们需要解决如何实现可验证性,因为Alice可能会提供虚假的值,而非P(x)上的点,因此我们需要确保Alice遵守规则。接下来,我们将介绍如何保证Alice提供正确的结果,以及Bob如何进行验证。

计算 → 算术电路 → R1CS → QAP → zk-SNARK

接下来,让我们回到SNARKs的基本计算。SNARKs无法处理所有问题,只能处理符合某种特定“形式/格式”的问题,才能解决。这种特定的“形式/格式”被称为QAP(quadratic arithmetic program)。

首先,我们需要将问题用算术电路和R1CS进行简化。简单来说,就是把复杂的数学表达式简化成基本的加减乘除运算,例如:我们要求(c1•c2)•(c1+c3)=7,将表达式拆解成许多单一运算的结合。如下:

// Arithmetic Circuit

S1 = C1 * C2

S2 = C1 + C3

S3 = S1 * S2

接下来,我们定义一组向量(a, b, c),使得s . a * s . b - s . c = 0。其中s代表[1, C1, C2, C3, S1, S2, S3],因此可以得到以下阵列:

// R1SC

S1 = C1 * C2

a=[0,1,0,0,0,0,0]

b=[0,0,1,0,0,0,0]

c=[0,0,0,0,1,0,0]

S2 = C1 + C3

a=[1,0,0,0,0,0,0]

b=[0,1,0,1,0,0,0]

c=[0,0,0,0,0,1,0]

S3 = S1 * S2

a=[0,0,0,0,1,0,0]

b=[0,0,0,0,0,1,0]

c=[0,0,0,0,0,0,1]

接下来是重点!

接下来,我们需要将上述向量组转换成多项式,而这个转换过程就称为QAP。QAP利用Lagrange插值,将a、b、c三组向量转换成多项式A'(x)、B'(x)、C'(x),因此原本的表达式变成P(x) = s.A'(x)*s.B'(x) - s.C'(x)。接着,我们定义P(t)=0当t=1、2、3...,而P(t)=0相当于P(t)可以被(xt)整除,因此,存在着H(x),可以满足P(x) = A(x)*B(x) - C(x) = H(x)*Z(x),其中Z(x) = (x-1)(x-2)(为了简化式子,s.A'(x) = A(x),s.B'(x)=B(x),s.C'(x)=C(x))。

在这里,我们先暂停一下,让大脑喘息一下。这一小段的重点在于QAP的多项式,因此在算术电路和R1CS方面没有过多涉及。这个多项式是SNARKs的核心概念,之后的验证也是基于这个多项式,所以如果看不懂,就记住P(x) = A(x)*B(x) - C(x) = H(x)*Z(x)这个重要的方程式就好。

关于知识系数测试和假设(KCA)

回到原本的问题,“Alice回传P(s)给Bob验证”,在Bob不知道P(x)的情况下,原本无法验证P(s),但通过QAP将问题转化后,Alice回传P(s)和H(s),Bob可以通过验证P(s) ≠ H(s)Z(s)来验证P(s)(为了避免数学式过于复杂,这里我们先忽略同态隐藏,P(s)应该是E(P(s)))。接下来,我们需要解决的问题是,Alice有机会伪造H'(s),使得P'(s) = H'(s)Z(s),这是本节的重点,即如何确保Alice遵守规范。

概念上,Bob提供的不只是一个点,而是一对有关联性的点(a, b),b = α*a,这样的一组点就称为α-pair。若Alice回传另一组α-pair,(a', b'),而b' = α*a',则可以通过这样的关系获得P(s)。

因为α值是无法得知的(无法从b/a得知),所以要将(a, b)再乘上一个α值,以传递一组新的α-pair (a', b')。这是最直观的想法。

标签: 数字货币