Ethereum 佐克拉特无效证人出示有效证据

Ethereum 佐克拉特无效证人出示有效证据,ethereum,solidity,evm,Ethereum,Solidity,Evm,我对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 11

我对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

很明显,我不理解这里的内容,但在花了几个小时在网上阅读不同的内容后,我仍然不确定是什么。

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

例如,下面生成了一个证明,证明我已使用
a=337
b=113569
运行此程序,返回值为
true

zokrates compute-witness -a 337 113569
zokrates generate-proof
如果我更改输入以使计算返回false;例如
a=1
b=113569
。 下面生成了一个证据,证明我用
a
b
的值运行了这个程序,返回值是
false

zokrates compute-witness -a 1 113569
zokrates generate-proof
感谢Darko on帮助我理解这一点