Anatomy of a STARk

STARKs是一类交互式证明系统,可以当用是一种特殊的SNARKs:

  • hash函数是唯的密码组件;
  • 算术化基于AIR (algebraic intermediate representation), 将计算完整性问题约减为多项式低度测试问题;
  • 低度多项式证明采用FRI 协议,FRI 采用 Merkle树实例化;
  • Zero-knowledge 是可选的。

概览

STARK 表示 Scalable Transparent ARgument of Knowledge.

  • 证明者的运行时间是准线性的(quasilinear);
  • 验证者的时间复杂度是poly-logarithmic;
  • 不需要可信设置;
  • 非交互的 STARKs 可以看作是 SNARKs的一个子类。

STARK的实现可由下图表示:

计算

计算可以看一个程序,有输入和输出。程序由指令组成,用于操纵数据。

算术化和算术约束系统

算术化主要逻辑和算术的运算转换为有限域上的运算,其输出为: 算术化约束系统,即一些等式方程。计算完整性的证明即找到满足方程的解。

STARK 证明状态计算由 个寄存器表示,值为有限域 。 状态转移函数为:. AET (Algebraic execution trace) 是状态元组更新的列表。

算术化约束系统有两种约束:

  • 边界约束: 计算起始位置的值;
  • 转移约束:连续状态元组的值转移的规则。

这些约束也称为为AIR (algebraic intermediate representation).

插值和多项式IOP

插值用来表示数值化约束系统的的多项式表示。IOP (interactive oracle proof) 是指抽象的黑盒函数,其中验证者可以进行随机查询。当对应低度多项式的时间,也称为多项式IOP.

对于STARK 证明,它计算 个多项式 , 对应域为 ,值为第 个寄存器的AET。

插值将算术化约束系统的可满足性转变为多项式的低度问题。

FRI

FRI是STARK 的关键组件,采用基于Merkle 树的 Reed-Solomon 码字证明多项式度数的有界性。

FRI 表示: Fast Reed-Solomon IOP of Proximity, 是多项式低度证明协议。

![The STARK proof system revolves around the transformation of low-degree polynomials into new polynomials whose degree boundedness matches with the integrity of the computation.]

基本工具

有限域

选择一个大素数 , 有限域元素. 逆元采用扩展的Euclidena算法实现。

STARKs 有限域需要一种特别的结构:, 其中 为余因子, 为一个非常大的数。

单变量多项式

单变量多项式定义为: , 其中 称为系统, 为多项式的度。

多变量多项式

多变量扩展单变量多项式, 有更多变量,如 等, 多变量多项式主要用来表述算术化约束。

Fiat-Shamir 变换

采用 proof stream 用来描述 Fiat-Shamir 变换,主要支持三个功能:

  • Pushing and pulling
  • Serialization and deserialization
  • Fiat-Shamir, 采用 SHAKE-256 算法。

Merkle 树

Merkle 树基于抗碰撞Hash函数构造的向量承诺方案。

Merkle 树构造需要有三种功能:

  • commit: 计算Merkle 根;
  • open: 计算Merkle 树的认证路径;
  • verify: 验证某个叶子节点的存在性。

FRI

FRI (Fast Reed Solomon IOP of Proximity) 协议y主要用来证明承诺多项式具有有限的次数。FRI 采用 codewords 表示,对应着低度多项式的值,定义在域 上。值的长度比多项式次数扩展,也称为blowup 因子, 是 代码率(code rate) 的倒数。

对于一般的多项式承诺方案,证明承诺多项式 , 在指定的点 打开, 值为 :

  • commit: 计算多项式的绑定方案;
  • open: 生成证明 , 对于指定承诺的多项式 ;
  • verify: 验证证明。

FRI用于确定指定的codeword 属于低度多项式,低度表示多项式次数只有 codeword 长度的 。

Split and Fold

在FRI 协议中,声明指定的codeword 对应着低度多项式,用 表示codeword 的长度, 为多项式的最大次数,即多项式为 , 。

采用FFT 分而治之的策略,多项式可以分为奇数和偶数两部分:

,其中

FRI 协议的关键步骤是从 得到 ,其中 是由验证者提供的随机标量。

定义 为 阶乘法群, 为子群的生成元:

对于 的码字 , 对应域为 ; 设 为另一个域,长度减半,, , 分别为 的码字,定义域为 ;

再次扩展得到:

由于 的阶为 , , 因此

此时可以描述一轮的FRI 协议,证明者通过Merkle 根对 承诺,验证者响应随机挑战 , 证明者计算 , 并进行承诺,将 的根给验证者。

验证者验证对应的关系成立:

上面对应1轮FRI 协议,FRI 总共需要 轮,其中 为原始多项式的次数,最终变成一个常量多项式。

image.png

实际中,codeword 的长度约减不是2, 而是2的幂次。

安全级别

需要进行多少次(colinearity)检查,才能实现 位的安全呢?

  • 构建 Merkle 树的Hash函数需要至少 位输出;
  • 域至少需要 个元素;
  • 对于每个colinearity 检查,可以增加 位安全,所以为了达到 位安全,colinearity 检查次数需要为:

Coset-FRI

FRI定义域 会和STARK 的域 有重合的值,为了避免两者产生交集,采用陪集。

陪集的定义域为:, 一般 为整个乘法群 . 下一轮码字的定义域为: 。

Prove

FRI 协议分两个阶段: 承诺和查询。在承诺阶段,证明给验证者发送codeword 的Merkle 根;验证者提供随机域元素,执行split-and-fold 过程。在查询阶段,验证者选择叶子节点的索引,然后证明者打开,检查者检查 colinearity 要求。

承诺阶段由以下一些轮组成:

  • 码字的Merkle 根;
  • 将Merkle 根发送给验证者;
  • 验证者提供随机挑战 ;
  • 证明者根据split-and-fold 公式得到下一轮的码字;
  • 证明者计算 和 的平方,使得 对应着下一轮码字的定义域。

最后一轮的时候,证明者只剩下一个码字,将其直接发送给验证者。

Verify

验证者执行以下步骤:

  • 从Proof stream 读取Merkle 根,通过Fiat-Shamir 重新生成 随机标量 ;
  • 读取最后的码字,验证它对应着低度多项式和最后的Merkle 树根;
  • 重新生成Fiat-Shamir 和随机索引 ,推断共线性检查的剩余索引;
  • proof stream 读取Merkle 叶子节点和认证路径,验证其真实性;
  • 对于每一对连续的码字,运行colinearity 检查。

参考

https://aszepieniec.github.io/stark-anatomy/

https://github.com/aszepieniec/stark-anatomy

https://aszepieniec.github.io/stark-brainfuck/

https://github.com/aszepieniec/stark-brainfuck

https://eprint.iacr.org/2021/582

你可能感兴趣的:(Anatomy of a STARk)