Naha mungkin pikeun ngahasilkeun nomer acak upami urang henteu percanten ka silih? Bagian 1

Héy Habr!

Dina artikel ieu kuring baris ngobrol ngeunaan generasi angka pseudo-acak ku pamilon anu teu percanten ka silih. Salaku bakal urang tingali di handap, palaksanaan hiji "ampir" generator alus cukup basajan, tapi hiji pohara alus hese.

Naha bakal perlu ngahasilkeun angka acak diantara pamilon anu teu percanten ka silih? Hiji wewengkon aplikasi nyaéta aplikasi desentralisasi. Contona, hiji aplikasi nu narima bet ti pamilon sarta boh ganda jumlah kalawan 49% probabiliti atawa nyokot jauh jeung 51% probabiliti ngan bakal bisa dipaké lamun unbiasedly bisa nampa jumlah acak. Mun hiji lawan bisa pangaruh hasil tina generator angka acak, komo rada ningkatkeun kasempetan pikeun nampa hiji payout dina aplikasi, anjeunna bakal gampang ngancurkeun eta.

Nalika urang mendesain protokol generasi nomer acak anu disebarkeun, urang hoyong éta ngagaduhan tilu sipat:

  1. Anjeunna kedah teu bias. Dina basa sejen, euweuh pamilon kudu sagala cara pangaruh hasil tina generator angka acak.

  2. Anjeunna kudu unpredictable. Dina basa sejen, euweuh pamilon kudu bisa ngaduga jumlah naon bakal dihasilkeun (atawa infer salah sahiji sipat na) saméméh éta dihasilkeun.

  3. Protokol kedah giat, nyaéta, tahan kana kanyataan yén perséntase tangtu pamilon pegatkeun sambungan tina jaringan atanapi ngahaja nyobian ngeureunkeun protokol.

Dina tulisan ieu urang bakal ningali dua pendekatan: RANDAO + VDF sareng pendekatan kode erasure. Dina bagian salajengna, urang bakal nalungtik sacara rinci pendekatan dumasar kana tanda tangan bangbarung.

Tapi ke heula, hayu urang nempo hiji algoritma basajan tur ilahar dipake anu giat, unpredictable, tapi bias.

RANDAO

RANDAO mangrupikeun pendekatan anu saderhana pisan sahingga sering dianggo pikeun ngahasilkeun acak. Sadaya pamilon jaringan mimitina sacara lokal milih nomer pseudorandom, teras unggal pamilon ngirimkeun hash tina nomer anu dipilih. Salajengna, pamilon giliran ngungkabkeun nomer anu dipilih sareng ngalaksanakeun operasi XOR dina nomer anu diungkabkeun, sareng hasil tina operasi ieu janten hasil tina protokol.

Léngkah nyebarkeun hashes sateuacan ngungkabkeun nomerna diperyogikeun supados panyerang teu tiasa milih nomerna saatos ningali nomer pamilon anu sanés. Ieu bakal ngidinan anjeunna pikeun ampir single-handedly nangtukeun kaluaran generator angka acak.

Salami protokol, pamilon kedah nyandak kaputusan umum (disebut konsensus) dua kali: iraha ngamimitian ngungkabkeun nomer anu dipilih, sareng ku kituna lirén nampi hashes, sareng nalika ngeureunkeun nampi nomer anu dipilih sareng ngitung acak anu hasilna. angka. Nyiptakeun kaputusan sapertos kitu antara pamilon anu henteu percanten ka unggal sanés sanés tugas anu gampang, sareng urang bakal uih deui dina tulisan anu bakal datang; dina tulisan ieu urang bakal nganggap yén algoritma konsensus sapertos kitu sayogi pikeun urang.

Mana sipat anu dijelaskeun di luhur anu gaduh RANDAO? Ieu unpredictable, boga vitalitas sarua salaku protokol konsensus kaayaan, tapi bias. Sacara husus, panyerang bisa niténan jaringan, sarta sanggeus pamilon séjén nembongkeun jumlah maranéhanana, manéhna bisa ngitung XOR maranéhanana, sarta mutuskeun naha atawa henteu nembongkeun nomer na pangaruh hasilna. Bari ieu nyegah panyerang ti single-handedly nangtukeun kaluaran generator angka acak, masih masihan anjeunna 1 saeutik pangaruh. Sareng upami panyerang ngontrol sababaraha pamilon, maka jumlah bit anu dikontrol bakal sami sareng jumlah pamilon anu dikadalikeun.

Naha mungkin pikeun ngahasilkeun nomer acak upami urang henteu percanten ka silih? Bagian 1

