title: 50. 线性 PCP 第一部分 R1CS tags: zk computation theory probabilistically checkable proof linear PCP R1CS WTF zk 教程第 50 讲:线性 PCP 第一部分 R1CS 在上一讲中,我们介绍了概率可检验证明(PCP)的基本概念。这一讲,我们将介绍构造线性 PCP 的第一部分:R1CS。 线性 PCP 线性 PCP(Linear PCP, LPCP)是一种特殊的 PCP 系统,它的证明是线性函数,而验证者可以对证明进行线性查询(查询某个位置的线性组合)来验证某个命题。
title: 50. 线性 PCP 第一部分 R1CS tags: - zk - computation theory - probabilistically checkable proof - linear PCP - R1CS
在上一讲中,我们介绍了概率可检验证明(PCP)的基本概念。这一讲,我们将介绍构造线性 PCP 的第一部分:R1CS。
线性 PCP(Linear PCP, LPCP)是一种特殊的 PCP 系统,它的证明是线性函数,而验证者可以对证明进行线性查询(查询某个位置的线性组合)来验证某个命题。
线性 PCP 的核心特征:
给定一个域 \mathbb{F} 和向量 \pi \in \mathbb{F}^{\ell},证明者提供的函数为 f_{\pi}(x) = \langle \pi, x \rangle,即 \pi 与 x 的内积,而验证者通过线性查询 f_{\pi} 来验证证明的正确性。
一个线性 PCP 系统 (P, V) 对于某个语言 L 满足以下性质:
其中 \epsilon_c 是完备性误差。
其中 \epsilon_s 是可靠性误差。
线性 PCP 是最简单的非平凡 PCP 系统,但构造它并不容易。将一个 NP 问题转换为线性 PCP 主要包含以下步骤(图中红框部分):
从下图可以看出,构建线性 PCP 后,我们只需要额外两步就可以构造出零知识证明系统 zkSNARK 了。这一讲,我们将介绍前 2 步,电路表示和 R1CS。

这一步,我们需要将要证明的 NP 问题转化为一个算数电路。因为 circuit SAT (电路满足性问题)是 NP 完全问题,且每个 circuit SAT 都可以转化为一个算数电路,因此所有 NP 问题都可以转化为算数电路。
我们在 WTF zk 第 46 讲 中介绍过算数电路,不熟悉的可以复习下。
我们一般用“扁平化” (flatenning)的方法进行这一步转换。它的核心思想是将复杂的计算分解成一系列简单的算术操作,每个操作只涉及基本的加法和乘法(或者它们的逆运算)。每个操作只涉及两种形式:y = x 或 z = x \square y,其中 \square 表示加法或乘法门,x, y, z 是变量,度数限制为 1(或者是常数)。
举个例子,比如我们要证明一个方程 y = x^3 + x + 5 的根为 x = 3,我们可以通过引入中间变量的方法将其扁平化:
可以看到,原来方程只有 2 个变量 x, y,扁平化之后引入了 3 个中间变量 v1, v2, v3,外加一个常数变量 1。我们将扁平后的变量向量(数组)记为 w:
对于根 x = 3,变量向量的取值为:
下面是扁平化后的算数电路示意图,共有 6 个变量和 4 个算数门:

R1CS(Rank-1 Constraint System,秩-1约束系统)是一种表示计算的标准化方法,广泛用于零知识证明系统中。它将电路的每个门转换为一个约束,进而将电路的计算问题转化为一个矩阵方程,方便后续构造线性 PCP。
约束系统定义了一组变量和这些变量之间必须满足的关系,比如最简单的线性约束系统:
其中 x_i 是变量, a_i, b_i 是系数。它的矩阵形式可以写为 Aw = 0,其中 A 是系数矩阵,w = [1, x_1, x_2] 是变量向量。中国剩余定理解决的同余方程组也属于约束系统。
再比如二次约束系统,每个约束等式的变量最高次为 2:
其中每个约束都可以化简为 w^T A w = 0 的形式,其中 A 是系数矩阵,也被称为约束矩阵,w 是变量向量(包含一个常数 1)。这个示例中, w = [1, x_1, x_2],第一个约束矩阵可以表示为:
R1CS 是一种特殊的二次约束系统,它的约束矩阵 A 的秩为 1,即可表示为两个向量的外积 A = a \otimes b = a b^T。等价的,每个约束的形式可以简化为:
其中 a, b, c 是系数向量,w 是变量向量, \langle a, w \rangle = a^T w = \sum_{i} a_i w_i 表示向量内积。你可以自行推导下它为什么成立。
因此, R1CS 中的多个约束可以表示为矩阵形式:
其中 A, B, C 是系数矩阵(和之前的约束矩阵不同),每一行代表一个约束中的 a, b, c,而 w 是变量向量, \circ 表示向量逐元素乘法(Hadamard积)。
R1CS 可以表示任意的电路计算问题,而电路满足性问题(Circuit SAT)是 NP 完全的,因此 R1CS 问题也是 NP 完全的。这意味着通过 R1CS,我们可以将任何 NP 问题转换为约束系统,方便后续的证明构造。
下面我们将示例中扁平化的电路转换为 R1CS 表示。在上一节,我们得到了 4 个约束:
变量向量 w 为:
约束 1:
对应的向量表示为:
约束 2:
对应的向量表示为:
约束 3:
对应的向量表示为:
约束 4:
注意加法和乘法的处理有区别,对应的向量表示为:
然后,我们将上述向量组合成矩阵 A, B, C,矩阵的行数与约束(算术门)数一致,为 4;列数与变量数一致,为 6:
下面,我们验证约束是否成立,即对于每个约束,我们验证 \langle a_i, w \rangle \langle b_i, w \rangle = \langle c_i, w \rangle。
对于约束 3,有:
也就是,
这与原始约束 v_3 = v_2 + x 一致,证明我们成功的将扁平化电路转换为 R1CS 表示。
这一讲,我们介绍了线性 PCP 的基本概念,以及构建它的第一步:将计算问题转换为 R1CS。下一讲,我们将介绍如何进一步转换为 QAP,并利用它构造线性 PCP。