Iku bisa kanggo generate nomer acak yen kita ora dipercaya saben liyane? Bagean 1

Hey Habr!

Ing artikel iki aku bakal ngomong babagan generasi nomer pseudo-acak dening peserta sing ora ngandel. Kaya sing bakal kita deleng ing ngisor iki, ngleksanakake generator sing "meh" cukup prasaja, nanging sing apik banget angel.

Yagene kudu ngasilake nomer acak ing antarane peserta sing ora percaya siji liyane? Salah sawijining area aplikasi yaiku aplikasi desentralisasi. Contone, aplikasi sing nampa totohan saka peserta lan salah siji pindho jumlah karo 49% kemungkinan utawa njupuk adoh karo 51% kamungkinan mung bisa yen unbiasedly bisa nampa nomer acak. Yen panyerang bisa pengaruhe asil saka nomer generator acak, lan malah rada nambah kasempatan kanggo mbayari ing aplikasi, kang bakal gampang numpes.

Nalika kita ngrancang protokol generasi nomer acak sing disebarake, kita pengin duwe telung sifat:

  1. Dheweke kudu ora bias. Ing tembung liyane, ora peserta kudu ing sembarang cara mengaruhi asil saka generator nomer acak.

  2. Dheweke mesthi ora bisa ditebak. Ing tembung liya, ora ana peserta sing bisa prédhiksi nomer apa sing bakal diasilake (utawa nyimpulake sifat apa wae) sadurunge digawe.

  3. Protokol kasebut kudu sregep, yaiku, tahan kasunyatan manawa persentase peserta tartamtu medhot saka jaringan utawa kanthi sengaja nyoba kanggo mungkasi protokol kasebut.

Ing artikel iki kita bakal ndeleng rong pendekatan: RANDAO + VDF lan pendekatan kode erasure. Ing bagean sabanjure, kita bakal nliti kanthi rinci pendekatan adhedhasar tandha ambang.

Nanging pisanan, ayo goleki algoritma sing gampang lan umum digunakake sing sregep, ora bisa ditebak, nanging bias.

RANDAO

RANDAO minangka pendekatan sing prasaja banget lan mulane cukup umum digunakake kanggo ngasilake acak. Kabeh peserta jaringan pisanan milih nomer pseudorandom, banjur saben peserta ngirim hash saka nomer sing dipilih. Sabanjure, para peserta dadi giliran mbukak nomer sing dipilih lan nindakake operasi XOR ing nomer sing dicethakaké, lan asil saka operasi iki dadi asil saka protokol.

Langkah nerbitake hash sadurunge mbukak nomer kasebut perlu supaya panyerang ora bisa milih nomere sawise ndeleng nomer peserta liyane. Iki bakal ngidini wong kanggo sakbenere siji-handedly nemtokake output saka generator nomer acak.

Sajrone protokol kasebut, para peserta kudu nggawe keputusan umum (sing diarani konsensus) kaping pindho: nalika miwiti mbukak nomer sing dipilih, mula mandheg nampa hash, lan nalika mandheg nampa nomer sing dipilih lan ngitung asil acak. nomer. Nggawe keputusan kasebut ing antarane peserta sing ora ngandelake siji liyane ora dadi tugas sing gampang, lan kita bakal bali maneh ing artikel sabanjure; ing artikel iki kita bakal nganggep yen algoritma konsensus kasebut kasedhiya kanggo kita.

Endi saka sifat sing wis kasebut ing ndhuwur sing diduweni RANDAO? Ora bisa ditebak, nduweni vitalitas sing padha karo protokol konsensus sing ndasari, nanging bias. Khusus, panyerang bisa mirsani jaringan, lan sawise peserta liyane mbukak nomer, kang bisa ngetung XOR, lan mutusaké apa utawa ora kanggo mbukak nomer kanggo pengaruhe asil. Nalika iki ngalangi panyerang saka siji-handedly nentokake output generator nomer acak, isih menehi 1 pengaruhe. Lan yen panyerang ngontrol sawetara peserta, jumlah bit sing dikontrol bakal padha karo jumlah peserta sing dikontrol.

Iku bisa kanggo generate nomer acak yen kita ora dipercaya saben liyane? Bagean 1

