18 个稳定版本

1.3.4 2021 年 3 月 8 日
1.3.3 2021 年 2 月 22 日
1.3.2 2020 年 10 月 21 日
1.1.4 2020 年 8 月 19 日
1.0.2 2019 年 5 月 10 日

1998密码学

Download history 28/week @ 2024-03-20 16/week @ 2024-03-27 26/week @ 2024-04-03 15/week @ 2024-04-10 6/week @ 2024-04-17 18/week @ 2024-04-24 14/week @ 2024-05-01 12/week @ 2024-05-08 9/week @ 2024-05-15 4/week @ 2024-05-22 10/week @ 2024-05-29 5/week @ 2024-06-05 6/week @ 2024-06-12 3/week @ 2024-06-19 15/week @ 2024-06-26 103/week @ 2024-07-03

每月 127 次下载
用于 6 crates

MIT 许可证

140KB
3K SLoC

zkInterface,一个零知识互操作性的标准工具

zkInterface 是不同 ZK DSLs、gadget 库和证明系统之间零知识互操作性的标准工具。zkInterface 项目诞生于 ZKProof 社区。

简介

alt text

zkInterface 是用于实现通用零知识证明系统实现之间互操作性的规范和相关工具。它旨在促进零知识证明实现之间的互操作性,在表示待证明陈述的低约束系统级别。此类约束系统由 前端(例如,由高级规范编译)生成,并由生成和验证证明的密码学 后端 消费。目标是解耦前端和后端,允许应用程序编写者选择最方便其功能和开发需求的前端,并将其与性能和安全性需求最匹配的后端结合使用。

该规范指定了通信约束系统的协议、通信变量赋值(用于生成证明)以及从较小的构建块(gadget)构造约束系统的协议。这些使用语言无关的调用约定和格式进行指定,以实现不同作者、框架和语言之间的互操作性。一个简单的特殊情况是整个约束系统和其变量赋值的单一表示。然而,需要更多丰富和细致的互操作性形式。

  • 精确指定的陈述语义、变量表示和变量映射
  • 从高级证据到变量赋值的证据简化
  • gadget 互操作性,允许将约束系统的组件打包成可重用和可互操作的格式
  • 过程互操作性,允许执行复杂代码以促进上述操作

示例

zkInterface 不强制执行序列化方法,它应由用户提供 - 在此示例中为 serialize_small()

创建一个 CircuitHeader

use zkinterface::producers::examples::{serialize_small, NEG_ONE};
use zkinterface::KeyValue;

let (x,y,zz) = (3,4,25);

// variables ids 1,2 and 3 are used as instances variables
let header = zkinterface::CircuitHeader {
        instance_variables: zkinterface::Variables {
           variable_ids: vec![1, 2, 3],  // x, y, zz
           values: Some(serialize_small(&[x, y, zz])),
       },
       free_variable_id: 6,
       field_maximum: Some(serialize_small(&[NEG_ONE])),
       configuration: Some(vec![
            KeyValue::from(("Name", "example")),
        ]),
   };

创建电路头

let (x,y) = (3,4);

use zkinterface::producers::examples::serialize_small;

//variables ids 4 and 5 are used as witness variables
let witness = zkinterface::Witness {
        assigned_variables: zkinterface::Variables {
            variable_ids: vec![4, 5], // xx, yy
            values: Some(serialize_small(&[
                x * x, // var_4 = xx = x^2
                y * y, // var_5 = yy = y^2
            ])),
       }
   };

从 R1CS 矢量创建 ConstraintSystem

let constraints_vec: &[((Vec<u64>, Vec<u8>), (Vec<u64>, Vec<u8>), (Vec<u64>, Vec<u8>))] = &[
    // (A ids values)  *  (B ids values)  =  (C ids values)
    ((vec![1], vec![1]), (vec![1], vec![1]), (vec![4], vec![1])), // x * x = xx
    ((vec![2], vec![1]), (vec![2], vec![1]), (vec![5], vec![1])), // y * y = yy
    ((vec![0], vec![1]), (vec![4, 5], vec![1, 1]), (vec![3], vec![1])), // 1 * (xx + yy) = z
];

let constraints = zkinterface::ConstraintSystem::from(constraints_vec);

陈述构建器

zkInterface 提供了一个 StatementBuilder,以帮助在 zkInterface 格式下构建和存储陈述。

 use zkinterface::{StatementBuilder, Sink, WorkspaceSink, CircuitHeader, ConstraintSystem, Witness};

 // Create a workspace where to write zkInterafce files.
 let sink = WorkspaceSink::new("local/test_builder").unwrap();
 let mut builder = StatementBuilder::new(sink);

 // Use variables, construct a constraint system, and a witness.
 let var_ids = builder.allocate_vars(3);
 let cs = ConstraintSystem::default();
 let witness = Witness::default();

 builder.finish_header().unwrap();
 builder.push_witness(witness).unwrap();
 builder.push_constraints(cs).unwrap();

模拟器

zkInterface提供了一个模拟器来检查整个约束系统,并输出是否存在违反的约束。

 # use zkinterface::producers::examples::{example_circuit_header, example_witness, example_constraints};
 use zkinterface::consumers::simulator::Simulator;

 pub fn simulate() -> zkinterface::Result<()> {
   let header = example_circuit_header();
   let witness = example_witness();
   let cs = example_constraints();

   let mut simulator = Simulator::default();
   simulator.ingest_header(&header)?;
   simulator.ingest_witness(&witness)?;
   simulator.ingest_constraint_system(&cs)?;
   Ok(())
 }

验证器

zkInterface提供了一个验证器来检查提供的参数的语法和语义,并在存在违反时返回一个列表。

 # use zkinterface::producers::examples::{example_circuit_header, example_witness, example_constraints};
 use zkinterface::consumers::validator::Validator;

 let header = example_circuit_header();
 let witness = example_witness();
 let constraints = example_constraints();

 let mut validator = Validator::new_as_prover();
 validator.ingest_header(&header);
 validator.ingest_witness(&witness);
 validator.ingest_constraint_system(&constraints);

 let violations = validator.get_violations();
 if violations.len() > 0 {
       eprintln!("Violations:\n- {}\n", violations.join("\n- "));
 }

除了库之外,还提供了一个命令行工具。命令行工具可以执行以下命令

  • zkif example 创建示例语句。
  • zkif cat 将.zkif文件写入标准输出。
  • zkif to-json 转换为单行JSON。
  • zkif to-yaml 转换为YAML。
  • zkif explain 以人类可读的形式打印内容。
  • zkif validate 验证语句的格式和语义,如验证器所见。
  • zkif simulate 通过验证语句为真来模拟证明系统。
  • zkif stats 计算电路的统计信息。
  • zkif clean 通过删除其中的所有*.zkif文件来清理工作区。

依赖项

~4–16MB
~163K SLoC