漁船監管的零知識證明zk snark實戰

2021-10-05 23:18:53 字數 2083 閱讀 2075

零知識證明可以在不洩露具體資訊的情況下向其他人證明自己掌握該資訊,這聽起來非常適合去中心化應用。在這個教程中,我們將利用zksnark來實現乙個具體的nodejs零知識證明應用:漁船無需透露自己的具體位置,就可以向監管機構證明自己處於劃定的合法捕撈區內 —— 我們的主要**是snarkjs和circom。

設計零知識證明應用方案的第一步是要將具體的問題轉換為乙個電路。我們要證明漁船處於合法捕撈區內,這個問題中存在以下變數:

容易得到如下的輸入輸出對映:

+--------------+ 

漁船經度/維度 ->| |

| |

捕撈區經度最大/最小值 ->| 電路 |-> 在/不在合法捕撈區

| |

捕撈區緯度最大/最小值 ->| |

+--------------+

據此,我們可以得到如下的circom電路定義:

其中:

由於我們要隱藏漁船的具體位置,因此在上面的circom電路中,你可以看到fishinglocation被定義為private。

如果還沒有安裝circom的話,使用如下命令全域性安裝circom:

npm install -g circom
注意:推薦使用node 12,因為內建了原生的大數計算,效率提公升10倍!

使用如下命令編譯電路檔案inrange.circom,輸出結果命名為inrange.json:

circom inrange.circom -o inrange.json
在使用zksnark之前,需要乙個可信設定,而且該可信設定依賴於具體的電路,例如我們編譯得到的inrange.json。

使用snarkjs來建立這個可信設定,同樣,如果需要安裝的話,使用如下命令:

npm install -g snarkjs
現在我們利用漁業監控電路進行可信設定:

snarkjs setup -c inrange.json
上面的命令將會在當前目錄建立兩個檔案:proving_key.json和verification_key.json。其中proving_key.json用於證明你的輸入是有效的(滿足電路約束),而verification_key.json用來驗證別人提供的證據。

在我們建立提供給其他人的證據之前,需要先計算出電路中所有訊號(包括輸入訊號和中間訊號)

的見證。為此我們需要建立乙個輸入檔案input.json,其中包含所有輸入(公開輸入和私有輸入)的值,然後利用這個輸入檔案計算得到見證檔案witness.json,這兩個檔案都不會公開。

下面是我們的漁業監控電路的輸入檔案示例:

使用sparkjs來計算得出見證檔案witness.json:

snarkjs calculatewitness -c inrange.json
有了witness.json,我們就可以建立提供給其他人的證據了:

snarkjs proof
上面的命令將在當前目錄生成proof.json和公開檔案public.json,publc.json實際上就是witness.json檔案內容的乙個子集,其中僅包含電路中可公開訊號的值。

現在目錄裡的檔案如下圖所示:

現在你(漁船船長)可以把verification_key.json、proof.json和public.json提供給監管機構了,監管方使用如下命令即可驗證你的船的確在合法捕撈區內,但卻不知道你的具體位置:

snarkjs verify
goooooooooooooooooooooooooooooooooooooooood!

零知識證明

零知識證明的幾個例子 原創 1 a要向b證明自己擁有某個房間的鑰匙,假設該房間只能用鑰匙開啟鎖,而其他任何方法都打不開。這時有2個方法 一 a把鑰匙出示給b,b用這把鑰匙開啟該房間的鎖,從而證明a擁有該房間的正確的鑰匙。二 b確定該房間內有某一物體,a用自己擁有的鑰匙開啟該房間的門,然後把物體拿出來...

零知識證明

定義 能夠在不向驗證者提供有效資訊的情況下,使得驗證者相信某種論斷的正確性。淺顯易懂的說明 zcash 零知識證明的三條性質 1.完備性 驗證方和證明方都是誠實的,並遵循證明的每乙個步驟 2.合理性 沒人能假冒證明方,阿里巴巴和強盜的故事,存在一種可能的情況 阿里巴巴不知道咒語,但和別人串通好,強盜...

零知識證明

零知識證明 zero knowledge proofs,簡寫為 zkps,最初由 s.goldwasser s.micali 及 c.rackoff 在 1985 年的 互動證明系統的知識複雜性 提出,指的是證明者能夠在不向驗證者提供任何有用資訊的情況下,使驗證者相信某個論斷是正確的。允許證明者 p...