#zero-knowledge-proofs #interop #gadget #back-end #proof #front-end #libsnark

sys zkinterface-libsnark

通过zkInterface对libsnark/gadgetlib的包装

2个稳定版本

1.1.3 2020年7月26日
1.1.2 2020年6月30日

#16 in #gadget

MIT 许可证

155KB
3.5K SLoC

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

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

查看实时演示

查看规范序列化格式

查看Rust实现:docs

集成说明

简介

alt text

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

该规范指定了约束系统通信协议、变量分配(生成证明)通信协议以及从更小的构建块(gadgets)构造约束系统的协议。这些使用语言无关的调用约定和格式进行指定,以实现不同作者、框架和语言之间的互操作性。

一个简单的特殊情况是整个约束系统和其变量分配的单一表示。然而,需要更丰富和更细致的互操作性形式。

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

当前状态

实现

前端

电路类型 导出电路 导入电路
ZoKrates R1CS
Libsnark R1CS
Mir r1cs R1CS
PySNARK R1CS
Bellman R1CS

后端

证明系统
Bellman Groth16
Dalek Bulletproofs
Libsnark BCTV14a

另请参阅用于构建现场演示WebAssembly模块

请参阅ecosystem/文件夹中的安装和连接多个系统的指令集合。

仓库内容

zkInterface.pdf 接口规范
zkinterface.fbs 使用FlatBuffers定义的设备接口
examples/ 二进制和JSON中的示例电路
rust/ Cargo包 zkinterface
rust/src/zkinterface_generated.rs 生成的Rust代码
rust/src/reading.rs 读取消息的Rust辅助函数
rust/src/writing.rs 编写消息的Rust辅助函数
rust/src/cpp_gadget.rs 与C++交互的Rust辅助函数
rust/src/examples.rs 简单测试电路的示例消息
rust/src/gadget_call.rs Rust中的示例设备调用
cpp/zkinterface_generated.h 生成的C++代码
cpp/gadget_example.cpp C++中的示例设备
js/ NPM包 zkinterface
js/zkinterface_generated.js 生成的JavaScript代码
build.rs 从zkinterface.fbs生成Rust和C++代码,并编译C++示例
cpp/libsnark_integration.hpp Libsnark支持
cpp/libsnark_example.cpp Libsnark设备示例

测试

rust目录中,运行单元测试

cargotest

以下命令将生成并打印一个包含消息Circuit、R1CSConstraints和Witness的文件,这些消息在rust/src/examples.rs中的玩具电路中

cargo run example  > example.zkif
cargo run explain  < example.zkif

生成的代码

包括生成的C++和Rust代码。

对于其他语言,安装FlatBuffers代码生成器(flatc)。一种方法是使用以下方式编译它

git clone https://github.com/google/flatbuffers.git
cd flatbuffers
cmake -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=Release
make

然后运行:flatc --LANGUAGE zkinterface.fbs

如何贡献

  • 在前端实现一个功能,将电路或设备导出到zkInterface格式。
  • 在证明系统中,支持从zkInterface缓冲区或文件中加载电路。

请参阅上述规范中的实现指南部分以获取更多详细信息,并查看下面的现有实现。

规范

zkInterface规范文档提供了上述内容的更多背景信息,并定义了前端和后端之间的通信协议和调用约定

  • 交换的消息的逻辑内容。
  • 消息的序列化格式(基于FlatBuffers,可以用于内存中、保存或流式传输)。
  • 从设备组合构建约束系统的协议。
  • 实现的技术建议。

集成示例

Dalek Bulletproofs

安装

git clone https://github.com/QED-it/bulletproofs.git
cd bulletproofs
cargo install --features yoloproofs --path .

证明

zkif example - | zkif_bulletproofs prove

验证

zkif example - | zkif_bulletproofs verify

Bellman

安装

git clone https://github.com/QED-it/zkinterface-bellman.git
cd zkinterface-bellman
cargo install --path .

验证/打印

zkif example - | zkif_bellman print

证明

zkif example - | zkif_bellman prove

验证

(not implemented)

libSNARK

安装

export ZKINTERFACE_LIBSNARK_PATH=$PWD/dist
PATH=$PATH:$ZKINTERFACE_LIBSNARK_PATH/bin

git clone https://github.com/QED-it/zkinterface.git
cd zkinterface/cpp

./deps.sh

cmake -DCMAKE_INSTALL_PREFIX=$ZKINTERFACE_LIBSNARK_PATH . && make install

设置

zkif example - | zkif_snark setup

证明

zkif example - | zkif_snark prove

验证

zkif example - | zkif_snark verify

Rust中的设备

[dependencies]
    zkinterface = { version = "1.1.3" }
    zkinterface-libsnark = { version = "1.1.3" }

请参阅libsnark-rust/src/test.rs中的示例

C/C++中的设备

CFLAGS="-I $ZKINTERFACE_LIBSNARK_PATH/include -L $ZKINTERFACE_LIBSNARK_PATH/lib -l ff -l gmp -l zkif_gadgetlib"

请参阅gadgetlib.h中的API

请参阅Rust中的FFI调用libsnark-rust/src/gadgetlib.rs

限制

本次修订版本主要关注非交互式证明系统(NIZKs)在R1CS/QAP风格约束系统表示中的一般陈述(即,NP关系)。计划扩展到其他形式的约束系统。

相关代码为实验性质。

有关局限性和范围更多信息,请参阅规范文档

依赖项

~5–17MB
~182K SLoC