Solidity
為什麼 Zokerates 接受錯誤的證明?
我正在嘗試在 Zokrates 中測試一個非常簡單的範例。所以我使用了文件中的第一個範例,即:
// 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 ,我得到這條消息0:bool: r true正確。
但問題是,對於任何與正確證明相同的錯誤證明,我都會得到相同的響應。例如 a=3 和 b=19 我再次得到 0:bool: r true。
為什麼錯誤的證明會有真實的反應?
當您在 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
換句話說,在計算步驟中傳遞使程序結果為 a 的輸入
0
仍然會生成有效的證明,因為在這種情況下,您正在驗證程序導致 a0
。