Pangaruh panyerang tiasa dikirangan pisan ku meryogikeun pamilon pikeun ngungkabkeun nomerna dina urutan. Teras panyerang bakal tiasa mangaruhan hasil ngan upami dibuka terakhir. Sanajan pangaruhna sacara signifikan kirang, algoritma masih bias.

RANDAO+VDF

Salah sahiji cara pikeun ngajantenkeun RANDAO henteu bias nyaéta kieu: saatos sadaya nomer diungkabkeun sareng XOR diitung, hasilna dilebetkeun kana input fungsi, anu peryogi waktos anu lami pisan pikeun ngitung, tapi ngamungkinkeun anjeun pikeun mariksa kabeneran itungan gancang pisan.

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

Pungsi ieu disebut Verifiable Delay Function, atawa VDF. Upami ngitung hasil ahir langkung lami tibatan tahap panyingkepan angka, maka panyerang moal tiasa ngaduga pangaruh nunjukkeun atanapi nyumputkeun nomerna, sareng ku kituna anjeunna bakal kaleungitan kasempetan pikeun mangaruhan hasilna.

Ngembangkeun VDF anu saé pisan sesah. Aya sababaraha terobosan anyar, misalna. ieu и ieu, nu ngajadikeun VDF leuwih praktis dina praktekna, sarta Ethereum 2.0 ngarencanakeun ngagunakeun RANDAO kalawan VDF salaku sumber angka acak dina jangka panjang. Sajaba ti kanyataan yén pendekatan ieu teu bisa diprediksi sarta unbiased, éta boga kauntungan tambahan pikeun jadi giat lamun sahenteuna dua pamilon sadia dina jaringan (asumsina protokol konsensus dipaké téh giat nalika kaayaan sajumlah leutik pamilon).

Tangtangan anu paling ageung tina pendekatan ieu nyaéta nyetél VDF sahingga bahkan pamilon anu gaduh hardware khusus anu mahal pisan moal tiasa ngitung VDF sateuacan akhir fase penemuan. Ideally, algoritma malah kudu boga margin kaamanan signifikan, sebutkeun 10x. Gambar di handap ieu nunjukkeun serangan ku aktor anu ngagaduhan ASIC khusus anu ngamungkinkeun anjeunna ngajalankeun VDF langkung gancang tibatan waktos anu diperyogikeun pikeun ngungkabkeun konfirmasi RANDAO. Pamilon sapertos kitu masih tiasa ngitung hasil ahir nganggo atanapi henteu nganggo nomerna, teras, dumasar kana itungan, pilih naha nunjukkeun atanapi henteu.

Naha mungkin pikeun ngahasilkeun nomer acak upami urang henteu percanten ka silih? Bagian 1

Pikeun kulawarga VDF didadarkeun di luhur, kinerja hiji ASIC dedicated tiasa 100+ kali leuwih luhur ti hardware konvensional. Jadi lamun fase panyingkepan lasts 10 detik, mangka VDF diitung dina ASIC misalna kudu nyokot leuwih ti 100 detik boga margin kaamanan 10x, sahingga VDF sarua diitung dina hardware komoditi kedah nyandak 100x 100 detik = ~3 jam.

Yayasan Ethereum ngarencanakeun pikeun ngabéréskeun masalah ieu ku nyiptakeun ASIC gratis anu sayogi pikeun umum. Sakali ieu kajantenan, sadaya protokol anu sanés ogé tiasa ngamangpaatkeun téknologi ieu, tapi dugi ka éta pendekatan RANDAO + VDF moal sabisa pikeun protokol anu henteu tiasa investasi dina ngembangkeun ASICs sorangan.

Loba artikel, video sareng inpo sejenna ngeunaan VDF geus dikumpulkeun dina situs ieu.

Urang ngagunakeun kode erasure

Dina bagian ieu, urang bakal ningali protokol generasi angka acak anu ngagunakeun ngahapus kodeu. Éta tiasa toleran dugi ka ⅓ panyerang bari tetep giat, sareng ngamungkinkeun dugi ka ⅔ panyerang aya sateuacan aranjeunna tiasa ngaduga atanapi mangaruhan hasilna.

