Hej, Habr!
I den hÀr artikeln kommer jag att berÀtta om generering av pseudo-slumptal bland deltagare som inte litar pÄ varandra. Som vi kommer att se nedan Àr det ganska enkelt att implementera en "nÀstan" bra generator, men en riktigt bra Àr svÄr.
Varför behövs det ens att generera slumptal för deltagare som inte litar pÄ varandra? Ett av anvÀndningsomrÄdena Àr decentraliserade applikationer. Till exempel kommer en applikation som tar emot ett bud frÄn en deltagare och antingen dubblar beloppet med sannolikheten 49% eller tar 51% bara att fungera om den kan fÄ ett slumptal opartiskt. Om en illvillig aktör kan pÄverka resultatet av slumptalsgeneratorn, Àven om det Àr minimalt, för att öka sina chanser att fÄ en utbetalning i applikationen, kan han lÀtt tömma den.
NÀr vi utvecklar ett distribuerat protokoll för generering av slumptal vill vi att det ska ha tre egenskaper:
Det mÄste vara opartiskt. Med andra ord fÄr ingen deltagare pÄ nÄgot sÀtt pÄverka resultatet av slumptalsgeneratorn.
Det mÄste vara oförutsÀgbart. Med andra ord fÄr ingen deltagare ha möjlighet att förutsÀga vilket tal som kommer att genereras (eller dra nÄgra av dess egenskaper) innan det har genererats.
Protokollet mÄste vara livskraftigt, det vill sÀga motstÄndskraftigt mot att en viss procentandel av deltagarna kopplar frÄn nÀtverket eller avsiktligt försöker stoppa protokollet.
I den hÀr artikeln kommer vi att titta pÄ tvÄ tillvÀgagÄngssÀtt: RANDAO + VDF och ett tillvÀgagÄngssÀtt baserat pÄ utjÀmnande koder. I nÀsta del kommer vi att gÄ igenom tillvÀgagÄngssÀttet som bygger pÄ tröskel-signaturer.
Men först lÄt oss gÄ igenom en enkel och ofta anvÀnd algoritm som Àr livskraftig, oförutsÀgbar men partisk.
RANDAO
RANDAO Àr en vÀldigt enkel och dÀrmed ganska ofta anvÀnd metod för att fÄ slumpmÀssighet. Alla deltagare i nÀtverket vÀljer först ett pseudo-slumptal lokalt, sedan skickar varje deltagare hash av det valda talet. DÀrefter avslöjar deltagarna turas om sina valda tal och utför en XOR-operation pÄ de avslöjade talen, och resultatet av denna operation blir resultatet av protokollet.
Steget med att publicera hash innan man avslöjar siffrorna Àr nödvÀndigt för att förhindra att en angripare vÀljer sitt nummer efter att ha sett siffrorna frÄn andra deltagare. Detta skulle faktiskt ge dem möjlighet att ensamt bestÀmma resultatet av den slumpmÀssiga talgeneratorn.
Under protokollet mÄste deltagarna komma överens tvÄ gÄnger (sÄ kallad konsensus): nÀr man ska avslöja de valda siffrorna och dÀrmed sluta ta emot hash, och nÀr man ska avsluta mottagandet av valda siffror och berÀkna det resulterande slumpmÀssiga numret. Att fatta sÄdana beslut mellan deltagare som inte litar pÄ varandra Àr en sjÀlvklar utmaning, och vi kommer att Äterkomma till det i framtida artiklar. I den hÀr artikeln förutsÀtter vi att en sÄdan konsensusalgoritm Àr tillgÀnglig för oss.
Vilka av de egenskaper vi beskrev ovan har RANDAO? Den Àr oförutsÀgbar, har samma livskraft som den underliggande konsensusprotokollet, men Àr partisk. SÀrskilt en angripare kan observera nÀtverket, och efter att andra deltagare har avslöjat sina siffror kan de berÀkna deras XOR och avgöra om de ska avslöja sitt nummer eller inte, för att pÄverka resultatet. Medan detta inte tillÄter angriparen att ensamt bestÀmma resultatet av den slumpmÀssiga talgeneratorn, ger det dem fortfarande 1 bits pÄverkan. Om angriparna kontrollerar flera deltagare kommer antalet bitar de kontrollerar att motsvara antalet deltagare under deras kontroll.

