3 个稳定版本

4.0.1 2023 年 9 月 14 日
3.0.0 2022 年 8 月 17 日

#804密码学

每月 25 次下载

MIT 许可证

515KB
12K SLoC

zkInterface IR,一个零知识互操作性的工具箱

本用户指南面向零知识系统的实现者,详细介绍了如何使用 zkInterface SIEVE IR 工具箱(请参阅 规范)将它们的系统集成。在本指南中,我们首先生成示例 SIEVE IR 语句,然后消费它们。这些步骤可以作为在语句生成器或证明系统中实现新功能的起点。

SIEVE IR 规范 v2.1.0 相比,我们的实现略有不同

  • 不包括扩展字段和环。
  • 仅包括模运算模式用于转换门。

简介

zkInterface SIEVE IR 是一种中间表示形式,用于将前端称为语句生成器生成的零知识语句传达给后端称为证明系统。前端将高级语句转换为 IR。后端是 IR 的消费者:它是证明者和验证者之间的交互,当证明者希望向验证者证明一个陈述而不泄露证明的秘密组成部分时。有关此 zkInterface SIEVE IR 的详细信息,请参阅 规范。此 IR 专注于电路和门格式。可以使用 zkif-to-irir-to-zkif 命令在 IR 和 R1CS 之间进行转换。对于 R1CS 系统,在 github.com/QED-it/zkinterface 中存在类似的工具箱。

信息流

要传达一个陈述,传输三种类型的信息

  • 计算的描述,作为通过线连接的门电路,称为 关系

  • 证明系统证明方用于电路的输入值的列表,称为 私有输入

  • 用作电路输入的值列表,既由证明者又由验证者使用,称为PublicInputs

此信息的确切结构由该存储库中名为sieve_ir.fbs的FlatBuffers架构指定,并附带内联文档。参见相应的结构:关系、PublicInputs、PrivateInputs。

在此指南中,为方便和清晰起见,将结构存储在中介文件中。但是,也支持不存储的流式实现。

多字段电路

对于大多数ZK从业者来说,在证明开始时选择单个素性域,并在整个证明中使用。然而,对于某些应用,希望在单个更大的证明中使用多个素数。例如,可能需要一个大型且昂贵的素数来验证公钥签名,而对于大规模商业逻辑,则需要一个中等大小的素数。

为了适应这些应用,SIEVE IR允许在单个关系中存在多个域。有时,一个域的信息将需要用于另一个域。这通过一个转换门进行建模,该门在一个域中具有输入并在另一个域中具有输出。

插件

我们希望能够轻松扩展IR以添加一些新的(复杂的)功能。遗憾的是,基本语法的每次更新都迫使前端和后端更新它们的IR生成器和解析器。我们希望避免这种负担,同时提高语言的表达能力。为了解决这个问题,我们创建了plugin函数,它允许从IR调用后端特定功能。

第一步:熟悉现有工具

安装

git clone [email protected]:QED-it/zkinterface-ir.git
cd zkinterface-ir/rust/
cargo install --path .

zki_sieve help

This will print a list of available commands.

生产者:示例生成器

以下命令生成一个示例语句。它将其存储在工作目录中的文件中(可自定义,请参阅zki_sieve help)。

zki_sieve example

…
Writing ./000_public_inputs_0.sieve
Writing ./000_public_inputs_1.sieve
Writing ./001_private_inputs_0.sieve
Writing ./001_private_inputs_1.sieve
Writing ./001_private_inputs_2.sieve
Writing ./002_relation.sieve

消费者:验证器和评估器

validate命令验证语句是否按规范正确格式化(请参阅规范中的电路语义和有效性部分)。

evaluate命令充当代替证明系统的模拟器,并报告证明者是否能够说服验证者语句为真。也就是说,它执行电路描述的计算,并检查私有输入是否满足电路。

$ zki_sieve validate


Reading ./000_public_inputs_0.sieve
Reading ./000_public_inputs_1.sieve
Reading ./001_private_inputs_0.sieve
Reading ./001_private_inputs_1.sieve
Reading ./001_private_inputs_2.sieve
Reading ./002_relation.sieve