Gagasan utama protokol nyaéta kieu. Pikeun kesederhanaan, anggap aya persis 100 pamilon. Hayu urang ogé nganggap yén sadaya pamilon sacara lokal ngagaduhan sababaraha konci pribadi, sareng konci umum sadaya pamilon dipikanyaho ku sadaya pamilon:

  1. Masing-masing pamilon sacara lokal ngahasilkeun senar anu panjang, ngabagi kana 67 bagian, nyiptakeun kode erasure pikeun kéngingkeun 100 saham supados 67 cekap pikeun pulih senar, napelkeun masing-masing 100 saham ka salah sahiji pamilon, sareng énkripsi aranjeunna nganggo. konci publik pamilon sarua urang. Sadaya saham anu disandikeun teras diterbitkeun.

  2. Pamilon ngagunakeun sababaraha jenis konsensus pikeun ngahontal kasapukan dina susunan disandi ti 67 pamilon husus.

  3. Saatos konsensus kahontal, unggal pamilon nyandak saham anu disandikeun dina unggal 67 sét énkripsi sareng konci umumna, ngadekrip sadaya saham sapertos kitu, sareng nyebarkeun sadaya saham anu didekripsi.

  4. Sakali 67 pamilon geus réngsé hambalan (3), sadaya susunan sapuk bisa sagemblengna decoded na rekonstruksi alatan sipat kode erasure, sarta jumlah final bisa diala salaku XOR tina baris awal nu pamilon dimimitian ku dina (1) .

Naha mungkin pikeun ngahasilkeun nomer acak upami urang henteu percanten ka silih? Bagian 1

Protokol ieu tiasa ditingalikeun teu bias sareng teu kaduga. Jumlah acak nu dihasilkeun ditangtukeun sanggeus konsensus kahontal, tapi teu dipikawanoh ku saha nepi ka ⅔ pamilon nga-decode bagian énkripsi kalawan konci publik maranéhanana. Ku kituna, jumlah acak ditangtukeun saméméh informasi cukup pikeun ngarekonstruksikeun eta diterbitkeun.

Naon anu lumangsung lamun dina hambalan (1) salah sahiji pamilon dikirim biasa disandikeun ka pamilon séjén anu teu kode erasure bener sababaraha string? Tanpa parobahan tambahan, pamilon béda boh moal bisa cageur senar pisan, atawa maranéhna bakal cageur senar béda, nu bakal ngakibatkeun pamilon béda narima nomer acak béda. Pikeun nyegah ieu, anjeun tiasa ngalakukeun ieu: unggal pamilon, salian ti saham disandikeun, ogé ngitung Tangkal Merkla kabéh biasa sapertos, sarta ngirimkeun unggal pamilon duanana dibagikeun disandikeun sorangan jeung akar tangkal merkle, sarta buktina tina citakan tina dibagikeun dina tangkal merkle. Dina konsensus dina hambalan (2), pamilon lajeng teu ngan satuju kana susunan susunan, tapi dina susunan akar husus tangkal sapertos (lamun sababaraha pamilon deviated tina protokol, sarta dikirim akar tangkal merkle béda pikeun pamilon béda, sareng dua akar sapertos anu dipidangkeun nalika konsensus, barisanna henteu kalebet dina set hasil). Salaku hasil tina konsensus, urang bakal boga 67 garis disandikeun jeung akar pakait tina tangkal merkle sahingga aya sahanteuna 67 pamilon (teu merta leuwih sarua anu ngajukeun garis pakait), anu pikeun tiap tina 67 garis boga. pesen kalawan babagi tina kode erasure, sarta bukti lumangsungna dibagikeun maranéhanana dina tangkal pakait layu.

Nalika dina hambalan (4) pamilon deciphers 67 ketukan pikeun string tangtu jeung nyoba ngarekonstruksikeun string aslina ti aranjeunna, salah sahiji pilihan mungkin:

  1. Senar ieu disimpen deui, sarta lamun éta lajeng erasure-disandikeun deui, sarta tangkal Merkle diitung keur biasa diitung lokal, akar coincides jeung hiji nu konsensus ieu ngahontal.

  2. Barisna dibalikeun, tapi akar anu diitung sacara lokal henteu cocog sareng anu dihontal konsensus.

  3. Baris teu dibalikeun deui.

Gampang nunjukkeun yén lamun pilihan (1) lumangsung pikeun sahanteuna hiji pamilon di luhur, lajeng pilihan (1) lumangsung pikeun sakabéh pamilon, sarta sabalikna, lamun pilihan (2) atawa (3) lumangsung pikeun sahanteuna hiji pamilon, teras. pikeun sakabéh pilihan pamilon (2) atawa (3) bakal kajadian. Ku kituna, pikeun unggal baris dina set, boh sakabeh pamilon bakal hasil cageur, atawa sakabéh pamilon bakal gagal cageur deui. Jumlah acak anu dihasilkeun lajeng XOR hijina baris nu pamilon éta bisa cageur.

