防弹是简短的零知识知识论证,不需要可信设置。论证系统是具有计算可靠性的证明系统。
Bulletproofs 适用于证明有关承诺值的陈述,例如范围证明、可验证的混音、算术电路等。它们依赖于离散对数假设,并使用 Fiat-Shamir 启发式使其成为非交互式的。
Bulletproofs 的核心算法是 Groth [2] 提出的内积算法。该算法提供了满足给定内积关系的两个绑定向量 Pedersen 承诺的知识论证。 Bulletproofs 建立在 Bootle 等人的技术之上。 [3] 引入一种有效的通信内积证明,将论证的整体通信复杂性降低到仅在哪里是承诺的两个向量的维度。
Bulletproofs 提供了一种用于进行短期和可聚合范围证明的协议。他们使用多项式对内积中提交的数字范围的证明进行编码。范围证明是秘密值位于某个区间的证明。范围证明不会泄露有关秘密值的任何信息,除了它们位于区间内的事实之外。
证明算法可以分为 5 个步骤:
让是一个值和位向量,使得 。的组成部分是二进制数字 。我们构造一个互补向量并要求成立。
- 在哪里和佩德森的承诺是盲目的和 。
- 验证者发送挑战和修复和 。
- 在哪里和是对系数的承诺 ,多项式的根据协议中的现有值构建。
,
- 验证者用价值挑战证明者 。
- 证明者发送若干承诺,然后验证者将检查这些承诺。
请参阅 Prover.hs 了解实施细节。
使用 Fiat-Shamir 变换使所描述的交互变得非交互,其中 V 提出的所有随机挑战都被替换为截至该点的转录本的哈希值。
通过利用紧凑的结构进一步减小了证明的大小内积证明。
协议中的内积参数可以证明向量的知识和 ,其内积为和承诺是这两个向量的承诺。因此,我们可以替换发送( ) 并转移 ( ) 和内积参数的执行。
然后,而不是共享和 ,其通信成本为元素,内积参数仅传输元素。总共,证明者仅发送群元素和 5 个元素
我们可以构造多个值的范围的单一证明,同时只产生额外的空间成本为了附加值 ,而不是乘法因子创建时独立的范围证明。
聚合范围证明利用了内积参数。它使用( ) 组元素和 5 个元素 。
请参阅多范围证明示例
单范围证明
import Data.Curve.Weierstrass.SECP256K1 (Fr)导入合格的 Bulletproofs.RangeProof as RPimport Bulletproofs.Utils (commit)testSingleRangeProof :: Integer -> (Fr, Fr) -> IO BooltestSingleRangeProof upperBound (v, vBlinding) = do let vCommit =提交 v vBlinding——证明者 proofE <- runExceptT (RP.generateProof upperBound (v, vBlinding)) -- 验证者案例proofE of Left err ->panic (show err) [email protected]{..} ->pure(RP.verifyProof upperBound vCommitproof )
多范围证明
导入 Data.Curve.Weierstrass.SECP256K1 (Fr)导入合格的 Bulletproofs.MultiRangeProof 作为 MRPimport Bulletproofs.Utils (commit)testMultiRangeProof :: Integer -> [(Fr, Fr)] -> IO BooltestMultiRangeProof upperBound vsAndvBlindings = do let vCommits = fmap ( uncurry 提交)vsAndvBlindings -- 证明者 proofE <- runExceptT (MRP.generateProof upperBound vsAndvBlindings) -- 验证者案例proofE of Left err ->panic (show err) [email protected]{..} -> pure (MRP.verifyProof upperBound vCommitsproof)
请注意,上限一定是这样的 , 在哪里也是 2 的幂。此实现使用椭圆曲线 secp256k1,即 Koblitz 曲线,具有 128 位安全性。有关更多详细信息,请参阅范围证明示例。
域和变量的算术电路是一个有向无环图,其顶点称为门。
算术电路也可以描述为乘法门的列表,以及与门的输入和输出相关的线性一致性方程的集合。任何描述为非循环图的电路都可以有效地转换为这种替代描述。
Bulletproofs 提出了一种使用内积参数为算术电路生成零知识参数的协议,该协议允许获得大小证明元素并包括提交值作为算术电路的输入。
在协议中,Prover 证明了 hadamard 乘积和并且一组线性约束成立。输入值用于生成证明的数据随后被提交并与验证者共享。
import Data.Curve.Weierstrass.SECP256K1 (Fr)import Data.Field.Galois (rnd)import Bulletproofs.ArithmeticCircuitimport Bulletproofs.Utils (hadamard, commit)-- 示例:-- 2 个线性约束 (q = 2):-- aL [0] + aL[1] + aL[2] + aL[3] = v[0]-- aR[0] + aR[1] + aR[2] + aR[3] = v[1]---- 4 个乘法约束(隐式)(n = 4):-- aL[0] * aR[0] = aO[0 ]-- aL[1] * aR[1] = aO[1]-- aL[2] * aR[2] = aO[2]-- aL[3] * aR[3] = aO[3]-- --- 2 个输入值 (m = 2)arithCircuitExample :: ArithCircuit FrarithCircuitExample = ArithCircuit { 权重 = GateWeights { wL = [[1, 1, 1, 1] ,[0,0,0,0]] , wR = [[0, 0, 0, 0] ,[1,1,1,1]] , wO = [[0, 0, 0, 0] ,[0,0,0,0]] } , 承诺权重 = [[1, 0] ,[0, 1]] , cs = [0, 0] }testArithCircuitProof :: ([Fr], [Fr]) -> ArithCircuit Fr -> IO BooltestArithCircuitProof (aL, aR) arithCircuit = do let m = 2 -- 乘法约束 let aO = aL `hadamard` aR -- 线性约束 v0 = 总和 aL v1 = 总和 aR commitBlinders <-replicateM m rnd 让commitments = zipWith commit [v0, v1] commitBlinders 让arithWitness = ArithWitness { 赋值 = 赋值 aL aR aO , 承诺=承诺 , commitBlinders = commitBlinders } 证明<-generateProof arithCircuit arithWitness pure(verifyProof承诺证明arithCircuit)
有关详细信息,请参阅算术电路示例。
参考:
Bunz B.、Bootle J.、Boneh D.、Poelstra A.、Wuille P.、Maxwell G.“Bulletproofs:机密交易等的简短证明”。斯坦福大学,伦敦大学学院,Blockstream,2017
Groth J.“具有次线性零知识论证的线性代数”。伦敦大学学院,2009
Bootle J.、Cerully A.、Chaidos P.、Groth J、Petit C.“离散日志设置中算术电路的高效零知识论证”。伦敦大学学院和牛津大学,2016 年。
符号:
:哈达玛产品
:内积
:矢量
这是仅适用于研究级项目的实验代码。在该代码显着成熟之前,请不要在生产中使用它。
Copyright 2018-2022 Stephen Diehl Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.