理解 Lasso (三):大表格的稀疏查询证明

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 表格。那么我们可以写下下面的等式:

这里 的定义如下

协议细节

公共输入:

  1. 子表格的承诺:
  2. 查询向量的承诺:

第一轮: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