Plonkup由Gabizon发表于2020年,利用lookup查找表提升减少计算,可以提升证明者效率。Plonkup可以实现递归证明而无需椭圆曲线对(如Halo等需要椭圆曲线对)。
背景
传统的一些密码基元如Hash函数,为了兼顾安全和在软硬件实现上的高效性,通常处理涉及大量位运算。但这些操作在域内运算上是非常低效的,造成电路门数大幅增加。
例如对于Sha256处理的主要函数:
可以构造如下查询表:
| 0 | 0 | 0 | 0 | 0 |
| 0 | 0 | 1 | 0 | 1 |
| 0 | 1 | 0 | 0 | 1 |
| 0 | 1 | 1 | 1 | 2 |
| 1 | 0 | 0 | 0 | 1 |
| 1 | 0 | 1 | 1 | 2 |
| 1 | 1 | 0 | 1 | 2 |
| 1 | 1 | 1 | 0 | 3 |
对于两个序列和
,满足
,构造新的序列
, 即
由
和
拼接,并根据
排序后得到,需要利用grand product 来证明它们的置换关系。
Plonkup对于函数的输入输出元组压缩为单个域元素
, 然后要检查要查询的值在查找表
中。
随机差分序列
为了证明, Plonkup引入差分序列的概念。
对于序列, 定义差分序列为:
例如对于序列,若要验证其属于序列
, 可分别计算其差分序列为:
和
, 其中0代表重复的元素, 只需要验证差分序列是否相同即可。
验证差分序列只是必要条件,为了保证充分性,Plonkup引入了随机差分序列的概念,即差分序列的元素为:, 其中随机数
。
关键定理
对于序列,
,
:
-
, 根据
重新排序。
上述成立的条件当且仅当 , 其中
当时,
可以得到因子:
。
Plonkup协议
Plonkup将函数计算问题,转变为序列问题。例如对于函数, 验证者选择随机数
给证明者。双方同时计算域元素序列的集合,即
, 构造查询表。
以下假设 , 若
, 可以在
后面补
个
的最后一个元素。
- 将
根据
排序后得到
, 用
,定义
,
;
,
。
-
计算多项式
, 并将其发送给第三方
;
-
选择随机数
, 并将其发送给
;
-
计算多项式
, 聚合
的值,即:
(a)
(b) 对于,
(c)
-
将
发送给
;
-
校验
确实根据上面的形式计算,且
; 即对所有的
,
验证下面的恒等式成立:
(a)
;
(b)
(c)(d)
上述过程类似于Plonk置换中grand product的验证。若验证通过,则表明所有的都在查找表
中存在。
向量查找表
对于有多个witness 多项式: , 查找表值
, 需要检验:对于
,
, 可以利用随机化归为上一节的处理方式。
对于每个, 引入预处理多项式
, 且
,
;
验证者随机选择 ;
然后定义 ,
假如对于 ,
, 除非是可忽略的概率,保证
对于具有 个输入的函数
, 可以验证向量的形式
。
多个查找表
假v中有多个查找表 , 对于每一个
, 检查
,
, 可以创建一个预处理的表
作为子表,并添加一列作为表的索引。
对于, 构造
, 对每一个
, 包括
。 可以预处理一个多项式
, 使得
,
代表第
个子表的第
个值。
然后可以用上面的向量方法,对每一个 , 检查
连续范围的优化方案
若需要检查 , 可以使用上述协议,设定
。当
的时候,可以检查
。 这个协议还可以推广到范围
范围的检查,设定
,
, 可以推导
。
设查找表 为:
.
为阶为
的 乘法群,生成元为
。
协议参数 为一个正整数,多项式
, 用来约束
。
协议步骤如下:
-
设
为
根据
排序后得到的向量,利用多项式
来表示
, 即
,
,
且
;
-
计算多项式
, 并将其发送给
-
验证者
选择随机数
, 并将其发送给
;
-
计算多项式
, 聚合
的值,即
(a)
(b) 对于 ,
(c)
-
将
发送给
。
-
检查以下恒等式对所有的
成立。
(a)
(b)
(c)
(d)
(e)
(f)
(g)
(h)
参考
https://github.com/kevaundray/plookup
https://research.metastate.dev/on-plonk-and-plookup/
https://github.com/Fluidex/awesome-plonk





网友评论