“如何向别人证明你知道某个数学方程的解,同时又不透露解本身?”这是零知识证明(ZKP)抛出的核心问题。在去中心化系统和看重隐私的应用里,证明者需要让验证者相信一条陈述在数学上成立,而除了“成立”这个结论之外,不泄露任何信息。眼下工业界落地最广的ZKP家族是zk-SNARK——全称“零知识简洁非交互式知识论证”。它的底层思路是把程序逻辑编译成一组代数约束,再用适配双线性对的椭圆曲线密码学完成验证。
整个过程可以拆成三部走。第一步,将代码转译成算术电路。假定我们要证明的是一条简单的三次方程:x³ + x + 5 = 35。先把方程打散为一个有向无环图,里面只允许加法和乘法两种门。例如,门1计算 sym_1 = x * x;门2计算 sym_2 = sym_1 * x,得到 x³;门3计算 y = sym_2 + x,得到 x³ + x;门4则是一个常量约束 y + 5 = 35。这个图就是算术电路,它用一种纯数学的模型把执行过程摆了出来。
第二步,为了用数学方式强制整条电路成立,我们把每个门改写成秩1约束系统(R1CS)。R1CS是一系列向量等式,格式统一为 (A·s) × (B·s) = C·s。这里的 s 是“见证向量”,包含所有输入、中间变量和输出常量——在这个例子里,s = [1, x, out, sym_1, sym_2, y]。A、B、C 则是与 s 等长的系数向量,分别负责锁定每个乘法门的左输入、右输入和输出。以门1“x * x = sym_1”为例,A 挑出 x,B 也挑出 x,C 挑出 sym_1。点积一做,恰好还原 x * x = sym_1。当把所有这样的向量堆叠成矩阵,整个方程组成立当且仅当见证向量代表的是一条有效的执行轨迹。
第三步,矩阵验证在规模上去之后很慢——必须逐行检查每一条约束。为了让验证变得简洁,我们把R1CS矩阵用拉格朗日插值转化成单个多项式等式,得到一个二次算术程序(QAP)。具体做法是把矩阵的每一列映射为一个多项式,比如 A(x) = Σ A_i · L_i(x),B(x) 与 C(x) 同理。最终得到一个统一的多项式恒等式:A(x) × B(x) − C(x) = H(x) × T(x),其中 T(x) 是与约束结构相关的公开多项式。检查这个等式在某个随机点成立,就可以用极小代价确认原电路的所有门都成立,而证明者不必再说出那个私密的 x。
热门跟贴