理解 Lasso (三):大表格的稀疏查询证明
- 作者: Yu Guo@Secbit(郭宇): Founder of Secbit, https://github.com/sec-bit
Lasso 这个名字是 Lookup Arguments via Sparse-polynomial-commitments and the Sumcheck-check protocol, including for Oversized-tables 的缩写。这里面有三个关键词,
- Sparse Polynomial Commitment
- Sumcheck protocol
- Oversized table
本文继续讨论如何利用 Sparse Polynomial Commitment 来构造 Indexed Lookup Argument。但为了能处理 Oversized Table(比如 这样的表格),需要充分利用表格的内部结构。
1. 构造简易 Indexed Lookup Argument
前文介绍了 Sparse Polynomial Commitment,现在回到正题 Lookup Argument。下面是一种 Lookup 关系的表示:
这里 为表格向量,长度为 , 为查找向量,长度为 ,选择矩阵 大小为 。
我们引入三个 MLE 多项式 来分别编码矩阵 ,表格向量 ,与查找向量 , 那么它们满足下面的关系:
Verifier 可以发送一个挑战向量 ,把上面的等式可以归约到:
现在, Prover 要向 Verifier 证明上面的求和等式成立,我们会立即想到使用 轮的 Sumcheck 协议,把上面的等式归约到一个新的等式:
其中 为 个求和项折叠之后的值, 为 Verifier 在 Sumcheck 协议过程中发送的挑战值。这时 Verifier 要验证上面的等式,就需要 Prover 提供三个 MLE 的求值证明。因为 矩阵是一个稀疏矩阵,因此 Prover 可以在协议最开头采用 Spark 协议来承诺 ,然后在 Sumcheck 协议的末尾, Prover 可以花费 的计算量来产生 的 Evaluation 证明。这远好于 Prover 直接采用普通多项式承诺的开销,。
协议细节
公共输入:
- ,
- ,
- ,
第一轮:Verifier 发送挑战向量
第二轮:Prover 和 Verifier 执行 Sumcheck 协议,把上式归约到
第三轮:Prover 发送
当然,我们可以通过把 整个向量排成一排,得到长度为 长的一维向量 ,然后把这个向量在一个 维的空间中 进行拆分:
然后利用 Spark 协议来达到 的 Proving Time 复杂度。但是 Prover 在产生 时则需要 的计算量。那么总体上,Spark 虽然可以有效降低 Prover 的工作量,但是如果表格尺寸 非常大,那么 Prover 仍然需要花费大量的时间来计算表格。那么还能不能更进一步呢?像 Caulk/Caulk+, cq 那样让 Prover 的性能开销变为关于 的亚线性复杂度。
Lasso 协议正是朝着这个方向迈出了一大步,它甚至不需要像 cq 那样要实现对完整的大表格做预处理。尽管它不通用,只能针对几类特殊的表格,但不少常见的运算都可以证明。
Lasso 的核心思想是,我们能否把表格向量 像稀疏向量一样按照多个维度去拆解?如果能像 Tensor Structure 那样,一个巨大的表格可以表示为若干个小表格的运算。这样 Prover 和 Verifier 就可以对多个小表格做 Lookup 证明,那么最终得到的效果就是:看起来我们可以实现一个虚拟的大表格的查询证明。
顺着这个思路往下想,一般情况下表格不可能是稀疏的,不过非稀疏的表格在某些情况下是可以分解的。比如我们在前文提到的异或运算的表格,
直觉上,一个2-bit XOR 表格是可以分解为两个 1-bit XOR 表格的运算。因为 XOR 运算是按位进行,操作数的高位和低位的 XOR 运算互不干扰。进而我们可以推广到 AND 运算,OR 运算等等。具体怎么做到呢?接下去,我们深入到表格的内部结构中。
2. 分解表格
稀疏的选择矩阵 还有一个特点是,其中的所有非零元素都为 。那么我们可以换一种方式来表达 Lookup 等式:
为了排版清晰,这里我们换用大写的 表示未被分解的大表格,分解出的子表格用小写字母 表示,并且用 和 符号来表示表格中第 个元素 。其中 表示第 行的 所在的列坐标,可以看成是 矩阵的一种稠密表示。容易验证对任意的 ,,相当于列出表格中的被 非零元素筛选出来的元素。因此这个等式可以看成 的另一种定义,等价于
我们把 单独排成一个向量 ,然后把向量编码成 MLE 多项式,记为 。那么通过一个随机挑战向量 , Lookup 的关系就归约到下面的等式:
根据 Offline Memory Checking 的思路,我们可以证明 都读取自表格 。这样相当于原地踏步,我们为了证明一个 Lookup关系,我们归约到了另一个 Lookup 关系。不过我们是否可以 分解到一个二维(或者多维)的子表格上呢?就像 Spark 协议中的 向量一样,我们是把 所读取的内存 分解成了 和 ,然后把 分解为 和 。然而并不是所有的表格都能像 一样满足 Tensor Structure 的。事实上,绝大部分的表格不满足这个条件。不过幸运地是,尽管他们不满足 Tensor Structure,但是一大类的有用表格可以按照类似的思路处理。
我们先看一个简单但很实用的表格,RangeCheck 表格。当需要证明 ,我们可以构造一个表格 ,如果 ,那么说明 在 到 之间。
这个表格 可以被分解成两个 的 RangeCheck 表格之间的运算:
比如我们假设 , 定义如下:
另一个 2-bit RangeCheck 表格 定义如下:
那么我们可以用下面的矩阵来展示 和子表格 之间的关系:
矩阵的第一行为 ,第一列也为 ,矩阵中的每个单元可以表示为
于是矩阵的所有单元构成了 的所有元素。
针对 Rangecheck 表格这个特例,我们可以构造一个高效的 Lookup Argument。
3. RangeCheck 表格的 Lookup Argument
我们用 和 表示 2bit 和 4bit-RangeCheck 表格的 MLE 多项式,那么它们满足下面的等式:
那么 Lookup 关系可以写成下面的形式:
这里 和 分别表示 的高 2bits 和低 2bits。
同样,我们需要借助向量 ,其中向量元素 表示 在 处的取值,因此上面的等式可以转化为:
由于 的可分解性,我们可以把 的高 2bits 和低 2bits 分别抽取出来,它们构成两个向量 与 ,分别对应 中的第 项和 第 项,满足 。
接下来构造 与 两个 MLE 多项式,分别编码 与 ,那么上面的等式可以转化为:
由于这个等式是一个求和式,因此我们可以利用 Sumcheck 协议来把上面的等式归约到:
其中 为 Verifier 在 Sumcheck 过程中产生的长度为 的挑战向量。辅助向量 与 的正确性可以由 Offline Memory Checking 来证明。
类似的,我们可以把 32-bit RangeCheck 表格分解成四个 8-bit RangeCheck 表格, 或者两个 16-bit RangeCheck 表格。
我们用这个可分解表格,构造一个 Lookup Argument,与之前的方案的差异在于,它利用了表格向量的内部结构,可以处理超大的表格。
4. Lasso 协议框架
Lasso 的核心协议是一个类似 Spark 的稀疏多项式承诺,被称为 Surge。对于任意一个查找记录 ,假如 在主表格 中的索引值为 。因为主表格 可被分解,比如 可以被分解为 个子表格。分解维度的数量 对应于主表的索引值 按照二进制位的拆分。例如:
即每一个主表元素 都可以写成关于 个子表格 中的元素的运算:
我们可以写下对于可分解表格的 Lookup Argument 的等式:
以 32-bit 的 Rangcheck 表格为例,假如我们需要把它分解为四个子表格,这四个子表格完全一摸一样,都是一个 8-bit 的 Rangecheck 表格。那么我们可以写下下面的等式:
这里 的定义如下
协议细节
公共输入:
- 子表格的承诺:
- 查询向量的承诺:
第一轮:Prover 计算并承诺
第二轮:Verifier 发送随机向量
第三轮:Prover 计算向量
Prover 计算计数器向量(长度为 ) ,
Prover 计算终状态中的计数器向量(长度为 )
Prover 发送向量的承诺
第四轮:Prover 和 Verifier 运行 Sumcheck 协议,证明下面的等式:
Prover 和 Verifier 把等式归约到:
第五轮:Prover 发送 ,以及
第六轮:Verifier 验证
第七轮:Prover 和 Verifier 调用 Offline Memory Checking 证明每个 的正确性,即每个向量元素 都是从表格 中读取,读取的位置为 :
5. 二元操作表格的分解
除了 RangeCheck 表格之外,还有 AND, OR, XOR 这类按位计算表格也可以按照同样的思路进行分解。例如下面是一个 1-bit AND 表,记为 :
可以看出,这个表格有 4 行,第 行的表格元素为 ,而表格的索引值的高位为 ,低位为 。比如 这一行, 二进制位的高位为 ,低位为 ,那么这一行的表格元素为 ,表示 。假设我们要分解一个 2-bit AND 表格,, 那么我们可以用下面的矩阵来表示:
矩阵中的每个单元格表示 ,其中 , 满足下面的等式:
因此,我们可以推而广之,对于任意的 -bit AND 表格,我们可以把操作数 和 按位拆分成 段,每一段查子表格 确定 ,然后将 个运算结果再按位拼装起来。下面写出这个关系等式:
代入到 Lookup 关系等式中,我们可以得到:
代入上面的 Lasso 协议,我们可以构造出对 表格的 Lookup Arugment 方案。
同样我们可以把其它的二元位操作同样按照这样的思路去分解,如 与 。把主表格拆分成 段,假设主表格表示两个长度为 的二进制数的位运算,那么第 个子表格对应主表索引的第 位到 之间的位运算。 表示两个操作数 和 的二进制位在主表格第 个维度上的位置索引。
References
- [Spartan] Spartan: Efficient and general-purpose zkSNARKs without trusted setup by Srinath Setty.
- [Lasso] Unlocking the lookup singularity with Lasso by Srinath Setty, Justin Thaler and Riad Wahby.
- [Jolt] Jolt: SNARKs for Virtual Machines via Lookups by Arasu Arun, Srinath Setty and Justin Thaler.
- [Baloo] Baloo: Nearly Optimal Lookup Arguments by Arantxa Zapico, Ariel Gabizon, Dmitry Khovratovich, Mary Maller and Carla Ràfols.