Antipeluru adalah argumen pengetahuan singkat tanpa pengetahuan yang tidak memerlukan pengaturan yang tepercaya. Sistem argumen adalah sistem pembuktian dengan kekuatan komputasi.
Antipeluru cocok untuk membuktikan pernyataan pada nilai yang berkomitmen, seperti pembuktian rentang, suffle yang dapat diverifikasi, rangkaian aritmatika, dll. Antipeluru mengandalkan asumsi logaritmik diskrit dan dibuat non-interaktif menggunakan heuristik Fiat-Shamir.
Algoritma inti dari Bulletproofs adalah algoritma produk dalam yang disajikan oleh Groth [2]. Algoritme ini memberikan argumen pengetahuan tentang dua komitmen vektor pengikat Pedersen yang memenuhi relasi produk dalam tertentu. Antipeluru dibangun berdasarkan teknik Bootle dkk. [3] untuk memperkenalkan bukti produk dalam komunikasi yang efisien yang mengurangi kompleksitas komunikasi argumen secara keseluruhan Di mana adalah dimensi dari dua vektor komitmen.
Antipeluru menghadirkan protokol untuk melakukan pembuktian jarak pendek dan gabungan. Mereka mengkodekan bukti rentang bilangan tertentu dalam hasil kali dalam, menggunakan polinomial. Pembuktian rentang adalah pembuktian bahwa suatu nilai rahasia terletak pada interval tertentu. Bukti rentang tidak membocorkan informasi apa pun tentang nilai rahasia, selain fakta bahwa nilai tersebut terletak pada interval.
Algoritma pembuktian dapat digambarkan dalam 5 langkah:
Membiarkan menjadi nilai dalam Dan vektor bit sedemikian rupa . Komponen dari adalah digit biner dari . Kami membangun vektor komplementer dan memerlukan itu memegang.
- Di mana Dan adalah komitmen Pedersen yang dibutakan Dan .
- Verifikator mengirimkan tantangan Dan untuk memperbaiki Dan .
- Di mana Dan adalah komitmen terhadap koefisien , dari polinomial dibangun dari nilai-nilai yang ada dalam protokol.
,
- Verifikator menantang Prover dengan nilai .
- Prover mengirimkan beberapa komitmen yang kemudian akan diperiksa oleh verifikator.
Lihat Prover.hs untuk detail implementasi.
Interaksi yang dijelaskan dibuat non-interaktif menggunakan Transformasi Fiat-Shamir dimana semua tantangan acak yang dibuat oleh V diganti dengan hash transkrip hingga saat itu.
Ukuran buktinya semakin berkurang dengan memanfaatkan compact bukti produk dalam.
Argumen produk dalam dalam protokol memungkinkan untuk membuktikan pengetahuan tentang vektor Dan , yang produk dalamnya adalah dan komitmennya merupakan komitmen kedua vektor tersebut. Oleh karena itu kami dapat mengganti pengiriman ( ) dengan perpindahan ( ) dan eksekusi argumen produk dalam.
Lalu, alih-alih berbagi Dan , yang memiliki biaya komunikasi sebesar elemen, hanya argumen produk dalam yang ditransmisikan elemen. Secara total, peribahasa mengirimkan saja unsur golongan dan 5 unsur dalam
Kita dapat membuat satu bukti rentang beberapa nilai, namun hanya memerlukan biaya ruang tambahan sebesar untuk nilai tambahan , sebagai lawan dari faktor perkalian dari saat membuat bukti rentang independen.
Bukti rentang agregat menggunakan argumen produk dalam. Ini menggunakan ( ) unsur golongan dan 5 unsur dalam .
Lihat contoh bukti multi rentang
Bukti rentang tunggal
impor Data.Curve.Weierstrass.SECP256K1 (Fr)impor Bulletproofs.RangeProof yang memenuhi syarat sebagai RPimport Bulletproofs.Utils (commit)testSingleRangeProof :: Integer -> (Fr, Fr) -> IO BooltestSingleRangeProof upperBound (v, vBlinding) = jangan biarkan vCommit = komit v vBlinding -- Pepatah proofE <- runExceptT (RP.generateProof upperBound (v, vBlinding)) -- Pemverifikasi case proofE dari Left err -> panik (tunjukkan err) Right [email protected]{..} -> pure (RP.verifyProof upperBound vCommit proof )
Bukti multi rentang
impor Data.Curve.Weierstrass.SECP256K1 (Fr)impor Bulletproofs.MultiRangeProof yang memenuhi syarat sebagai MRPimport Bulletproofs.Utils (commit)testMultiRangeProof :: Integer -> [(Fr, Fr)] -> IO BooltestMultiRangeProof upperBound vsAndvBlindings = jangan biarkan vCommits = fmap ( komit yang belum selesai) vsAndvBlindings -- Pepatah proofE <- runExceptT (MRP.generateProof upperBound vsAndvBlindings) -- Pemverifikasi case proofE dari Left err -> panik (tunjukkan err) Right [email protected]{..} -> pure (MRP.verifyProof upperBound vCommits proof)
Perhatikan bahwa batas atas harus sedemikian rupa , Di mana juga pangkat 2. Implementasi ini menggunakan kurva elips secp256k1, kurva Koblitz, yang memiliki keamanan 128 bit. Lihat Contoh bukti rentang untuk detail lebih lanjut.
Rangkaian aritmatika pada suatu bidang dan variabel adalah graf asiklik berarah yang simpulnya disebut gerbang.
Rangkaian aritmatika dapat digambarkan sebagai daftar gerbang perkalian dengan kumpulan persamaan konsistensi linier yang menghubungkan masukan dan keluaran gerbang. Sirkuit apa pun yang digambarkan sebagai grafik asiklik dapat diubah secara efisien menjadi deskripsi alternatif ini.
Antipeluru menghadirkan protokol untuk menghasilkan argumen tanpa pengetahuan untuk rangkaian aritmatika menggunakan argumen hasil kali dalam, yang memungkinkan untuk mendapatkan bukti ukuran elemen dan memasukkan nilai yang dikomit sebagai input ke rangkaian aritmatika.
Dalam protokolnya, Prover membuktikan bahwa produk Hadamard dari Dan dan serangkaian batasan linier berlaku. Nilai masukan digunakan untuk menghasilkan bukti kemudian dikomit dan dibagikan dengan Verifikator.
import Data.Curve.Weierstrass.SECP256K1 (Fr)import Data.Field.Galois (rnd)import Bulletproofs.ArithmeticCircuitimport Bulletproofs.Utils (hadamard, commit)-- Contoh:-- 2 batasan linier (q = 2):-- aL [0] + aL[1] + aL[2] + aL[3] = v[0]-- aR[0] + aR[1] + aR[2] + aR[3] = v[1]---- 4 batasan perkalian (implisit) (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 nilai masukan (m = 2)arithCircuitExample :: ArithCircuit FrarithCircuitExample = ArithCircuit { bobot = GerbangBerat { 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]] } , komitmenBerat = [[1, 0] ,[0, 1]] , cs = [0, 0] }testArithCircuitProof :: ([Fr], [Fr]) -> ArithCircuit Fr -> IO BooltestArithCircuitProof (aL, aR) arithCircuit = jangan misalkan m = 2 -- Batasan perkalian misalkan aO = aL `hadamard` aR -- Batasan linier v0 = jumlah aL v1 = jumlah aR commitBlinders <- replikaM m rnd biarkan komitmen = zipDengan komit [v0, v1] commitBlinders biarkan arithWitness = ArithWitness { tugas = Tugas aL aR aO , komitmen = komitmen , commitBlinders = commitBlinders } bukti <- generateProof arithCircuit arithWitness murni (verifyProof komitmen bukti arithCircuit)
Lihat contoh rangkaian aritmatika untuk rincian lebih lanjut.
Referensi :
Bunz B., Bootle J., Boneh D., Poelstra A., Wuille P., Maxwell G. "Antipeluru: Bukti Singkat untuk Transaksi Rahasia dan Banyak Lagi". Stanford, UCL, Blockstream, 2017
Groth J. "Aljabar Linier dengan Argumen Pengetahuan Nol Sub-linier". Universitas College London, 2009
Bootle J., Cerully A., Chaidos P., Groth J, Petit C. "Argumen Pengetahuan Nol yang Efisien untuk Sirkuit Aritmatika dalam Pengaturan Log Diskrit". Universitas College London dan Universitas Oxford, 2016.
Notasi :
: Produk Hadamard
: Produk dalam
: Vektor
Ini adalah kode eksperimental yang dimaksudkan untuk proyek tingkat penelitian saja. Harap jangan menggunakan kode ini dalam produksi hingga kode tersebut matang secara signifikan.
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.