#interop #zero-knowledge-proofs #systems #gadget #proof #applications #zk-interface

已撤回 libsnark

通过zkInterface封装libsnark / gadgetlib

1.1.2 2020年6月30日

#48#gadget

MIT 许可证

150KB
3K SLoC

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

zkInterface 是一个用于不同 ZK DSL、gadget 库和证明系统之间零知识互操作性的标准工具。zkInterface 项目起源于 ZKProof 社区。

查看 实时演示

查看 规范序列化格式

查看 Rust 实现:docs

集成说明

介绍

alt text

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