Pengaruh panyerang bisa dikurangi banget kanthi mbutuhake peserta mbukak nomer kasebut kanthi urutan. Banjur panyerang bakal bisa mengaruhi asil mung yen dibukak pungkasan. Nalika pengaruhe kurang, algoritma isih bias.

RANDAO+VDF

Salah siji cara kanggo nggawe RANDAO ora bias yaiku: sawise kabeh nomer dicethakaké lan XOR diwilang, asil kasebut disedhiyakake menyang input fungsi, sing mbutuhake wektu sing suwe kanggo ngetung, nanging ngidini sampeyan mriksa bener pitungan cepet banget.

(vdf_output, vdf_proof) = VDF_compute(input) // это очень медленно
correct = VDF_verify(input, vdf_output, vdf_proof) // это очень быстро

Fungsi iki diarani Verifiable Delay Function, utawa VDF. Yen ngetung asil pungkasan luwih suwe tinimbang tahap pambocoran nomer, mula panyerang ora bakal bisa prédhiksi efek nuduhake utawa ndhelikake nomer kasebut, mula dheweke bakal kelangan kesempatan kanggo pengaruhe asil kasebut.

Ngembangake VDF sing apik banget angel. Ana sawetara terobosan bubar, f.eks. iki и iki, kang digawe VDF luwih praktis ing laku, lan Ethereum 2.0 rencana nggunakake RANDAO karo VDF minangka sumber nomer acak ing long term. Saliyane kasunyatan manawa pendekatan iki ora bisa ditebak lan ora bias, entuk manfaat tambahan kanggo bisa urip yen paling ora rong peserta kasedhiya ing jaringan (anggap protokol konsensus sing digunakake bisa ditindakake nalika nangani jumlah peserta sing sithik).

Tantangan paling gedhe saka pendekatan iki yaiku nyiyapake VDF supaya peserta kanthi hardware khusus sing larang banget ora bakal bisa ngetung VDF sadurunge pungkasan fase panemuan. Saenipun, algoritma kasebut kudu duwe wates safety sing signifikan, ujare 10x. Tokoh ing ngisor iki nuduhake serangan dening aktor sing duwe ASIC specialized sing ngidini kanggo mbukak VDF luwih cepet saka wektu diparengake kanggo mbukak konfirmasi RANDAO. Peserta kuwi isih bisa ngetung asil pungkasan nggunakake utawa ora nggunakake nomer, banjur, adhedhasar pitungan, milih arep nuduhake utawa ora.

Iku bisa kanggo generate nomer acak yen kita ora dipercaya saben liyane? Bagean 1

Kanggo kulawarga VDF sing kasebut ing ndhuwur, kinerja ASIC khusus bisa 100+ kaping luwih dhuwur tinimbang hardware konvensional. Dadi yen fase panyebaran luwih 10 detik, banjur VDF sing diwilang ing ASIC kasebut kudu njupuk luwih saka 100 detik kanggo duwe wates safety 10x, lan kanthi mangkono VDF sing padha diwilang ing hardware komoditas kudu njupuk 100x 100 detik = ~3 jam.

Yayasan Ethereum rencana kanggo ngatasi masalah iki kanthi nggawe ASIC gratis sing kasedhiya kanggo umum. Sawise kedadeyan kasebut, kabeh protokol liyane uga bisa njupuk kauntungan saka teknologi iki, nanging nganti saiki pendekatan RANDAO + VDF ora bakal bisa digunakake kanggo protokol sing ora bisa nandur modal kanggo ngembangake ASIC dhewe.

Akeh artikel, video lan informasi liyane babagan VDF wis diklumpukake ing situs iki.

Kita nggunakake kode erasure

Ing bagean iki, kita bakal katon ing protokol generasi nomer acak sing nggunakake mbusak kode. Bisa ngidinke nganti ⅓ penyerang nalika tetep sregep, lan ngidini nganti ⅔ panyerang ana sadurunge bisa prédhiksi utawa mengaruhi asil.

