防彈是簡短的零知識知識論證,不需要可信設定。論證系統是具有計算可靠性的證明系統。
Bulletproofs 適用於證明關於承諾值的陳述,例如範圍證明、可驗證的混音、算術電路等。
Bulletproofs 的核心演算法是 Groth [2] 提出的內積演算法。該演算法提供了滿足給定內積關係的兩個綁定定向量 Pedersen 承諾的知識論證。 Bulletproofs 建立在 Bootle 等人的技術之上。 [3] 引入一種有效的通訊內積證明,將論證的整體通訊複雜度降低到僅在哪裡是承諾的兩個向量的維度。
Bulletproofs 提供了一種用於進行短期和可聚合範圍證明的協議。他們使用多項式對內積中提交的數字範圍的證明進行編碼。範圍證明是秘密值位於某個區間的證明。範圍證明不會洩露有關秘密值的任何信息,除了它們位於區間內的事實之外。
證明演算法可以分為 5 個步驟:
讓是一個值和位向量,使得 。的組成部分是二進制數字 。我們構造一個互補向量並要求成立。
- 在哪裡和佩德森的承諾是盲目的和 。
- 驗證者發送挑戰和修復和 。
- 在哪裡和是對係數的承諾 ,多項式的根據協定中的現有值建構。
,
- 驗證者用價值挑戰證明者 。
- 證明者發送若干承諾,然後驗證者將檢查這些承諾。
請參閱 Prover.hs 以了解實施細節。
使用 Fiat-Shamir 變換使所描述的交互變得非交互,其中 V 提出的所有隨機挑戰都被替換為該點之前的轉錄本的雜湊。
透過利用緊湊的結構進一步減小了證明的大小內積證明。
協定中的內積參數可以證明向量的知識和 ,其內積為和承諾是這兩個向量的承諾。因此,我們可以替換發送( ) 並轉移 ( ) 和內積參數的執行。
然後,而不是分享和 ,其通訊成本為元素,內積參數僅傳輸元素。總共,證明者僅發送群元素與 5 個元素
我們可以建構多個值的範圍的單一證明,同時只產生額外的空間成本為了附加價值 ,而不是乘法因子創建時獨立的範圍證明。
聚合範圍證明利用了內積參數。它使用( ) 群組元素和 5 個元素 。
請參閱多範圍證明範例
單範圍證明
import 資料庫。 =提交 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)] -Ftest -Ftest -Frecom -表 -Iococid -Fted -Ft -Ft - ( uncurry 提交) vsAndvBlindings -- 證明者 proofE <- runExceptT (MRP.generateProof upperBound vsAndvBlindings) -- 驗證者案例proofE of Left err ->panic (show err) [email protected]{..} -> pure (MRP.verifyProof upperBound vCommits 證明)
請注意,上限一定是這樣的 , 在哪裡也是 2 的冪。有關更多詳細信息,請參閱範圍證明範例。
域和變數的算術電路是一個有向無環圖,其頂點稱為門。
算術電路也可以描述為乘法閘的列表,以及與閘的輸入和輸出相關的線性一致性方程式的集合。任何描述為非循環圖的電路都可以有效地轉換為這種替代描述。
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 -- 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.