原文:https://www.zksecurity.xyz/blog/posts/circle-starks-1/
译者:Kurt Pan
在零知识证明系统中,我们(几乎)总是在有限域上进行操作,并且由于证明者通常必须进行大量的域操作来生成证明,因此我们自然希望我们的域操作要尽可能快。如果使用椭圆曲线密码学,我们被限制在“密码学大小”的域,比如大约 256 位可实现 128 位安全性。然而,类 STARK 的技术(里德-所罗门IOP)在安全参数和域大小之间并没有这种直接依赖性。因此,我们可以使用小得多的域。
通过这样做, 我们就可以使用具有非常高效算术的域, 例如小二进制域或小素域(想想 32 位或 64 位)。此类域中最快的是小梅森素域,其具有非常简单的模约简。
不幸的是, 直到最近, 这些域的结构使其并不适合 STARK, 因为它们无法有效地兼容 FRI/STIR。现在情况已经改变了。这是一个四部分系列的开始, 解释了 Haböck、Levit 和 Papini 最近被称为Circle STARK的构造,该结构使得 STARK 可以更高效地使用这些特定的域。本系列结构如下:
https://eprint.iacr.org/2024/278
这篇文章的目的不是解释 FRI 的一般工作原理,关于此我推荐下面两篇博文,尽管我们会在本系列的后续部分中介绍 Circle FRI 和 Circle STARK。
https://rot256.dev/post/fri/ https://aszepieniec.github.io/stark-anatomy/fri
现在只要知道要实例化 FRI(和 STARK)需要:
以下是可能的 FRI 实例化情况的简要概述:
当 的乘法子群 平滑时可用:
https://eprint.iacr.org/2018/046
当域是二进制域 时可用。
这是一个 - 线性变换, 它对应于具有核空间 的矩阵, 即变换一维 生成的子空间到零。
由Ben-Sasson、Goldberg、Kopparty 和 Saraf 在 2019 年的 DEEP-FRI 论文中首次引入。
https://eprint.iacr.org/2019/336
适合任意大域 。
因此陪集 也具有阶 。使用陪集(代替 ) 是因为我们最终想要求值域元素处的多项式,而不是椭圆曲线点 ,这是通过映射 到其 坐标来实现的, 因此我们必须确保 具有唯一的 坐标--椭圆曲线的子群并不符合这个条件:元素及其逆元都有相同的 坐标
该结构于 2021 年引入, 分为 Ben-Sasson、Carmon、Kopparty 和 Levit 撰写的两篇论文 ECFFT Part I 和 ECFFT Part II。
https://arxiv.org/abs/2107.08473 https://www.math.toronto.edu/swastik/ECFFT2.pdf
适用于素域 , 其中 。最著名的是梅森素数: 。
这项技术是由 Haböck、Levit 和 Papini 今年(2024 年)提出的。
https://eprint.iacr.org/2024/278
也将是本系列的关注重点。
前两组技术已被广泛部署, 例如由以下团队部署的例子:
选择这些域是因为它们能够实现快速算术, 从而实现快速 STARK 证明生成。就素域而言, 最近推出的第四种技术 Circle STARK 可以在一类素域(梅森素域)上达到更快的 STARK。
Circle STARK 是在域 上定义的, 其中 是素数:即整数模一个梅森素数。在二进制中, 该素数只是一个由 个1组成的串:
事实证明, 模约简就像和掩码进行“与"操作, 然后加上右移的高位一样简单, 例如对于 31 位梅森素数 , 约简可以实现为:
#define MASK (0x7FFFFFFF) // 2^31 - 1 = 1111...1111
uint64_t reduce(uint64_t x) {
return (x & MASK) + (x >> 31);
}
该函数输入一个 64 位整数并生成部分约简结果, 应用约简两次会生成完全约简结果。要了解其原理,请看如果我们定义:
我们可以将 表示为:
因此:
因为 , 我们有:
这显然非常快:在任何现代 CPU 上只需要几个周期。因为是 31 位素数, 所以任何域乘法的未约简结果最多为 62 位, 因此可放在一个 64 位整数之中。也可以使用例如 VPMULUDQ 进行简单的矢量化。
https://www.intel.com/content/www/us/en/docs/cpp-compiler/developer-guide-reference/2021-9/mm256-mul-epu32.html
如果 31 位还不够, 你可以使用 61 位梅森素数 , 它是适用 64 位整数的最大梅森素数, 并应用类似的技术。
要点:我们希望为 STARK 使用梅森素域,因为模约减非常快:没有比这更好的了。
通常, 在设计 STARK 时, 我们有许多可能的(素数)域 可以选择, 并且我们可以选择一个具有平滑乘法子群的域。一种方法是选择 使得 为质数, 那么该域将具有阶为 的平滑子群,因为 。例如, ethSTARK 的素数 有 , 仅仅因为它是使 成为素数的最小的 。
梅森素数的问题是我们无法挑选它们, 已知的只有 51 个, 而且增长得非常非常快。因此, 与 ethSTARK 的素数不同, 我们不能只是简单地“选择另一个”,不幸的是它们没有平滑的乘法子群,例如,31 位梅森素数 具有乘法群的阶为:
看不到 2 的大幂:(
在本系列的第二部分中, 我们将开始探索可以在梅森素数情况下被使用的另一种群结构, 即单位圆。