Ide utama protokol kasebut kaya ing ngisor iki. Kanggo gamblang, ayo nganggep yen ana persis 100 peserta. Ayo kita uga nganggep yen kabeh peserta lokal duwe sawetara kunci pribadi, lan kunci umum kabeh peserta dikenal kabeh peserta:

  1. Saben peserta sacara lokal nggawe senar sing dawa, dibagi dadi 67 bagean, nggawe kode erasure kanggo entuk 100 saham supaya 67 cukup kanggo mbalekake senar kasebut, menehi saben 100 saham menyang salah siji peserta, lan enkripsi nganggo kunci umum peserta sing padha. Kabeh saham sing dienkode banjur diterbitake.

  2. Peserta nggunakake sawetara jinis konsensus kanggo nggayuh persetujuan babagan set kode saka 67 peserta tartamtu.

  3. Sawise konsensus tekan, saben peserta njupuk saham sing dienkode ing saben 67 set sing dienkripsi nganggo kunci publik, dekripsi kabeh saham kasebut, lan nerbitake kabeh saham sing didekripsi kasebut.

  4. Sawise 67 peserta wis ngrampungake langkah (3), kabeh set sing disepakati bisa didekode lan direkonstruksi kanthi lengkap amarga sifat kode penghapusan, lan nomer pungkasan bisa dipikolehi minangka XOR saka baris awal sing diwiwiti peserta ing (1) .

Iku bisa kanggo generate nomer acak yen kita ora dipercaya saben liyane? Bagean 1

Protokol iki bisa ditampilake ora bias lan ora bisa ditebak. Nomer acak sing diasilake ditemtokake sawise entuk konsensus, nanging ora dingerteni sapa wae nganti ⅔ saka peserta decode bagean sing dienkripsi nganggo kunci umum. Mangkono, nomer acak ditemtokake sadurunge informasi sing cukup kanggo mbangun maneh diterbitake.

Apa sing kedadeyan yen ing langkah (1) salah sijine peserta ngirim saham sing dienkode menyang peserta liyane sing dudu kode mbusak sing bener kanggo sawetara senar? Tanpa owah-owahan tambahan, peserta sing beda bakal ora bisa mbalekake senar ing kabeh, utawa bakal mbalekake senar sing beda, sing bakal nyebabake peserta sing beda nampa nomer acak sing beda. Kanggo nyegah iki, sampeyan bisa nindakake ing ngisor iki: saben peserta, saliyane kanggo saham sing dienkode, uga ngetung wit Merkla kabeh Enggo bareng kuwi, lan ngirim saben peserta loro nuduhake dienkode dhewe lan ROOT saka wit merkle, lan bukti Gawan nuduhake ing wit merkle. Ing konsensus ing langkah (2), peserta banjur ora mung setuju ing pesawat saka mranata, nanging ing pesawat saka werna tartamtu saka wit kuwi (yen sawetara peserta nyimpang saka protokol, lan ngirim werna wit merkle beda kanggo peserta beda; lan loro werna kasebut ditampilake sajrone konsensus, baris kasebut ora kalebu ing set asil). Minangka asil saka konsensus, kita bakal duwe 67 baris dienkode lan werna sing cocog saka wit merkle supaya ana paling sethithik 67 peserta (ora kudu padha sing ngusulake baris sing cocog), sing kanggo saben 67 baris duwe. pesen karo nuduhake kode erasure, lan bukti kedadeyan sing nuduhake ing wit cocog burem.

Nalika ing langkah (4) peserta deciphers 67 ngalahaken kanggo senar tartamtu lan nyoba kanggo reconstruct senar asli saka wong-wong mau, salah siji opsi bisa:

  1. Senar dibalèkaké, lan yen banjur erasure-encoded maneh, lan wit Merkle diwilang kanggo Enggo bareng diwilang lokal, ROOT pas karo siji kang konsensus tekan.

  2. Baris kasebut dibalekake, nanging oyod sing diwilang sacara lokal ora cocog karo sing wis entuk konsensus.

  3. Baris ora dibalekake.

