原文:https://blog.axiom.xyz/halo2-repl/
作者:Roshan, Yi Sun
译者:Kurt Pan

https://www.halo2repl.dev/
今天我们发布了 halo2-repl,这是一个基于浏览器的用 Javascript 写 halo2 的REPL。开发者可以只用标准 Javascript 写 ZK 电路,而无需学习 Rust 等新语言、安装证明库或管理依赖。用 halo2-repl 写的 ZK 电路可以直接在浏览器中编译和验证,意思是你可以立即开始使用 ZK了。我们还在当前版本中包含了一个小电路谜题作为默认电路 - 试着写一个电路来解决该谜题,并将你的解决方案通过 @axiom_xyz 发送给我们!
在底层,halo2-repl 使用 WebAssembly 绑定来允许你的 Javascript 代码调用我们用 Rust 编写的 halo2-lib 库中的 ZK 电路原语。这使开发者能够用熟悉的 Javascript 格式使用 Rust 的强大功能。我们已将这些绑定打包到 halo2-browser 中,该工具套件可以使用 halo2 更轻松地在浏览器内生成证明,我们已将其与该发布一起开源。我们正在对这些库进行同侪审议,希望与社区合作,使在浏览器中部署 ZK 电路变得更加容易。
此发布得益于之前的大量工作。感谢 Electric Coin Co. 的出色开发者以及以太坊基金会的PSE团队构建了 halo2。对于 REPL 接口,我们明显是从 zkREPL 中汲取了灵感,并且从 Nalin Bhardwaj 的指南中学习了如何将 halo2 编译为 WASM。
要使用 halo2-repl 写 ZK 电路,可以使用标准 Javascript 语法,以及与 halo2-lib 的绑定(文档如下)。
写完电路后,可以执行以下操作:
我们很乐意去合并任何增强 halo2-repl 体验的工具或功能。我们能想到的一些包括:导出一个浏览器内的证明者或链上的验证者,允许验证外部证明,以及添加额外的电路绑定。欢迎在 halo2-browser 里提issue!
halo2-browser 库里包括 3 个模块:halo2-wasm、halo2-lib-js 和 halo2-repl。前两个是用作构建 halo2-repl 的工具包,我们也希望它们有助于构建在浏览器中生成 halo2 证明的其他应用程序。
halo2-wasm 使用 wasm-bindgen 为所有常见电路操作(如证明、密钥生成和验证)创建 JavaScript 绑定。 halo2-wasm 处理了 Rust 和 JavaScript 之间传递的值的所有序列化和解析工作,并且可以轻松扩展以满足你自己的电路需求。它还包括 halo2-lib-wasm 类,包装了所有常见的 halo2-lib 函数,例如 add 和 mul ,以便可以直接用 JavaScript 编写电路,无需处理 halo2-lib 和 Rust。 halo2-wasm 还包括一个 TypeScript 脚手架 CircuitScaffold ,以方便使用 JavaScript 绑定,而不必担心设置和使用 WASM 二进制文件。
halo2-lib-js 是 halo2-lib 的强类型 eDSL(嵌入式领域特定语言),构建于 TypeScript 中的 halo2-wasm 之上。它使用 TypeScript 定义包装所有 halo2-lib-wasm 函数,并引入 CircuitValue 类来清楚地划分电路内值和 JS 值。电路是 TypeScript 函数,将 halo2-lib/halo2-lib-wasm 里的对象作为输入,并通过调用 halo2-lib-wasm 函数来赋值见证。一旦电路函数运行,就可以在halo2-wasm 中运行密钥生成、证明或任意其他函数。
halo2-repl 包括我们 REPL 的前端 Next.js 应用程序,使用 halo2-lib-js 和 halo2-wasm 构建。
我们对 halo2-repl 中 halo2-ecc 的 ECDSA 签名验证电路运行了一些简单的基准测试。在特定设置下,我们发现此基准测试任务的浏览器内证明时间低于 10 秒。这些基准测试是在配备 24GB RAM 的 M2 MacBook Air 上通过 Safari 进行的。

我们很高兴你能尝试使用 halo2-repl,并且很高兴看到你用它构建了什么。底层代码是开源的(MIT 许可证),在 halo2-browser 里 ,欢迎贡献!最后,在接下来的几周内,我们将会分享 halo2-repl 如何在 Axiom 的未来版本中发挥作用。