Solidity

為什麼 Zokerates 接受錯誤的證明?

  • March 25, 2022

我正在嘗試在 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證明中的欄位,它包含程序的公共參數(在本例中為 的值b4和程序的輸出(為1)。

如果您驗證此證明,則契約將返回{ "0": "bool: r true" }。如果您要更改證明中的某些內容,例如。inputs將數組中的第一個元素更改為0x0000000000000000000000000000000000000000000000000000000000000003並再次執行驗證,證明將無效,因此驗證器輸出將為{ "0": "bool: r false" }. 您也可以嘗試更改或組中的值a,這也會使證明無效。b``c

換句話說,在計算步驟中傳遞使程序結果為 a 的輸入0仍然會生成有效的證明,因為在這種情況下,您正在驗證程序導致 a 0

引用自:https://ethereum.stackexchange.com/questions/90798