Gampang kanggo nuduhake yen opsi (1) kedadeyan kanggo paling ora siji peserta ing ndhuwur, banjur opsi (1) kedadeyan kanggo kabeh peserta, lan kosok balene, yen opsi (2) utawa (3) kedadeyan kanggo paling siji peserta, banjur kanggo kabeh pilihan peserta (2) utawa (3) bakal kelakon. Dadi, kanggo saben baris ing set kasebut, kabeh peserta bakal kasil mbalekake, utawa kabeh peserta bakal gagal mbalekake. Nomer acak asil banjur XOR mung larik sing peserta bisa mbalekake.

Tandha ambang

Pendekatan liyane kanggo acak yaiku nggunakake apa sing diarani tandha ambang BLS. Generator nomer acak adhedhasar teken ambang duwe jaminan sing padha karo algoritma basis kode erasure sing diterangake ing ndhuwur, nanging nduweni jumlah pesen asimtotik sing luwih murah sing dikirim liwat jaringan kanggo saben nomer sing digawe.

Tandha BLS minangka desain sing ngidini sawetara peserta nggawe siji tandha umum kanggo pesen. Tandha iki asring digunakake kanggo ngirit ruang lan bandwidth kanthi ora mbutuhake pirang-pirang teken supaya dikirim. 

Aplikasi umum kanggo tandha BLS ing protokol pamblokiran, saliyane ngasilake nomer acak, yaiku tandha blokir ing protokol BFT. Contone, 100 peserta nggawe blok, lan blok dianggep final yen 67 wong mlebu. Kabeh mau bisa ngirim bagean saka tandha BLS lan nggunakake sawetara algoritma konsensus kanggo setuju karo 67 lan banjur gabung dadi siji tandha BLS. Sembarang 67 (utawa luwih) bagean bisa digunakake kanggo nggawe teken final, kang bakal gumantung ing 67 teken digabungake lan mulane bisa beda-beda, sanajan pilihan beda dening 67 peserta bakal nggawe teken beda , sembarang teken kuwi bakal bener teken kanggo pemblokiran. Peserta sing isih ana banjur mung kudu nampa lan verifikasi mung siji teken saben blok, tinimbang 67, liwat jaringan, sing nyuda beban ing jaringan kanthi signifikan.

Pranyata yen kunci pribadi sing digunakake peserta digawe kanthi cara tartamtu, mula ora ana 67 teken (utawa luwih, nanging ora kurang) dikumpulake, teken asil bakal padha. Iki bisa digunakake minangka sumber acak: peserta pisanan setuju karo sawetara pesen sing bakal ditandatangani (iki bisa dadi output RANDAO utawa mung hash saka blok pungkasan, ora masalah yen owah-owahan saben wektu. lan konsisten) lan nggawe teken BLS kanggo. Asil saka generasi bakal ranyono nganti 67 peserta nyedhiyani bagean, lan sawise sing output wis predetermined lan ora bisa gumantung ing tumindak peserta sembarang.

Pendekatan randomness iki bisa ditindakake yen paling ora ⅔ saka peserta online loro-lorone ngetutake protokol, lan ora bias lan ora bisa diprediksi anggere paling ora ⅓ peserta ngetutake protokol kasebut. Wigati dimangerteni manawa panyerang sing ngontrol luwih saka ⅓ nanging kurang saka ⅔ peserta bisa mungkasi protokol kasebut, nanging ora bisa prédhiksi utawa mengaruhi output.

Tandha ambang dhewe minangka topik sing menarik banget. Ing bagean liya saka artikel, kita bakal njelasno rinci carane padha bisa, lan carane persis iku perlu kanggo generate tombol peserta supaya teken ambang bisa digunakake minangka generator nomer acak.

Ing kesimpulan

Artikel iki minangka sing pisanan saka seri artikel blog teknis NEAR. NEAR minangka protokol lan platform pamblokiran kanggo ngembangake aplikasi desentralisasi kanthi penekanan kanggo gampang pangembangan lan gampang digunakake kanggo pangguna pungkasan.

Kode protokol mbukak, implementasine kita ditulis ing Rust, bisa ditemokake kene.

Sampeyan bisa ndeleng apa pembangunan kanggo NEAR katon lan eksprimen ing IDE online kene.

Sampeyan bisa tindakake kabeh warta ing Russian ing grup telegram lan ing grup ing VKontakte, lan ing basa Inggris ing resmi twitter.

О скорых встреч!

Source: www.habr.com

Add a comment