Orakulli rastësor në bazë të nënshkrimit digjital në blockchain

Nga ideja në realizim: ne modifikojmë skemën ekzistuese të nënshkrimit digjital në kurbën ellipti që të jetë e caktuar dhe ofrojmë mbi të funksione për të marrë numra pseudo-rastësorë të verifikueshëm brenda bllokçain.

Orakulli rastësor në bazë të nënshkrimit digjital në blockchain

Ideja

Në vjeshtën e vitit 2018 në bllokçain Waves u aktivizuan kontratat e para inteligjente, menjëherë u shfaq pyetja për mundësinë e marrjes numrave pseudo-rastësorë, të cilëve mund t’u besohet.

Duke thyer kokën mbi këtë çështje, përfundimisht arrita në përfundimin: çdo bllokçain është një kafaz, është e pamundur të marrësh një burim të besueshëm entropi në një sistem të mbyllur.

Por një ide më pëlqeu: nëse një orakull rastësor do të nënshkruante të dhënat e përdoruesit me një algoritëm të caktuar, atëherë përdoruesi gjithmonë do të mund të verifikonte atë nënshkrim me çelësin publik dhe do të ishte i sigurt se vlera e marrë është unike. Orakulli, sa do të donte, nuk është në gjendje të ndryshojë asgjë; algoritmi jep një rezultat të qartë. Në thelb, përdoruesi regjistron rezultatin, por nuk e di atë deri sa orakulli ta publikojë. Kështu, rezulton se mund të mos i besosh fare orakullit, por të verifikosh rezultatin e punës së tij. Atëherë, në rast të verifikimit të suksesshëm, një nënshkrim i tillë mund të konsiderohet një burim entropie për numrin pseudo-rastësor.

Në platformën bllokçain Waves përdoret një skemë nënshkrimi EdDSA një variant Ed25519. Në këtë skemë nënshkrimi përbëhet nga vlerat R dhe S, ku R varet nga një vlerë rastësore, ndërsa S llogaritet mbi bazën e mesazhit të nënshkruar, çelësit privat dhe të njëjtat numra rastësorë si R. Kështu, nuk ka një varësi të qartë; për një mesazh të njëjtë përdoruesi ekzistojnë shumë nënshkrime valide.

Është e qartë se një nënshkrim i tillë në formën e pastër nuk mund të përdoret si burim numrash pseudo-rastësorë, sepse është jodeterminist dhe, si rezultat, mund të jetë lehtësisht e ekspozuar ndaj manipulimeve nga ana e orakullit.

Por, siç doli, është e mundur ta bësh atë të caktuar në të vërtetë.

Shpresat e mëdha i kam pasur për funkcionin e rastësisë të verifikueshëm (VRF), por pasi studimi të materialeve, u detyruam të heqim dorë nga ky variant. Edhe pse VRF ofron një variant të caktuar të nënshkrimit dhe provës së tij, algoritmi përmban një vend të çuditshëm që hap një vrimë të zezë për manipulimin nga orakulli. Saktësisht, gjatë llogaritjes së vlerës k (seksioni 5.1) përdoret një çelës privat, i cili mbetet i panjohur për përdoruesin, që do të thotë se përdoruesi nuk mund ta verifikojë saktësinë e llogaritjes së k, që do të thotë se orakulli mund të përdorë çdo vlerë k që dëshiron dhe njëkohësisht të mbajë një bazë të dhënash për përputhjet e k dhe të dhënave të nënshkruara, për të qenë në gjendje të ri-llogarisë gjithmonë rezultatin e saktë sipas VRF. Nëse shihni një lojë të bazuar në VRF pa zbuluar çelësin privat, mund të ndiheni inteligjentë: të theksoni nevojën për të zbuluar çelësin ose për ta përjashtuar atë nga llogaritja e k, atëherë çelësi privat do të zbulohet automatikisht me nënshkrimin e parë. Në përgjithësi, siç është thënë më parë, një skemë e çuditshme për një orakull të rastësishëm.

Pas disa reflektimeve dhe mbështetjes nga analistët lokalë, lindi skema e funksionimit të VECRO.

VECRO është një akronim për Verifiable Elliptic Curve Random Oracle, që në shqip do të thotë orakull i rastësishëm i verifikueshëm mbi kurba eliptike.

Gjithçka rezultoi mjaft e thjeshtë; për të arritur determinimin, është e nevojshme të fijosh vlerën R para shfaqjes së mesazhit të nënshkruar. Nëse R është fijuar dhe është pjesë e mesazhit të nënshkruar, që garanton gjithashtu fijimin e R në vetë mesazhin e nënshkruar, vlera S përcaktohet qartazi nga mesazhi i përdoruesit dhe, për pasojë, mund të përdoret si një burim për numra pseudo-rastësorë.

Në një skemë të tillë, nuk ka rëndësi si e fiksoni R, kjo mbetet në përgjegjësinë e orakullit. E rëndësishme është që S përcaktohet qartazi nga përdoruesi, por vlera e tij mbetet e panjohur derisa orakulli ta publikojë. Ashtu siç dëshiruam!

Duke folur për R të fiksuar, vini re se R i përdorur më parë në nënshkrimin e mesazheve të ndryshme, ky proces përkufizon qartë çelësin e fshehtë në skemën EdDSA. Për pronarin e orakullit, është thelbësore të përjashtojë mundësinë e ripërdorimit të R për nënshkrimin e mesazheve të ndryshme nga përdoruesi. Kështu, në çdo manipulim ose marrëveshje, orakulli gjithmonë do të rrezikojë humbjen e çelësit të tij të fshehtë.

