ICICLE V3.5:带有 Lambda 函数的 Sumcheck

  • ingonyama
  • 发布于 2025-02-18 18:10
  • 阅读 11

ICICLE V3.5 版本引入了完全 CUDA 优化的非交互式 Sumcheck 协议实现,可用于多线性多项式的任意函数。

介绍一个完全 CUDA 优化的非交互式 Sumcheck 协议的实现,用于多线性多项式上的任意函数。

什么是 ICICLE

ICICLE 是我们的软件库,旨在增强密码学家实现高级算法和协议的能力——从零知识证明 (ZKPs) 开始——具有卓越的性能和易用性。它标志着朝着与硬件无关的密码学解决方案迈出的重要一步,确保在各种硬件平台上实现无缝兼容,且切换成本为零。

亮点:V3.5 中的新功能

V3.5 的主要亮点是新的 Sumcheck API。下面,我们将深入探讨如何使用此接口以及 Program 引擎,该引擎使用户能够为表示为 MLE(多线性扩展)任意函数的任何语句生成 sumcheck 证明。

我们还在这个版本中实现了工作量证明,以加速 FRI 类协议中的研磨过程 —— 感谢 Eylon Yogen 和 Giacomo Fenzi 要求此功能!此外,我们还添加了 Poseidon2 海绵函数并修复了以下错误:

  • get_device_count() 现在可以正确返回实际值,而不是 0 —— 感谢 Zircuit 报告此问题!
  • vecops Rust 封装器现在支持大于 1 的批量大小。
  • 通过禁用无别名优化,修复了 host-math inv2()。

有关更多信息,请参阅完整的发行说明

Program — Lambda 函数

Program 类使用户能够定义向量元素上的表达式,ICICLE 将其编译为后端的融合实现。 这种方法缓解了内存瓶颈,同时允许用户自定义诸如 Sumcheck 之类的算法。Program 专门支持element-wise lambda函数,目前包括两个预定义的程序:(A(X) * B(X) — C(X)) 和 eq(X) * (A(X) * B(X) — C(X)),未来更新中将会有更多。 目前,Rust API 仅支持这些预定义的函数,计划在下一个版本中提供完整的 API 覆盖。

Program 用例:Sumcheck API

Sumcheck 是一种基本协议,在 ZKP 中具有广泛的应用。 它最常见的用例是在 R1CS 系统(Spartan)中,它有效地验证了 eq(X) * (A(X) * B(X) — C(X)) 形式的约束,封装了 degree-two 的关系。一年前,我们开始了我们的旅程,发表了一篇研究论文,我们在其中开发了用于任意产品 sumcheck 的可并行算法。 随后,我们发布了一个基于 Arkworks 的 POC,使用户能够证明 MLE 任意函数的 sumcheck。

诸如 Jolt VM 之类的应用程序 - 将 Sumcheck 与这些产品的任意乘积和线性组合一起使用。值得注意的是,在 Jolt 的 LASSO 查找参数中,主要的 Sumcheck 函数取决于用户应用程序定义的查找表结构

另一个关键应用是 HyperPlonk,它允许用户为 high-degree 约束定义 自定义门,并利用 Sumcheck 来高效生成证明。

借助 Program 类,ICICLE 用户现在可以为任意函数生成 Sumcheck 证明,从而能够在各种密码协议中实现可扩展且灵活的证明生成。

注意:这是 Fiat-Shamir 首次在 ICICLE 中运行。因此,Sumcheck CUDA 和 Sumcheck CPU 目前都在接受审计。如果你正在考虑将 Sumcheck 纳入生产系统,我们很乐意分享我们的设计文档和审计报告(将来会公开发布)。

完整示例

在本节中,我们将演示 Sumcheck C++ API。

首先,我们定义多项式的参数,例如它们的大小和数量。 具体来说,我们使用函数 eq(X) * (A(X) * B(X) — C(X)),它涉及四个多项式。 在此示例中,这些多项式是随机生成的。

在此步骤中,我们计算多项式的总和:

在此示例中,计算是使用 CPU 后端执行的,但你也可以使用 GPU 后端来生成 Sumcheck 证明:

接下来,我们使用默认值创建 transcript 配置Transcript 对于 Fiat-Shamir 方案至关重要,因为 Prover 和 Verifier 都使用它来确保一致性。

接下来,我们设置 Sumcheck Prover,它使用函数 eq(X) * (A(X) * B(X) — C(X))。 由于此函数是常用的,因此它具有预定义的类型,从而可以更快地运行。

接下来,我们创建 Sumcheck 配置对象和一个空的 proof 对象,以存储 Prover 生成的证明。

在此阶段,将生成证明。 Sumcheck Prover 生成证明,然后将其存储在 sumcheck_proof 对象中。 此证明稍后将发送给 Verifier。

准备好证明后,我们继续进入 Verifier 侧。 在这里,创建一个新的 Sumcheck 对象以进行验证。 我们还定义一个布尔变量来存储验证结果。

这行代码执行验证过程。 执行后,如果证明有效,则 verification_pass 变量设置为 true,否则设置为 false。

重要的是要注意,Prover 和 Verifier 使用的 transcript 必须相同,以确保 Fiat-Shamir 方案在双方产生一致的结果。

我们的 Fiat-Shamir 实现紧跟 Merlin library 实现。 具体来说,我们将相关的元数据附加到 Prover 的消息中,并且挑战是使用强 Fiat-Shamir 协议生成的。

未来工作和即将发布的版本

在 V3.5 中,Sumcheck API 仅支持 large fields。由于 large fields 的采用率高于 small fields,因此我们优先考虑对它们的支持。small fields 将在以后的版本中添加。

如上所述,虽然 C++ Sumcheck API 功能齐全,但 Rust 实现目前仅支持预定义函数,并且 Golang 支持不可用。完整的 Rust 和 Go 支持将在即将发布的版本中提供。

ICICLE V3.6 将引入一个新的后端:Metal 支持! 这将使所有 ICICLE 代码都可以在 Apple Silicon 上高效运行。 如果你想试用下一个版本,请发送电子邮件至 hi@ingonyama.com

关注 Ingonyama

Twitter / X: https://twitter.com/Ingo_zk

YouTube: https://www.youtube.com/@ingo_zk

GitHub: https://github.com/ingonyama-zk

LinkedIn: https://www.linkedin.com/company/ingonyama

加入我们: https://www.ingonyama.com/career

Snark Chocolate: Spotify / Apple Podcasts

  • 原文链接: medium.com/@ingonyama/ic...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
ingonyama
ingonyama
从软件到硅重定义密码学硬件加速 // 从这里开始: https://dev.ingonyama.com