Bulletproof范围证明之原理
主页
微信公众号:密码应用技术实战
博客园首页:https://www.cnblogs.com/informatics/
GIT地址:https://github.com/warm3snow
简介
在《门罗币隐私保护之机密交易》中,我们提到了Bulletproof范围证明技术,用于证明交易金额(Pedersen密文形式)在一个合理的范围内。Bulletproof范围证明是一种零知识范围证明技术。通常称为 Zero Knowledge Range Proof
,简称 ZKRP
。ZKRP与通用的零知识证明技术相比,具有如下特点:
- 高效性:ZKRP证明的大小和验证时间都比较小
- 通用性:ZKRP通用性较差,主要用于证明某个值在一个合理的范围内的场景,如:机密交易、身份验证、隐私投票、隐私竞拍等。
ZKRP实现方案很多,除了通用的ZKP技术外,还有Bulletproof、ZK Set Membership、Hash chains等技术。但由于Bulletproof范围证明具有效率高、透明设置、可聚合性,与Pedersen承诺的兼容性等特点,在实践中最受欢迎。Bulletproof范围证明及其优化涉及到多个技术细节,如:内积证明、折半算法、非交互式证明等。
本文将对Bulletproof范围证明技术中的内积证明进行详细介绍,包括基本构造、证明生成和验证流程等。
本文内容组织如下:
- 术语定义
- 范围证明形式化表示
- 向量内积表示
- 范围证明多项式表达
- Bulletproof交互式范围证明
- 结语
- 参考文献
术语定义
和 :分别表示两个大素数 :表示模 的整数环 :表示模 的整数环中的所有与 互素的元素, 即非零元素 :阶为 的循环群, 如果: , 则 是 的生成元 和 :分别表示群 上的n维向量空间和 上的n维向量空间 = : 表示向量 的Pedersen承诺值 : 表示向量 和 的内积。 : 表示向量 和 的哈达玛积。 : 表示模 的向量多项式,其中 。 : 表示向量多项式 和 的内积。 : 令 等于向量多项式 和 的内积,则 。 和 : 表示向量 的前 个元素和后 个元素。 : 表示长度为 的向量 ,其中 。 和 : 分别表示证明生成者Prover和证明验证者Verifier
Bulletproof范围证明
Bulletproof范围证明依赖于承诺方案,因此流程上与承诺方案类似,包含:
- 承诺:Prover生成承诺,并发送给Verifier
- 挑战:Verifier生成挑战数,并发送给Prover
- 打开/响应:Prover揭示明文或者证明,并发送给Verifier
- 验证:Verifier验证Prover提供的证明是否正确
Bulletproof关键流程如下:
- 步骤1:范围证明转换为多项式表达,转换过程包含:形式化表示、向量内积表示、多项式表达等
- 步骤2:承诺
- 步骤3:挑战
- 步骤4:响应
- 步骤5:验证
下面我们针对每个步骤进行详细介绍。
范围证明形式化表示
下面我们以证明
其中,
- 范围证明问题被转换成了两个部分:
的Pedersen承诺和 的范围大小 的Pedersen承诺: ,与标准的Pedersen承诺形式一致 的范围大小: ,保证了 的值在一个合理的范围内。其中n是一个固定的数值,通常为64。
同时为了更方便的进行范围证明构造,Bulletproof会将范围证明问题转换为以下等式:
分析以上以上几个等式,可以很容易得出结论:
- 结论1:等式
实际上是 的二进制表达 - 结论2:等式
和等式 限制了 中元素 的取值范围必须为 或
由于
向量内积表示
Bulletproof范围证明会将等式
- 将等式
转换为向量内积形式
其中,
- 将多个向量内积证明转换为一个向量内积证明问题
通过引入另一个随机数
为了方便后面范围证明的构造和验证,我们将上述等式展开为:
其中,
- 展开后的等式左边为向量内积形式
- 等式右边为常量,通过
进行计算,计算过程不涉及 和 。
范围证明多项式表达
我们知道在零知识证明中,一般将证明问题转换为多项式形式,然后Prover的多项式的承诺可以通过Verifier在随机打开点上验证完成。在Bulletproof中,Prover会将等式
首先我们定义两个线性向量多项式
其中,
通过上述定义,我们可以将等式
Bulletproof交互式范围证明
承诺
Bulletproof首先会对关键参数
- 计算承诺
生成随机数 和随机向量 , , 并计算承诺
需要说明的是:
和 与等式 中的对应。 是 和 的Pedersen承诺 是 和 的Pedersen承诺, 用于隐藏范围证明多项式表达中使用的 和 的值(注: 和 与 强绑定,因此需要隐藏) 和 是对多项式 的系数承诺
- Prover将承诺
发送给Verifier
挑战
Verifier生成随机挑战
是对多项式承诺的挑战 用于生成公式 中的 ,是对 范围的挑战 对应公式 中的 ,是对等式 的挑战
打开/响应
Prover根据接收到的挑战
- 计算多项式点打开
- 计算随机响应
注:Prover在打开阶段时,计算的响应用到了承诺阶段的一些随机数和随机向量,如
等。
- Prover将(
)作为响应发送给Verifier
验证
Verifier接收到Prover的响应后,验证Prover提供的证明是否正确。Verifier需要验证多个等式是否成立:
- 验证
,方式如下:
- 验证
和 是否正确,方式如下:
其中,
即: - 验证
是否正确
如果上述等式都成立,则Verifier接受Prover的范围证明,即
正确性验证
- 验证
因此,
- 验证
和 是否正确
根据
因此
因此,
- 验证
是否正确
t的正确性验证比较简单,由于Prover在打开阶段计算的
结语
本文作为Bulletproof范围证明系列文章的第一篇,详细介绍了Bulletproof范围证明的多项式表达、承诺、挑战、打开、验证等流程。Bulletproof范围证明是一种零知识证明技术,主要用于证明某个值在一个合理的范围内。Bulletproof范围证明具有高效性、透明设置、可聚合性等特点,因此在实际应用中得到了广泛的应用。
本文未对Bulletproof范围证明的优化、聚合、批量验证等技术进行详细介绍,后续文章会逐步展开对Bulletproof的进一步介绍,展示Bulletproof备受欢迎的魅力所在。