Zcash series D: 从计算到电路

螃蟹仔仔这回很开心,因为这篇文章看上去会简洁许多。

上一篇的结尾我们看到“证明这件小事”不过就是两个整数相加和比较,这样的计算问题是计算机最擅长的事了。我们都知道数在计算机内是以二进制,也就是0和1储存的。你应该听说过布尔逻辑——与(AND)、或(OR)、非(NOT),它们的组合可以对任意的一组0/1输入给出0/1输出。逻辑门是数字电路的基本单元(我默默地打开了上上学期学的数字电路技术基础的课件

异或就是一种非常常见的由与或非构成的复合逻辑运算。

因为A⊕B = (¬A ∧ B) ∨ (A ∧¬B),其中∧是AND的符号,∨是OR的符号,¬是NOT的符号,大家不妨用上面的真值表检验一下(就是分别把A和B代入0和1的四种组合看看出来的结果是什么)。

有了与或非这“三板斧”,两个整数的加法就轻而易举了

上面右边的这个图叫做全加器,表格里的Carry in和Carry out就是那个你小学学加法的时候容易忘记的“进位”

至于两个整数是否相等,异或一下看看是否为0就搞掂啦

注意到我们往往要求几个条件同时满足(在series C里我提到的是三个条件,但其实不止这些),这就需要对它们进行AND运算,用“与门”把它们连起来。

对于一个布尔表达式可以搭出这样的电路

但是!Zcash并没有选择用布尔电路,而是用了算术电路!大概是为了后面的数学技巧(同态加密、多项式验证)做铺垫吧。于是又回归到了熟悉的加、减、乘(避免用到除法,原因显而易见,0不能做除数、两数相除可能得到分数什么的都很烦人)。

AND变成了x·y

NOT变成了1-x

那OR呢?由于A ∨ B=¬(¬A ∧ ¬B),所以可以用1-(1-x)·(1-y)来表示

这样一来,布尔电路和算术电路的相互转换不是梦。

从这篇文章开始,我们已经跳出了现实生活中的交易场景,开始窥视抽象的内核,在通往零知识证明的黑盒子zk-SNARK(全称是Zero-Knowledge Succinct Non-Interactive Argument of Knowledge)的万里长征路上,我们才迈出了第一步。

Computation → Arithmetic Circuit → R1CS → QAP → zk-SNARK