首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >苏格拉底是如何一步一步地处理zk的?

苏格拉底是如何一步一步地处理zk的?
EN

Ethereum用户
提问于 2020-05-29 16:10:56
回答 1查看 556关注 0票数 5

我试图理解我的zokrates代码,以及它是如何按照这篇文章逐步处理zk的。

本文将zk分解为三个步骤.

  1. 密钥生成器G接受一个秘密参数lambda和一个程序C来生成pk (这是验证密钥)和vk (它是验证密钥):
代码语言:javascript
复制
(pk, vk) = G(C, lambda)

这里的C只是一个接受预映像的函数,如果哈希值与预映像相同,则返回true:

代码语言:javascript
复制
// w is the preimage, x is the hashed value of w
function C(x, w) {
  return ( sha256(w) == x );
}
  1. 验证器使用预图像s、已知的散列H和证明键pk,并通过生成算法P生成证明prf
代码语言:javascript
复制
prf = P(pk, H, s)
  1. 最后,验证器使用来自验证程序的证明运行验证函数:
代码语言:javascript
复制
V(vk, H, prf)

如果prf是正确的,则结果是正确的,这从本质上证明了验证者知道证人。

现在,我有一个zokrate代码,它有两个值"a“和"b”。

代码语言:javascript
复制
def main(private field a, field b) -> (field):
  field h = if a * a == b then 1 else 0 fi
  return h
  1. 我的第一个问题是,在前面的例子中,这两个值相当于什么?是他们中的一个吗?另外,表达式"a *a == b“是否等同于上面提到的函数C?我很难理解这些值和表达式是什么。

当我执行:

代码语言:javascript
复制
~/zokrates setup

我得到以下输出:

代码语言:javascript
复制
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函数是什么,如何适合于上面的示例?

  1. 我的第二个问题是,当我“创造一个证人”时,我到底在做什么?

当我执行以下操作时,应该创建一个证人:

代码语言:javascript
复制
~/zokrates compute-witness -a   ... 

我当时的印象是,“证人”是证明者已经拥有的先兆。“见证”难道不是证明者想要向验证者证明她知道这一点的东西吗?

当我执行命令时给我的输出如下:

代码语言:javascript
复制
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

这里到底发生了什么?

EN

回答 1

Ethereum用户

发布于 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表示成功或失败。

代码语言:javascript
复制
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证明。分离将有助于更好地理解什么是“证人”,并计算证人的步骤。

票数 1
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://ethereum.stackexchange.com/questions/83833

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档