2个稳定版本
1.1.3 | 2020年7月26日 |
---|---|
1.1.2 | 2020年6月30日 |
#16 in #gadget
155KB
3.5K SLoC
zkInterface,零知识互操作性的标准工具
zkInterface是不同ZK DSLs、gadget库和证明系统之间零知识互操作性的标准工具。zkInterface项目诞生于ZKProof社区。
查看实时演示。
集成说明
简介
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