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 总共需要 轮,其中 为原始多项式的次数,最终变成一个常量多项式。
实际中,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