0

一般来说,我是 ZoKrates 和 ZK 的新手。我对证人的工作方式感到困惑。如果我计算出无效的证人,验证者仍然会验证证明是正确的。例如(基于 ZoKrates“开始”)。

鉴于此程序:

def main(private field a, field b) -> bool:
  return a * a == b

然后运行以下命令:

zokrates compile -i root.zok
zokrates setup
zokrates compute-witness -a 337 113569
zokrates generate-proof

当我跑

zokrates verify

它返回通过。

但是,如果我提供一个不好的价值,compute-witness它仍然会通过。例如:

zokrates compute-witness -a 1 113569
zokrates generate-proof
zokrates verify // PASSES

我显然在这里误解了一些东西,但是在花了几个小时在线阅读不同的内容之后,我仍然不确定是什么。

4

1 回答 1

0

我已经意识到我缺少的理解,这很简单。在这种情况下,证明不是验证a * a等于,b而是证明我已经运行了计算。

例如,下面会生成一个证明,证明我已经使用 and 运行了这个程序,a = 337并且b = 113569返回值为true.

zokrates compute-witness -a 337 113569
zokrates generate-proof

如果我更改输入以使计算返回false;例如a = 1b = 113569。下面生成了一个证明,证明我已经使用这些值运行了这个程序,a并且b返回是false

zokrates compute-witness -a 1 113569
zokrates generate-proof

感谢ZoKrates Gitter上的 Darko帮助我理解这一点。

于 2021-05-28T21:39:44.600 回答