此次研讨会中,Scroll 的 ZK 电路工程师 Mason Liang 介绍了如何在 halo2-ce 环境中构建和测试电路。通过提供的 Github 模板 (https://github.com/scroll-tech/zk-mooc-halo2),你将学习到如何在 halo2-ce 中构建零知识电路,halo2-ce 是以太坊基金会 PSE 团队的 zkevm 项目使用的证明系统的扩展。
此次研讨会是为了支持由伯克利 RDI 与 ZKP MOOC 合作主办的 ZKP / Web3 黑客马拉松。在 ZK 电路赛道的 Category 4 中,开发者需要在 halo2-ce 的 ZKP 框架中构建和优化 RIPEMD-160、Blake2f 或 SHA2-256 哈希函数,Scroll 将为获胜团队颁发 15,000 美元奖金。

研讨会主要分为三个部分,第一部分讲解了什么是 Halo2,第二部分通过斐波那契数列的例子讲解了电路实现,第三部分讲解了以太坊的预编译。
什么是 Halo2

Halo2 是一个基于 Plonk 的证明系统。电路中包含了见证 (Witnesses) 和约束 (Constraints) 的矩阵。

如下图所示,通常有 行, 列,单元格值为有限域中 的元素对每列 , 构建一个拉格朗日多项式 ,在第 行时,单元格 ,其中 是 次单位根。在 Halo2 中,有四种不同类型的列:advice 列,instance 列,fixed 列,selector 列。其中advice 列和 instance 列会随着证明变化,fixed 列和 selector 列是刻写进电路。Halo2 证明系统一大特点是支持自定义门 (Custom Gate),定义不同单元格之间的多项式约束关系,并使用 selector 列来控制自定义门的开关,并且在同一个自定义门中,不需要单元格保证连续。Halo2 的另一大特点是 Permuation,即等价性校验 (equality checks)。其是刻写在电路中,可以用来检查不同单元格的等价性,常用于关联电路中的不同小工具 (gadget)。Halo2 还支持查找表 (Lookup)。我们可以将查找表理解成变量之间存在一个关系,该关系可以表示成一个表。在 Scroll 的 zkEVM 中,查找表可以用来验证复杂的操作,例如 SHA3, EXP 等。这样的策略类似于在正常的程序中,用内存换 CPU 的方法来提高性能。总结一下,Halo2 同时支持自定义门和查找表,可以非常灵活的满足不同的电路需要,其模块化的设计可以替换后端方案。总结一下,在 Halo2 中实现电路分成如下 4 步1. 定义 Config 结构,说明电路中所使用的列2. 定义 Chip 结构,配置电路中使用的约束并提供 assignment 函数
第二部分讲解如何在 Halo2 实现斐波那契数列电路。我们需要在给定 的情况下,证明 第一个示例中,设置三列 advice 列,依次放置 ;selector 列中均设置为 1,要求每一行的等式约束成立;instance 列的前三行放置 1, 1, 55在创建自定义门中,我们实现了斐波那契数列的主要逻辑,要求在此基础上,通过一致性校验,保证行与行之间斐波那契数列的连续性。第二个示例中,我们仅设置一列 advice 列,在每一行依次放置斐波那契数列;selector 列仍然均设置为 1,要求每一行的等式约束成立;instance 列的前三行仍然放置 1, 1, 55
第三部分是本次黑客松相关的话题。0x02, 0x03, 0x09 预编译合约分别对应了 SHA2-256,RIPEMD-160 和 Blake2f 哈希函数。斐波那契数列的具体实现已经在 Haichen 的仓库中给出,Mason 同样给出了一个平方剩余的例子,欢迎大家尝试挑战。https://github.com/icemelon/halo2-examples/tree/master/src/fibonacci 研讨会 35:37 后是对代码实现的具体分析和演示,建议直接观看视频回放。添加 Scroller 社区管理员微信进入 Scroll 中文社区