2022 年 7 月 23 日 9:30,隐私学院 PrivacyIN 首期 ZK 训练营第三课 ——《Applied ZK In Practice》准时开课。本期课程由香港科技大学在读博士韩思远讲授,以 ZK 电路开发和 zkEVM 设计为主题,围绕零知识证明应用电路设计及 zkEVM 构建思路展开,帮助学员学懂 ZKP 电路设计。此次培训延续小班授课,数十名国内外密码学及相关领域的专家学者参加了本次 ZK 技术培训。
背景知识
基于零知识证明(ZKP)的应用实现,主要是通过将一般的计算问题转化为电路问题,然后构建基于零知识证明系统的电路约束或其他保证计算特性的约束,来实现可验证计算和零知识性。在确定的零知识证明系统(协议)上,ZKP 应用的构建核心内容则是业务电路的设计和开发,因此了解应用电路设计思路、保证安全性和高效性都是非常重要的议题。
课程主要内容
简单介绍了基于零知识证明的应用系统设计所涉及的背景知识后,韩思远老师以开发者的视角,为大家介绍了 ZKP 应用涉及的难题。他表示:完整理解零知识证明(ZKP) 应用开发是非常复杂的,需要理解多种经典 ZKP 协议设计原理、深度的密码学和数学知识、难以选择的 ZKP 框架、晦涩难懂的术语和概念等,ZKP 应用系统设计知识曲线较高,初学者是很难入门的。
ZKP 系统
从程序设计视角,ZKP 系统一般可以划分为前端 frontend 和后端 backend 两个部分。
ZKP 系统的 Frontend 部分的主要使用低级别语言来表示高级别语言,例如可以将一个一般地计算问题使用较低级别的电路语言表示,如 R1CS 电路约束构建计算等(比如 circom 使用 R1CS 描述其前端电路)。
ZKP 系统的 Backend 部分即密码学证明系统,主要将 frontend 构建低级别的语言描述的电路,转换为生成证明和验证正确性等,比如常用的 backend 系统协议有 Groth16 和 Plonk 等。
韩思远博士表示,基于 frontend 和 backend 开发分离的思路,开发一个基于 ZKP 的应用系统,在密码学专家选定合适 ZKP 证明系统作为 backend 后,开发人员的工作主要考虑的是如何使用 frontend 提供的低级语言来描述和实现应用业务逻辑,而无需关注 ZKP 证明系统后端。
R1CS 的创建
zkSNARKs 系统比较常用的是 R1CS(rank1-constraint-system),R1CS 定义结构形如:
Ai、Bi、Ci 分别为乘法电路门的左操作符(线)的系数向量、右操作符(