我试着用Zokrate测试一个非常简单的例子。因此,我在文档中使用了第一个例子,即:
// This is an example from https://zokrates.github.io/gettingstarted.html
def main(private field a, field b) -> (field):
field result = if a * a == b then 1 else 0 fi
return result 在部署了验证器智能契约之后,我尝试测试不同的数字来验证这一点。例如,a=2和b=4以及我正确地得到了以下消息:bool:r true。
但问题是,对于任何错误的证明,我得到的反应和正确的证明是一样的。例如,a=3和b=19,我再次得到0:bool: r true。
为什么错误的证据有真实的反应?
发布于 2020-12-06 00:32:20
在ZoKrates中生成一个证明时,它总是有效的。您可能混淆了返回0/1的程序和有效/无效的证明。您可以通过修改它(更改proof点或inputs字段中的元素)来使证明无效。
让我举一个例子:
如果使用参数a = 2和b = 4计算程序的见证,则输出将是1。当您使用计算证人生成一个证据时,您会得到如下内容:
{
"proof": {
"a": [
"0x11ceea6848d6f4bb17fbe01e2f37a7f50aa5ea4da8aa6e4e364c3202dbb35deb",
"0x04991e94bc0ae3718a464aecd3c351cadb9c779d8acf9601ac87245b7a5cec76"
],
"b": [
[
"0x099a674ea974d7421b96a617635ac38939775ce47916487edaf5d384ddd401bf",
"0x18b754e9665ee861740aa1ccb4def4ed4eb945d0f26be1dced2656004ea59111"
],
[
"0x022b35cca41f73cee44819184e9c0054e1553f3a31310e53581d90e526c93073",
"0x22450d6b21830786c87e94131fbaaf9f6eaa93e6d526a827b42b706bee7654ff"
]
],
"c": [
"0x07405e6618cd88e94e44ceeade27f44d9dc362cf8f4de882b0d8905906d3daea",
"0x1c8e8f412dfab3243f232fa9da9b1705bf99b05952819160d69c64ede0794fab"
]
},
"inputs": [
"0x0000000000000000000000000000000000000000000000000000000000000004",
"0x0000000000000000000000000000000000000000000000000000000000000001"
]
}如果在证明中检查inputs字段,它包含程序的公共参数(在本例中是b的值,即4)和程序的输出(即1)。
如果您验证此证据,合同将返回{ "0": "bool: r true" }。如果你要改变证据中的某些东西的话。将inputs数组中的第一个元素更改为0x0000000000000000000000000000000000000000000000000000000000000003并再次运行验证,证明无效,因此验证器输出将是{ "0": "bool: r false" }。您还可以尝试更改a、b或c组中的值,这也会使证明无效。
换句话说,在计算步骤中传递将使程序生成0的输入仍然会生成有效的证据,因为在这种情况下,您正在验证程序是否导致了0。
https://ethereum.stackexchange.com/questions/90798
复制相似问题