Tanda tangan bangbarung

Pendekatan anu sanés pikeun acak nyaéta ngagunakeun anu disebut tanda tangan ambang BLS. A generator angka acak dumasar kana tanda tangan bangbarung boga jaminan persis sarua salaku algoritma dumasar-kode erasure ditétélakeun di luhur, tapi boga angka asimtotik nyata handap pesen dikirim ngaliwatan jaringan pikeun tiap angka dihasilkeun.

Tanda tangan BLS mangrupikeun desain anu ngamungkinkeun sababaraha pamilon nyiptakeun hiji tanda tangan umum pikeun pesen. Tanda tangan ieu sering dianggo pikeun ngahémat rohangan sareng bandwidth ku henteu meryogikeun sababaraha tanda tangan pikeun dikirimkeun. 

Aplikasi umum pikeun tanda tangan BLS dina protokol blockchain, salian ti ngahasilkeun nomer acak, nyaéta tanda blokir dina protokol BFT. Sebutkeun 100 pamilon nyieun blok, sarta blok dianggap final lamun 67 di antarana asup. Éta sadayana tiasa ngalebetkeun bagian tina tandatangan BLS sareng nganggo sababaraha algoritma konsensus pikeun satuju kana 67 di antarana teras ngahijikeun kana hiji tandatangan BLS. Sakur 67 (atawa leuwih) bagian bisa dipaké pikeun nyieun tanda tangan ahir, nu bakal gumantung kana nu 67 tanda tangan digabungkeun jeung ku kituna bisa rupa-rupa, sanajan pilihan béda ku 67 pamilon bakal nyieun tanda tangan béda , sagala tanda tangan sapertos bakal valid. tanda tangan pikeun blok. Sésana pamilon ngan ukur kedah nampi sareng pariksa ngan ukur hiji tanda tangan per blok, tibatan 67, dina jaringan, anu sacara signifikan ngirangan beban dina jaringan.

Tétéla yén upami konci pribadi anu dianggo ku pamilon dibangkitkeun ku cara anu tangtu, maka henteu masalah anu 67 tanda tangan (atanapi langkung, tapi henteu kirang) dihijikeun, tanda tangan anu hasilna bakal sami. Ieu tiasa dianggo salaku sumber acak: pamilon mimiti satuju kana sababaraha pesen anu bakal ditandatanganan (ieu tiasa janten kaluaran RANDAO atanapi ngan ukur hash tina blok terakhir, éta henteu masalah salami éta robih unggal waktos. sareng konsisten) sareng nyiptakeun tandatangan BLS pikeun éta. Hasil tina generasi bakal unpredictable nepi ka 67 pamilon nyadiakeun bagian maranéhanana, sarta sanggeus éta kaluaran geus predetermined jeung teu bisa gumantung kana lampah pamilon nu mana wae nu.

Pendekatan ka randomness ieu tiasa dilaksanakeun salami sahenteuna ⅔ pamilon online duanana nuturkeun protokol, sareng henteu bias sareng teu bisa diprediksi salami sahenteuna ⅓ pamilon nuturkeun protokol. Penting pikeun dicatet yén panyerang anu ngawasa langkung ti ⅓ tapi kirang ti ⅔ pamilon tiasa ngeureunkeun protokol, tapi teu tiasa ngaduga atanapi mangaruhan kaluaranna.

Tanda tangan bangbarung sorangan mangrupikeun topik anu pikaresepeun pisan. Dina bagian kadua artikel, urang bakal nganalisis di jéntré kumaha sabab tiasa dianggo, sarta kumaha kahayang perlu pikeun ngahasilkeun konci pamilon ambéh tanda tangan bangbarung bisa dipaké salaku generator angka acak.

dina kacindekan

Tulisan ieu mangrupikeun anu munggaran dina séri tulisan blog téknis DEUKEUT. NEAR mangrupikeun protokol blockchain sareng platform pikeun ngembangkeun aplikasi desentralisasi kalayan tekenan kana betah pangwangunan sareng betah dianggo pikeun pangguna akhir.

Kodeu protokol dibuka, palaksanaan kami ditulis dina Rust, éta tiasa dipendakan di dieu.

Anjeun tiasa ningali naon pamekaran pikeun NEAR sareng ékspérimén dina IDE online di dieu.

Anjeun tiasa nuturkeun sadaya warta dina basa Rusia di grup telegram jeung grup dina VKontakte, jeung dina basa Inggris dina resmi twitter.

Pendak deui engké!

sumber: www.habr.com

Tambahkeun komentar