在zkVM中,内存访问一致性检查是证明任何读操作返回的值确实是写入该内存地址的最新值。如果能证明读取和写入的数据是置换关系,便可证明内存访问的一致性。内存一致性检查构造读集合RRR和写集合WWW,元素都是(addr,val,cnt)(addr,val,cnt)(addr,val,
在 zkVM 中,内存访问一致性检查是证明任何读操作返回的值确实是写入该内存地址的最新值。如果能证明读取和写入的数据是置换关系,便可证明内存访问的一致性。
构造读集合 $R$ 和写集合 $W$,元素都是 $(addr, val, cnt)$,分别表示地址、值和计数器。
Write(addr, val)
Read(addr)
如果最终 $W=R \cup Final$,便可证明内存访问的一致性,其中 $Final$ 表示对于所有地址 $addr_i$,写集合 $W$ 中该地址的最新元素 $(addr_i, val_i, cnt_i)$
LogUp 方式: $$ \sum{(a,v,t)\in W}\frac{1}{f(a,v,t)-\tau}=\sum{(a,v,t) \in R}\frac{1}{f(a,v,t)-\tau} + \sum{(a,v,t) \in Final}\frac{1}{f(a,v,t)-\tau} $$ Multiset Hashing 方式: $$ \sum{(a,v,t)\in W}Enc(f(a,v,t))=\sum{(a,v,t) \in R}Enc(f(a,v,t)) + \sum{(a,v,t) \in Final}Enc(f(a,v,t)) $$ 前者需要先运行一遍程序以计算挑战值 $\tau$;后者的约束更复杂,因为涉及到椭圆曲线群上的计算以及对哈希过程的约束,比如 Poseidon2
Multiset hashing 由 Clarke, Devadas, van Dijk, Gassend and Suh [CDvD+ 03] (building on Bellare and Micciancio [BM97]) 引入,可以将一个大的集合哈希到一个短字符串上,并且很难找到两个不同的集合可以映射到同一个值上。该哈希方式是增量的,即一次只哈希一个元素,并且与元素被哈希的顺序无关。这样,就可以比较两个以不同顺序生成元素的集合。
相对于 LogUp,multiset hashing 允许直接更新哈希值,而不需要先运行一遍程序以计算挑战值。
一个 multset hash,对于一个域 $U$,一个压缩函数族 $H = \left{hk: P(U) \rightarrow \left{0,1\right}^{\lambda}\right}{k \in \left{0,1\right}^*}$,其中 $\lambda$ 表示安全参数,算法如下:
在多项式时间内找到两个不同的集合拥有相同的哈希值的概率是非常小的。
$(G, +)$ 是循环群,$\left{f_k: U \rightarrow G\right}_k$ 是一个函数集合。multiset hash 函数定义如下: $$ hk(S)=\sum{s \in S}f_k(s) $$ 可以看到,空集合和增量功能是比较容易实现的。空集合就是群的幺元 $0_G$,添加一个元素 $x$ 到 multiset $S$ 就是计算 $h(S)+h(x)$
以上构建方式是 multiset 抗碰撞的,因为 $G$ 上的离散对数难问题,以及 $f_k: U \rightarrow G$ 建模为一个随机函数。
群 $G$ 是椭圆曲线 $y^2=x^3+Ax+B$ 上的点 $(x,y)$ 的集合(以及位于无穷远处的特殊点),$A,B \in \text{F}$,$\text{F}$ 是一个大的域。哈希函数使用 BabyBear 域上的 Poseidon2。为了将一个元素哈希到椭圆曲线上,先用 Poseidon2 计算点的 $x$ 坐标,该 $x$ 坐标可能不是椭圆曲线上的有效值,还需要加一个 8-bit 调整值,该值也会被哈希在内。另外,需要通过范围检查来约束 $y$ 坐标不能被反转。
对椭圆曲线 $y^2=x^3+Ax+B$ 的要求:
寻找椭圆曲线的方法在这里:Memory Consistency Checking
对于 BabyBear 域 $\text{F}p$,其中 $p=15 * 2^{27}+1$,选择不可约的 7 次扩域 $\text{F}{p^7} = \text{F}_{p^7}/(z^7-2z-5)$ 和椭圆曲线 $$ y^2=x^3+2x+26z^5 $$ 该椭圆曲线有素数阶 $r = 134062710381075636479997415343722979822569397998875702343109881667$
用 SageMath 验证 $\text{F}{p^7} = \text{F}{p^7}/(z^7-2z-5)$ 在 $p=15 * 2^{27}+1$ 上不可约:
sage: p = 2013265921
....: R.<z> = GF(p)[]
....: f = z^7 - 2*z - 5
....: f.is_irreducible()
True
对于 KoalaBear 域 $\text{F}p$,其中 $p=127 * 2^{24} + 1$,选择不可约的 7 次扩域 $\text{F}{p^7} = \text{F}_{p^7}/(z^7+2z-8)$ 和椭圆曲线 $$ y^2=x^3+3zx-3 $$
该椭圆曲线有素数阶 $r=199372529839252601278447397890875723011140055175072723225727394951$
SP1 V4 Turbo: Memory Argument via Elliptic Curve based Multiset Hashing
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!