1.1.2 |
|
---|
#48 在 #gadget 中
150KB
3K SLoC
zkInterface,一个零知识互操作性的标准工具
zkInterface 是一个用于不同 ZK DSL、gadget 库和证明系统之间零知识互操作性的标准工具。zkInterface 项目起源于 ZKProof 社区。
查看 实时演示。
集成说明
介绍
zkInterface 是一个规范和相关工具,用于实现通用零知识证明系统实现之间的互操作性。它旨在促进零知识证明实现之间的互操作性,在表示待证明陈述的低约束系统层面。此类约束系统由 前端(例如,通过从高级规范编译)生成,并由加密 后端 消费,后端生成和验证证明。目标是实现前端和后端的解耦,允许应用程序编写者选择最适合其功能和开发需求的前端,并将其与最能满足其性能和安全需求的后端相结合。
该规范指定了通信约束系统的协议、通信变量分配(用于生成证明)以及从较小的构建块(gadget)构建约束系统的协议。这些是用语言无关的调用约定和格式指定的,以实现不同作者、框架和语言之间的互操作性。
一个简单的特殊情况是整个约束系统和其变量分配的单体表示。然而,需要更丰富和更细腻的互操作性形式
- 精确指定的陈述语义、变量表示和变量映射
- 证人简化,从高级证人到变量分配
- 设备互操作性,允许约束系统组件以可重用和互操作的形式打包
- 过程互操作性,允许执行复杂代码以便利上述操作
当前状态
实现
前端
电路类型 | 导出电路 | 导入电路 | |
---|---|---|---|
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 |
Rust辅助与C++交互 |
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
目录中,运行单元测试
cargo测试
以下命令将在rust/src/examples.rs
中生成并打印包含消息Circuit、R1CSConstraints和Witness的文件,用于玩具电路
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++/ Foreign Function Interface中的设备
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
限制
本次修订重点关注以R1CS/QAP风格的约束系统表示形式表示的一般语句(即NP关系)的非交互式证明系统(NIZKs)。计划扩展到其他形式的约束系统。
相关的代码是实验性的。
有关局限性和范围的更多信息,请参阅规范文档。
依赖项
约5-16MB
约167K SLoC