摘要:描述了J-R1CS的版本,橢圓曲線的屬性,電路的公開/隱私輸入的個數以及R1CS的約束個數。目前有一些零知識證明證明的框架,框架中的電路都由R1CS描述電路。

玩過zkSNARK的小夥伴都知道,R1CS是目前描述電路的一種語言。目前實現zkSNARK電路的框架有libsnark(C++),bellman (Rust),ZoKrates(DSL),Circom(js)等等。有的時候,需要將一個框架中生成的電路,導入其他框架。網絡上研究了一下,發現兩個有意思的項目。

01 J-R1CS

J-R1CS提出了一個 導出RICS的格式標準 。用一個json文件表述一個電路需要的所有信息。

一個電路的R1CS主要由三部分組成:

1)電路的屬性描述

{
"r1cs":{
      "version":"1.0",
      "field_characteristic":"133581199851807797997178235848527563401",
      "extension_degree":1,
      "instances":3,
      "witnesses":5,
      "constraints":2000,
      "optimized":true
} }

描述了J-R1CS的版本,橢圓曲線的屬性,電路的公開/隱私輸入的個數以及R1CS的約束個數。

2)輸入描述

{
  "inputs":["0","1","0","1","3","8", ...],
  "witnesses": ["1","1",,"243202698575991946913848952725080
  8343172040488935114927077578242952867610624", ...]
}

輸入分成兩種,一種是公開(public input)輸入,一種是隱私(private input)輸入。inputs代表公開輸入,witnesses代表隱私輸入。

3)約束描述

{
 {
  "A": [[0,"2"],[-1,"6"],[5,"4"],....],
  "B": [[0,"5"],[-6,"3"],[3,"4"],....],
  "C": [[0,"3"],[-1,"2"],[-2,"7"],[3,"4"],[4,"1"]...]
  }
}

一個約束由A/B/C三個數組組成。每個數組中的元素是一個二元組:輸入的index以及輸入的係數。輸入的index是負數的話,代表的是公開輸入;輸入的index是整數的話,代表的是隱私輸入。

02 zkInterface

zkInterface更進一步,提供了多種框架下的電路的轉換。zkInterface作爲“中間”接口,可以將”Frontend”的電路格式, 導出到”Backend”的證明框架中

目前,zkInterface已經實現瞭如下的導入導出能力:

總結:

目前有一些零知識證明證明的框架,框架中的電路都由R1CS描述電路。J-R1CS提出了一種R1CS電路導出的格式。zkInterface更進一步,提供了多種框架下的電路的轉換。

本文作者爲深入淺出區塊鏈共建者:Star Li,他的公衆號 星想法 有很多原創高質量文章,歡迎大家掃碼關注。

深入淺出區塊鏈 - 打造高質量區塊鏈技術博客,學區塊鏈都來這裏,關注 知乎 、微博 掌握區塊鏈技術動態。

相關文章