Closed Whisker17 closed 3 years ago
RSA 是基于因式分解的难度
有一对秘密(p,q),有一个公共数据 n ,满足 (p+3)(q+2) = n+1
的情况下,你想要证明你知道 p,q ,然后我们把每一步分开:
def main(private p, private q, n): v0 = p + 3 v1 = q + 2 v2 = v0 * v1 v3 = n + 1 assert (v2 == v3) return 1
R1CS 并不是一个计算程序,你并非是通过一定的输入来获得一个值。相反, R1CS 是一个验证者的角色,他要做的是证明一个完整的计算过程是正确的。
为了做到这点, R1CS 必须接受一个完整状态的计算的输入,同时保证在运算时没有对数据进行更改。
在 R1CS 中有哪些变量呢?
常量 1
所有原始函数的公开输入
原始函数的所有输出
原始函数的秘密输入
所有在计算中产生的辅助变量
比如我们需要构建这样一个多项式:
(2 * p + 7v0 - 1/2 q) * (3p + 5q + n - 2) = (v0 + 3v1 + v2 + 100)
根据之前定义的限制,三方限制的格式为:
<A3.s> * <B3.s> - <C3.s> == 0
那么可得:
A = [0, 0, 0, 2, -1/2, 7, 0, 0, 0] B = [-2, 1, 0, 3, 5, 0, 0, 0, 0] C = [100, 0, 0, 0, 0, 1, 3, 1, 0]
对于 zkSNARK 来说真正的输入为 R1CS ,而不是电路本身。
Constraint Systems for ZK SNARKs