美文网首页
Anatomy of a STARk

Anatomy of a STARk

作者: 雪落无留痕 | 来源:发表于2022-08-20 01:20 被阅读0次

    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 证明状态计算由 w 个寄存器表示,值为有限域 \mathbb{F}。 状态转移函数为:f: \mathbb{F} \rightarrow \mathbb{F}. AET (Algebraic execution trace) 是状态元组更新的列表。

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

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

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

    插值和多项式IOP

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

    对于STARK 证明,它计算 w 个多项式 t_i(X), 对应域为 D,值为第 i 个寄存器的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.]

    基本工具

    有限域

    选择一个大素数 p, 有限域元素\mathbb{F}_p = \{0,1,\cdots, p-1\}. 逆元采用扩展的Euclidena算法实现。

    STARKs 有限域需要一种特别的结构:p = f\cdot 2^k +1, 其中 f 为余因子, k 为一个非常大的数。

    单变量多项式

    单变量多项式定义为: f(X) = c_0 + c_1\cdot X + \cdots + c_dX^d, 其中c_i 称为系统,d 为多项式的度。

    多变量多项式

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

    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 表示,对应着低度多项式的值,定义在域 D 上。值的长度比多项式次数扩展,也称为blowup 因子, 是 代码率(code rate) \rho 的倒数。

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

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

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

    Split and Fold

    在FRI 协议中,声明指定的codeword 对应着低度多项式,用 N 表示codeword 的长度,d 为多项式的最大次数,即多项式为 f(X) = \sum_{i=0}^dc_iX^i, d=2^k-1 , 。

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

    f(X) = f_E(X^2) +X\cdot f_O(X^2),其中f_E(X^2) = \frac{f(X)+f(-X)}{2}, f_O(X^2) = \frac{f(X)-f(-X)}{2X}

    FRI 协议的关键步骤是从 f(X) 得到 f^*(X) = f_E(X)+ \alpha\cdot f_O(X),其中 \alpha 是由验证者提供的随机标量。

    定义 DN 阶乘法群,\omega 为子群的生成元: <w> = D \subset \mathbb{F}_p \backslash \{0\}

    对于 f(X) 的码字 \lbrace f(\omega^i)\rbrace_{i=0}^{N-1}, 对应域为 D; 设D^\star = \langle \omega^2 \rangle 为另一个域,长度减半,\lbrace f_ E(\omega^{2i})\rbrace_{i=0}^{N/2-1}, \lbrace f_ O(\omega^{2i})\rbrace_{i=0}^{N/2-1}, \lbrace f^\star(\omega^{2i})\rbrace_ {i=0}^{N/2-1} 分别为 f_E(X), f_O(X), f^\star(X) 的码字,定义域为 D^\star
    \lbrace f^\star(\omega^{2i})\rbrace_{i=0}^{N/2-1} = \lbrace f_E(\omega^{2i}) + \alpha \cdot f_O(\omega^{2i})\rbrace_{i=0}^{N/2-1} .
    再次扩展得到:

    \lbrace f^\star(\omega^{2i})\rbrace_{i=0}^{N/2-1}

    = \left\lbrace \frac{f(\omega^i) + f(-\omega^i)}{2} + \alpha \cdot \frac{f(\omega^i) - f(-\omega^i)}{2 \omega^i} \right\rbrace_{i=0}^{N/2-1}

    = \lbrace 2^{-1} \cdot \left( ( 1 + \alpha \cdot \omega^{-i} ) \cdot f(\omega^i) + (1 - \alpha \cdot \omega^{-i} ) \cdot f(-\omega^i) \right) \rbrace_{i=0}^{N/2-1}

    由于 w 的阶为 Nw^{N/2}=-1, 因此 f(-w^j)= f(w^{N/2+i})

    此时可以描述一轮的FRI 协议,证明者通过Merkle 根对 f(X) 承诺,验证者响应随机挑战 \alpha, 证明者计算 f^\star(X), 并进行承诺,将 \lbrace f^\star(\omega^{2i})\rbrace_{i=0}^{N/2-1} 的根给验证者。

    验证者验证对应的关系成立: f^\star(X) = 2^{-1} \cdot \left( (1 + \alpha X^{-1}) \cdot f(X) + (1 - \alpha X^{-1} ) \cdot f(-X) \right)

    上面对应1轮FRI 协议,FRI 总共需要 \lceil \log_2 (d+1) \rceil - 1 轮,其中 d 为原始多项式的次数,最终变成一个常量多项式。

    image.png

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

    安全级别

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

    • 构建 Merkle 树的Hash函数需要至少 2\lambda 位输出;
    • 域至少需要 2^{\lambda} 个元素;
    • 对于每个colinearity 检查,可以增加 \log_2 \rho^{-1} 位安全,所以为了达到\lambda 位安全,colinearity 检查次数需要为: s = \lceil \lambda / \log_2 \rho^{-1} \rceil

    Coset-FRI

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

    陪集的定义域为:D = \{g\cdot w^i | i \in \mathbb{Z}\}, 一般 g 为整个乘法群 \mathbb{F}\backslash \{ 0\}. 下一轮码字的定义域为: D^\star = \lbrace d^2 \vert d \in D\rbrace = \lbrace g^2 \cdot \omega^{2i} \vert i \in \mathbb{Z}\rbrace

    Prove

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

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

    • 码字的Merkle 根;
    • 将Merkle 根发送给验证者;
    • 验证者提供随机挑战 \alpha;
    • 证明者根据split-and-fold 公式得到下一轮的码字;
    • 证明者计算 gw 的平方,使得 \lbrace g\cdot w^i \vert i\in \mathbb{Z} \rbrace 对应着下一轮码字的定义域。

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

    Verify

    验证者执行以下步骤:

    • 从Proof stream 读取Merkle 根,通过Fiat-Shamir 重新生成 随机标量 \alpha ;
    • 读取最后的码字,验证它对应着低度多项式和最后的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

          本文链接:https://www.haomeiwen.com/subject/gqspgrtx.html