Angriparnas pĂ„verkan kan minskas avsevĂ€rt om deltagarna tvingas avslöja sina siffror i ordning. DĂ„ kan angriparen endast pĂ„verka resultatet om de avslöjar sist. Ăven om pĂ„verkan Ă€r avsevĂ€rt mindre Ă€r algoritmen fortfarande partisk.
RANDAO + VDF
Ett av sÀtten att göra RANDAO opartiskt Àr att efter att alla nummer har avslöjats och XOR har berÀknats, mata in resultatet i en funktion som tar mycket lÄng tid att berÀkna men möjliggör snabb verifiering av berÀkningen.
(vdf_output, vdf_proof) = VDF_compute(input) // detta Àr mycket lÄngsamt
correct = VDF_verify(input, vdf_output, vdf_proof) // detta Àr mycket snabbtDenna funktion kallas Verifiable Delay Function, eller VDF. Om berÀkningen av det slutliga resultatet tar lÀngre tid Àn avslöjande av siffrorna, kan en angripare inte förutsÀga effekten av att visa eller dölja sin siffra, och dÀrmed förlorar hen möjligheten att pÄverka resultatet.
Att utveckla bra VDF:er Àr extremt svÄrt. PÄ senare tid har det gjorts flera genombrott, till exempel och vilka har gjort VDF:er mer praktiskt tillÀmpbara, och Ethereum 2.0 planerar pÄ lÄng sikt att anvÀnda RANDAO med VDF som kÀlla för slumpmÀssiga siffror. Förutom att denna metod Àr oförutsÀgbar och objektiv, har den den extra fördelen att den Àr livskraftig, om minst tvÄ deltagare Àr tillgÀngliga i nÀtverket (förutsatt att den anvÀnda konsensusprotokollet Àr livskraftigt vid arbete med sÄ fÄ deltagare).
Den största svÄrigheten med denna metod ligger i att stÀlla in VDF sÄ att inte ens en deltagare med mycket dyr specialiserad utrustning kan berÀkna VDF innan avslöjandefasen Àr över. I idealfallet bör algoritmen ha en betydande sÀkerhetsmarginal, lÄt oss sÀga 10x. I bilden nedan visas en attack frÄn en deltagare med specialiserad ASIC som möjliggör snabbare körning av VDF Àn den tid som avsatts för att avslöja bekrÀftelsen av RANDAO. En sÄdan deltagare kan fortfarande berÀkna det slutliga resultatet med och utan sin siffra, och baserat pÄ berÀkningarna vÀlja att visa den eller inte.

För den ovan nÀmnda familjen av VDF:er kan prestandan hos specialiserad ASIC vara över 100 gÄnger högre Àn hos vanlig utrustning. Om avslöjandefasen varar i 10 sekunder, bör VDF:n berÀknad pÄ en sÄdan ASIC ta mer Àn 100 sekunder för att ha en sÀkerhetsmarginal pÄ 10 gÄnger, och dÀrmed bör samma VDF berÀknad pÄ vanlig utrustning ta 100 x 100 sekunder = ~ 3 timmar.
Ethereum Foundation planerar att lösa detta problem genom att skapa sina egna offentliga gratis ASICs. SÄ snart detta Àr klart, kan alla andra protokoll ocksÄ dra nytta av denna teknik, men fram till dess kommer RANDAO + VDF-ansatsen inte att vara lika livskraftig för protokoll som inte kan investera i utvecklingen av sina egna ASICs.
MÄnga artiklar, videor och annan information om VDF har samlats pÄ .
AnvÀnder utplÄningskoder
I det hĂ€r avsnittet kommer vi att granska protokollet för generering av slumpmĂ€ssiga nummer, som anvĂ€nder . Det kan tĂ„la upp till â skadliga aktörer och tolererar existensen av upp till â skadliga aktörer innan de kan förutsĂ€ga eller pĂ„verka resultatet.
Den grundlÀggande idén med protokollet Àr följande. För enkelhetens skull lÄt oss anta att det finns exakt 100 deltagare. LÄt oss ocksÄ anta att alla deltagare lokalt har en viss privat nyckel och att de offentliga nycklarna för alla deltagare Àr kÀnda av alla deltagare:
Varje deltagare lokaliserar en lÄng strÀng, delar upp den i 67 delar, skapar utplÄningskoder för att fÄ 100 andelar, sÄdana att vilka som helst 67 Àr tillrÀckliga för att ÄterstÀlla strÀngen, tilldelar varje av de 100 andelarna till en av deltagarna och krypterar dem med hjÀlp av den samme deltagarens offentliga nyckel. DÀrefter publiceras alla krypterade andelar.
Deltagarna anvÀnder en form av konsensus för att nÄ enighet om de kodade uppsÀttningarna frÄn specifika 67 deltagare.
SÄ snart konsensus har nÄtts, tar varje deltagare de kodade andelarna i varje av de 67 uppsÀttningarna, krypterade med deras offentliga nyckel, dekrypterar alla sÄdana andelar och publicerar alla sÄdana dekrypterade andelar.
NÀr 67 deltagare har genomfört steg (3) kan alla överenskomna uppsÀttningar fullstÀndigt dekrypteras och ÄterstÀllas pÄ grund av egenskaperna hos utplÄningskoder, och det slutliga numret kan erhÄllas som XOR av de ursprungliga strÀngarna som deltagarna började med i (1).