The statement is COMPLIANT with the specification!

以及评估器,

$ zki_sieve evaluate


Reading ./000_public_inputs_0.sieve
Reading ./000_public_inputs_1.sieve
Reading ./001_private_inputs_0.sieve
Reading ./001_private_inputs_1.sieve
Reading ./001_private_inputs_2.sieve
Reading ./002_relation.sieve

The statement is TRUE!

有一个命令zki_sieve valid-eval-metrics可以一次执行所有检查。

消费者:格式化为可读的YAML

以下命令读取语句并打印其文本表示。它使用YAML格式,类似于JSON但更易于阅读和编写。它与使用FlatBuffers格式化的信息一一对应。

$ zki_sieve to-yaml
# Or zki_sieve to-json

生产者:从R1CS转换

此存储库包含一个转换器,可以读取编码在R1CS配置文件中的语句,并生成在电路IR配置文件中的等效语句。

要从R1CS(zkInterface拥有的结构)转换,请遵循以下示例


let zki_header = zki_example_header_inputs(3, 4, 25);
let zki_r1cs = zki_example_constraints();
let zki_witness = zki_example_witness_inputs(3, 4);
// The `MemorySink` is used to tell that the resulting circuit will be stored in memory
// see FilesSink to store it in files.
let mut converter = FromR1CSConverter::new(MemorySink::default(), &zki_header);
converter.ingest_witness(&zki_witness)?;
converter.ingest_constraints(&zki_r1cs)?;

完整示例可在from_r1cs.rs中的test_r1cs_to_gates()中找到。

此功能也作为命令行工具提供。

$ zki_sieve zkif-to-ir [other options] 

第二步:实现新的集成

示例代码。

开始新集成的简单方法是通过探索库的源代码,该库本身也可从CLI命令中调用。入口点是文件src/bin/zki_sieve.rs中调用的函数main_…。其他示例代码可以在目录src/producers/src/consumers/中的test_…函数中找到。

基本API

所有要在系统间传输的信息都使用FlatBuffers模式正式指定的数据结构。可用的最简单的Rust API是这些结构的直接一对一映射。

生产者可以创建一个Relation结构,并按照规范在它的directives向量中填充多个GateFunction声明。

消费者可以遍历Relation.directives,并通过使用例如match结构来处理不同类型的指令。

实现应该期望产生或接收这些结构的流,以便在有限的内存中处理非常大的语句。

高级API

编写此API是为了允许后端轻松地对IR进行操作,而无需关心复杂性,也不必担心IR规范的未来升级,以及上一节中描述的内部结构。

它的核心是定义在consumers/evaluator.rs中的ZKBackend trait。任何想要处理IR的后端都必须实现它。例如,查看PlaintextBackend以了解此trait的简单(但不安全)实现。

此trait目前在本项目的许多地方使用,例如

  • 电路评估器以确保电路被验证
  • IR到R1CS转换器

此API是后端操作SIEVE IR的推荐方式,因为它独立于内部结构,并将降低新版本标准的开发开销。

低级序列化

不需要使用上述API来集成SIEVE IR。可以直接使用任何FlatBuffers的实现(由于编码简单,可以自定义实现,但这将是最后的手段)。有关现有工具的信息,请参阅google.github.io/flatbuffers/,特别是代码生成器flatc。这是非Rust语言编写系统的推荐方法。

在安装flatc版本1.12.0之后,可以使用命令make fbs生成文件sieve_ir_generated.rs

# Install flatc version 1.12.0
git clone https://github.com/google/flatbuffers.git.
cd flatbuffers
git checkout v1.12.0
cmake -G "Unix Makefiles"
make
sudo ln -s $(realpath flatc) /usr/local/bin/flatc

致谢

本材料基于由国防高级研究计划局(DARPA)资助的工作,合同编号HR001120C0085。本材料中表达的意见、发现、结论或建议是作者的观点,不一定反映国防高级研究计划局(DARPA)的观点。

依赖关系

~8–20MB
~241K SLoC