【问题标题】:Snarkjs- Proof still validates for incorrect witnessSnarkjs- 证明仍然验证不正确的证人
【发布时间】:2022-10-15 13:51:24
【问题描述】:

ZKsnarks 非常新。我正在尝试构建一个简单的应用程序来检查输入数字是否与某个预定义的数字匹配。 我已按照SnarkJs doc 中提到的所有步骤进行操作。

这是我的用例的电路:

pragma circom 2.0.0;

template IsZero() {
    signal input in;
    signal output out;

    signal inv;

    inv <-- in!=0 ? 1/in : 0;

    out <== -in*inv +1;
    in*out === 0;
}
template verifier() {
    signal input a;
    signal output b;
    signal c <== 9429723347216097781814234269377894115729242880998740711935743712243189718113;
    
    component isz = IsZero();

    a - c ==> isz.in;

    isz.out ==> b;
}

component main = verifier();

但是,当我尝试验证不正确的证人时,验证者合约仍会对其进行验证。

这就是我正在做的事情:

首先获取 calldata 参数

proof = await snarkjs.plonk.fullProve( { a: 5}, "circuit_js/circuit.wasm", "circuit_final.zkey");
await snarkjs.plonk.exportSolidityCallData(proof["proof"], proof["publicSignals"]);

然后尝试使用verifier.sol 合约进行验证。但是它仍然验证它。我做错了什么?

【问题讨论】:

    标签: zk-snark circom


    【解决方案1】:

    如果要检查a 是否与预定义的c 匹配,则需要对该特定检查有一个约束。所以将a - c 分配给输出是不够的。您需要具有以下约束:isz.out === 1。否则,b 只是一个输出。所以5 - 9429723347216097781814234269377894115729242880998740711935743712243189718113 是非零的,但是没有违反任何约束。事实上,你证明5 - 9429723347216097781814234269377894115729242880998740711935743712243189718113 不为零,电路输出确实是0(假),这是正确的。如果添加上述约束,则可以完全删除输出信号。

    【讨论】:

      猜你喜欢
      • 2016-07-24
      • 1970-01-01
      • 2013-02-26
      • 2017-04-20
      • 2017-01-19
      • 2014-01-08
      • 2019-04-13
      • 2021-07-13
      • 1970-01-01
      相关资源
      最近更新 更多