Det kan visas att denna protokoll Ă€r opartisk och oförutsĂ€gbar. Det resulterande slumptalet definieras efter att konsensus har nĂ„tts, men ingen vet det förrĂ€n â av deltagarna dekrypterar de delar som Ă€r krypterade med deras offentliga nyckel. PĂ„ sĂ„ sĂ€tt definieras slumptalet tidigare Ă€n informationen som krĂ€vs för att Ă„terskapa det publiceras.
Vad hÀnder om ett av deltagarna vid steg (1) skickade kodade andelar som inte Àr en korrekt suddande kod för en viss strÀng till de andra deltagarna? Utan ytterligare förÀndringar kan olika deltagare antingen inte alls Äterskapa strÀngen, eller sÄ Äterskapar de olika strÀngar, vilket leder till att olika deltagare fÄr olika slumptal. För att förhindra detta kan följande göras: varje deltagare, utöver de kodade andelarna, berÀknar ocksÄ alla sÄdana andelar, och skickar bÄde den kodade andelen och roten av Merkletreet till varje deltagare, samt beviset pÄ inkluderingen av andelen i Merkletreet. Vid konsensus i steg (2) kommer deltagarna dÄ inte bara att enas om en mÀngd uppsÀttningar, utan om en mÀngd specifika rötter för sÄdana trÀd (om viss deltagare avviker frÄn protokollet och skickar olika rötter av Merkletreet till olika deltagare, och tvÄ sÄdana rötter visas under konsensus, inkluderas inte hans strÀng i den resulterande uppsÀttningen). I slutet av konsensus kommer vi ha 67 kodade strÀngar och motsvarande rötter av Merkletreet, sÄdana att det finns minst 67 deltagare (inte nödvÀndigtvis samma som de som föreslog motsvarande strÀngar), för vilka varje av de 67 strÀngarna har ett meddelande med en andel av suddande kod och bevis pÄ att deras andel ingÄr i det motsvarande Merkletreet.
NÀr en deltagare i steg (4) dekrypterar 67 andelar för en viss strÀng och försöker Äterskapa den ursprungliga strÀngen, Àr en av alternativen möjliga:
StrÀngen Äterskapas, och om den dÄ kodas med suddande koder igen, och Merkletreet berÀknas för de lokalt berÀknade andelarna, sÄ stÀmmer roten överens med den som konsensus har nÄtt.
StrÀngen Äterskapas, men den lokalt berÀknade roten motsvarar inte den som konsensus har nÄtt.
StrÀngen kan inte Äterskapas.
Det Àr lÀtt att visa att om minst en deltagare upplever alternativ (1), sÄ kommer alla deltagare att uppleva alternativ (1), och omvÀnt, om minst en deltagare upplever alternativ (2) eller (3), dÄ kommer alla deltagare att uppleva alternativ (2) eller (3). PÄ sÄ sÀtt, för varje rad i datasetet antingen kommer alla deltagare att ÄterstÀlla den framgÄngsrikt, eller sÄ kommer alla deltagare att misslyckas med att ÄterstÀlla den. Den resulterande slumpmÀssiga siffran Àr dÄ XOR av endast de rader som deltagarna kunde ÄterstÀlla.
Tröskelattester
Ett annat tillvÀgagÄngssÀtt för slumpmÀssighet involverar anvÀndningen av sÄ kallade BLS-tröskelattester. En slumpgenerator baserad pÄ tröskelattester har exakt samma garantier som den ovan beskrivna algoritmen baserad pÄ utplÄningskoder, men har en betydligt lÀgre asymptotik för antalet meddelanden som skickas över nÀtverket för varje genererat tal.
BLS-signaturer Ă€r en konstruktion som tillĂ„ter flera deltagare att skapa en gemensam signatur för ett meddelande. Dessa signaturer anvĂ€nds ofta för att spara utrymme och bandbredd, eftersom de inte krĂ€ver att flera signaturer distribueras.Â
En vanlig tillĂ€mpning av BLS-signaturer i blockchain-protokoll, förutom generering av slumpmĂ€ssiga nummer, Ă€r signering av block i BFT-protokoll. LĂ„t sĂ€ga att 100 deltagare skapar block och blocket anses vara slutgiltigt om 67 av dem signerar det. Alla kan presentera sina delar av BLS-signaturen och anvĂ€nda en viss konsensusalgoritm för att enas om 67 av dem, och sedan kombinera dessa till en enda BLS-signatur. Vilka 67 (eller fler) delar som anvĂ€nds kan skapa den slutliga signaturen, vilket innebĂ€r att den kan variera, men trots att olika val av 67 deltagare kommer att skapa olika signaturer, kommer vilken som helst av dessa signaturer att vara en giltig signatur för blocket. Ăvriga deltagare behöver sedan bara fĂ„ och verifiera en signatur per block över nĂ€tverket, istĂ€llet för 67, vilket mĂ€rkbart minskar belastningen pĂ„ nĂ€tverket.
Det visar sig att om de privata nycklar som anvÀnds av deltagarna genereras pÄ ett visst sÀtt, sÄ kommer den resulterande signaturen att vara densamma oavsett vilka 67 signaturer (eller fler, men inte fÀrre) som aggregeras. Detta kan anvÀndas som en kÀlla till slumpmÀssighet: deltagarna kommer först överens om ett meddelande som de ska signera (det kan vara resultatet av RANDAO eller helt enkelt hash av den senaste blocket, det spelar faktiskt ingen roll sÄ lÀnge det Àndras varje gÄng och Àr överenskommet), och skapar en BLS-signatur för det. Resultatet av genereringen kommer att vara oförutsÀgbart tills 67 deltagare lÀmnar sina delar, och efter det kommer resultaten att vara förbestÀmda och kan inte bero pÄ nÄgon deltagares handlingar.
Denna metod för slumpmĂ€ssighet Ă€r livskraftig om Ă„tminstone â av deltagarna Ă€r online och följer protokollet, och den Ă€r opartisk och oförutsĂ€gbar sĂ„ lĂ€nge minst â av deltagarna följer protokollet. Det Ă€r viktigt att notera att en angripare som kontrollerar mer Ă€n â men mindre Ă€n â av deltagarna kan stoppa protokollet, men inte kan förutsĂ€ga eller pĂ„verka dess utfall.
Tröskelsignaturer i sig Àr ett mycket intressant Àmne. I den andra delen av artikeln kommer vi att utforska hur de fungerar, och hur deltagarnas nycklar ska genereras för att tröskelsignaturer ska kunna anvÀndas som en generator av slumpmÀssiga nummer.
Avslutningsvis
Denna artikel Àr den första i en serie tekniska artiklar i bloggen . NEAR Àr ett blockchain-protokoll och en plattform för att utveckla decentraliserade applikationer med fokus pÄ enkel utveckling och anvÀndarvÀnlighet för slutanvÀndarna.
Protokollets kod Àr öppen, vÄr implementation Àr skriven i Rust, och kan hittas .
Du kan se hur utvecklingen under NEAR ser ut och experimentera i en online-IDE .
HÄll koll pÄ alla nyheter pÄ ryska i och i , och pÄ engelska i den officiella .
Vi ses snart!
KĂ€lla: habr.com
