我试图理解我的zokrates代码,以及它是如何按照这篇文章逐步处理zk的。
本文将zk分解为三个步骤.
G接受一个秘密参数lambda和一个程序C来生成pk (这是验证密钥)和vk (它是验证密钥):(pk, vk) = G(C, lambda)这里的C只是一个接受预映像的函数,如果哈希值与预映像相同,则返回true:
// w is the preimage, x is the hashed value of w
function C(x, w) {
return ( sha256(w) == x );
}s、已知的散列H和证明键pk,并通过生成算法P生成证明prf:prf = P(pk, H, s)V(vk, H, prf)如果prf是正确的,则结果是正确的,这从本质上证明了验证者知道证人。
现在,我有一个zokrate代码,它有两个值"a“和"b”。
def main(private field a, field b) -> (field):
field h = if a * a == b then 1 else 0 fi
return h当我执行:
~/zokrates setup我得到以下输出:
zokrates@0a96d8e9989b:~/code/square$ ~/zokrates setup
Performing setup...
def main(_0, _1) -> (1):
(1 * _0) * (1 * _0) == 1 * _4
# _2, _3 = ConditionEq((-1) * _1 + 1 * _4)
((-1) * _1 + 1 * _4) * (1 * _3) == 1 * _2
(1 * ~one + (-1) * _2) * ((-1) * _1 + 1 * _4) == 0
(1 * ~one) * (1 * ~one + (-1) * _2) == 1 * ~out_0
return ~out_0
WARNING: You are using the G16 scheme which is subject to malleability. See zokrates.github.io/reference/proving_schemes.html#g16-malleability for implications.
Has generated 7 points
Setup completed.我不知道证明密钥和验证密钥在这个输出中的位置。根据lambda值是什么或C函数是什么,如何适合于上面的示例?
当我执行以下操作时,应该创建一个证人:
~/zokrates compute-witness -a ... 我当时的印象是,“证人”是证明者已经拥有的先兆。“见证”难道不是证明者想要向验证者证明她知道这一点的东西吗?
当我执行命令时给我的输出如下:
zokrates@0a96d8e9989b:~/code/square$ ~/zokrates compute-witness -a a b
Computing witness...
def main(_0, _1) -> (1):
(1 * _0) * (1 * _0) == 1 * _4
# _2, _3 = ConditionEq((-1) * _1 + 1 * _4)
((-1) * _1 + 1 * _4) * (1 * _3) == 1 * _2
(1 * ~one + (-1) * _2) * ((-1) * _1 + 1 * _4) == 0
(1 * ~one) * (1 * ~one + (-1) * _2) == 1 * ~out_0
return ~out_0
Could not parse argument: a这里到底发生了什么?
发布于 2021-01-13 21:24:38
免责声明我加入这一答案的偶然机会,它有助于未来的读者。
回答问题1:
G是所谓的“可信设置”阶段。在可信设置中,秘密( lambda)用于创建验证和验证密钥(pk,vk);该秘密也称为“有毒废物”,必须销毁,否则所有者将能够创建假证据。
(pk,vk) = G(C,lambda)
你问题的第二部分:
表达式"a *a == b“是否等同于函数C
不完全正确;下面的代码是函数C;它接受一个见证(私有字段a)和x(字段b),并返回0或1表示成功或失败。
def main(private field a, field b) -> (field):
field h = if a * a == b then 1 else 0 fi
return h第一部分问题第三部分:
不确定验证密钥和验证密钥在此输出中的位置。
它们不是输出到终端,而是输出到两个单独的文件。您看到的命令输出是在可信设置阶段(G)将函数C转换为R1CS。
为了回答第二个问题,我建议阅读关于"佐克拉底RNG“的Zokrate示例,因为它包含一个假设场景,在这个场景中,Alice试图以零知识的方式向Bob证明。分离将有助于更好地理解什么是“证人”,并计算证人的步骤。
https://ethereum.stackexchange.com/questions/83833
复制相似问题