Pra, orakulli duhet t'u ofrojë përdoruesve dy funksione: inicializimin që regjistron vlerën R, dhe nënshkrimin që kthen vlerën S. Në këtë mënyrë, çifti R, S është një nënshkrim i verifikueshëm i mesazhit të përdoruesit që përmban vlerën e fiksuar R dhe të dhëna të rastësishme nga përdoruesi.

Mund të argumentohet se kjo skemë për blockchain nuk është asgjë tjetër përveçse një skemë angazhim-zbulesë. Në thelb, po, kjo është ajo. Por ka disa nuanca. Së pari, orakulli gjithmonë punon me të njëjtin çelës në të gjitha operacionet, për shembull, kjo është e lehtë për t'u përdorur në kontrata. Së dyti, ekziston rreziku nga humbja e çelësit të fshehtë nga orakulli në rast të një sjelljeje të papërshtatshme, për shembull, nëse orakulli lejon të bëhen mostra të rezultatit, atëherë mjafton të bëhen vetëm dy mostra për të zbuluar çelësin e fshehtë dhe për të marrë qasje të plotë në portofol. Së treti, nënshkrimi që është natyrshëm i verifikueshëm në blockchain, i cili është burimi i rastësisë — është e bukur.

Për gjashtë muaj, ideja e realizimit u zhvillua në mendje, derisa më në fund u shfaq motivimi në formën e një granti nga Waves Labs. Me një grant të madh vjen një përgjegjësi e madhe, pra projekti do të ekzistojë!

Implementimi

Kështu, në këtë projekt VECRO u realizua në blockchain Waves në modin kërkesë-përgjigje përmes transaksioneve të transferit mes përdoruesit dhe orakullit. Në këtë rast, në llogarinë e orakullit është instaluar një skenar që kontrollon punën në përputhje të ngushtë me logjikën e përshkruar më sipër. Transaksionet e orakullit kalojnë një verifikim me rifitimin e gjithë zinxhirin e ndërveprimit me përdoruesin. Në verifikimin e vlerës përfundimtare marrin pjesë të katra transaksion, smart kontrata i lidh ato në një vijë verifikimi strikte, hap pas hapi duke kontrolluar të gjitha vlerat dhe duke mos lënë hapësirë për ndonjë manipulim.

Një herë tjetër, që të mbetet e qartë dhe të jetë më e kuptueshme. Orakulli nuk punon thjesht sipas skemës së propozuar. Puna e tij kontrollohet plotësisht në nivelin e blockchain nga një sistem i vendosur. kontrakt i menaxhuar nga një smart kontratë. Një hap në të majtë, dhe transaksioni thjesht nuk do të kalojë. Prandaj, nëse transaksioni ka hyrë në blockchain, përdoruesi nuk ka nevojë të kontrollojë asgjë, sepse gjithçka është verifikuar tashmë nga qindra nyje të rrjetit.

Aktualisht në rrjetin kryesor të Waves është aktiv një VECRO (mund të filloni të tuajin, nuk është e vështirë, thjesht shikoni një shembull konfigurimi). Kodi aktual funksionon në PHP (në WavesKit, për të cilin kam folur më parë).

Për të përdorur shërbimin e orakullit duhet:

  • Të regjistroni R;
    • Dërgoni minimum 0.005 Waves në alias-in e orakullit init@vecr;
    • Merrni R-code në fushën e bashkëngjitjes në transferimin e 1 R-vecr tokenit nga orakulli për përdoruesin;
  • Merrni nënshkrimin;
    • Dërgoni minimum 0.005 Waves në alias-in e orakullit random@vecr, dhe gjithashtu TË JETË OBLIGUAR të tregoni në fushën e bashkëngjitjes R-code të marrë më parë dhe të dhëna të tjera përdoruesi;
    • Merrni S-code në fushën e bashkëngjitjes në transferimin e 1 S-vecr tokenit nga orakulli për përdoruesin;
  • Përdorni S-code si burim të numrit pseudo-të rastësishëm.

Detajet e realizimit aktual:

  • Waves e dërguar orakullit përdoret si komision për transferimin e kundërt te përdoruesi, deri në maksimum 1 Waves;
  • R-code është bashkimi i bajtit të simbolit ‘R’ dhe vlerës 32-bajt R në kodimin base58;
  • R-code në bashkëngjitje duhet të jetë i pari, të dhënat e përdoruesit vijnë pas R-code;
  • S-code është bashkimi i bajtit të simbolit ‘S’ dhe vlerës 32-bajt S në kodimin base58;
  • S është rezultati i ndarjes modulo, prandaj nuk mund të përdoret S si një numër pseudo-të rastësishëm 256-bitësh i plotë (ky numër mund të konsiderohet maksimum 252-bitësh si numër pseudo-të rastësishëm);
  • Mënyra më e thjeshtë është të përdorni hash-in nga S-code si një numër pseudo-të rastësishëm.

Shembulli i marrjes së S-code:

Nga pikëpamja teknike, orakulli është plotësisht i gatshëm për t'u përdorur, mund ta përdorni pa frikë. Nga këndvështrimi i përdoruesit të zakonshëm, mungon një ndërfaqe grafike e përshtatshme, për këtë do të duhet të presim.

Do të isha i lumtur të përgjigjem në pyetje dhe të pranoja vërejtje, faleminderit.

Burimi: habr.com

Blini hosting të besueshëm për faqe interneti me mbrojtje nga DDoS, serverë VPS VDS 🔥 Blini hosting të besueshëm për faqe interneti me mbrojtje nga DDoS, serverë VPS VDS | ProHoster