Orakulli i rastësishëm i bazuar në nënshkrimin dixhital në blockchain

Nga ideja në zbatim: ne modifikojmë skemën ekzistuese të nënshkrimit dixhital të kurbës eliptike në mënyrë që të jetë përcaktuese dhe në bazë të saj ne ofrojmë funksione për marrjen e numrave pseudo të rastësishëm të verifikueshëm brenda zinxhirit të bllokut.

Orakulli i rastësishëm i bazuar në nënshkrimin dixhital në blockchain

Ide

Në vjeshtën e vitit 2018, përfshihej zinxhiri i valëve u aktivizuan kontratat e para inteligjente, menjëherë lindi pyetja për mundësinë e marrjes numra pseudorandomqë mund t'i besoni.

Duke u hutuar për këtë pyetje, më në fund arrita në përfundimin: çdo blockchain është një qelizë; është e pamundur të merret një burim i besueshëm i entropisë në një sistem të mbyllur.

Por prapë më pëlqeu një ide: nëse orakull i rastësishëm do të nënshkruajë të dhënat e përdoruesit me një algoritëm përcaktues, atëherë përdoruesi do të jetë gjithmonë në gjendje të verifikojë një nënshkrim të tillë duke përdorur çelësin publik dhe do të jetë i sigurt se vlera që rezulton është unike. Orakulli, sado e vështirë të dojë, nuk është në gjendje të ndryshojë asgjë; algoritmi prodhon një rezultat të paqartë. Në thelb, përdoruesi regjistron rezultatin, por nuk e di atë derisa orakulli ta publikojë atë. Rezulton se nuk mund t'i besoni fare orakullit, por kontrolloni rezultatin e punës së tij. Më pas, në rast verifikimi të suksesshëm, një nënshkrim i tillë mund të konsiderohet burim i entropisë për një numër pseudorandom.

Platforma e blockchain Waves përdor një skemë nënshkrimi EdDSA alternativë Ed25519. Në këtë skemë, nënshkrimi përbëhet nga vlerat R dhe S, ku R varet nga një vlerë e rastësishme, dhe S llogaritet në bazë të mesazhit që nënshkruhet, çelësit privat dhe të njëjtit numër të rastësishëm si R. Rezulton se nuk ka varësi unike për të njëjtën Ka shumë nënshkrime të vlefshme për një mesazh përdoruesi.

Natyrisht, në formën e tij të pastër, një nënshkrim i tillë nuk mund të përdoret si burim i numrave pseudo të rastësishëm, pasi ai nuk është përcaktues dhe, për rrjedhojë, mund të manipulohet lehtësisht nga orakulli.

Por, siç doli, në fakt është e mundur ta bëjmë atë përcaktues.

Kisha shpresa të mëdha për funksion i rastësishëm i verifikueshëm (VRF), por pasi studiova harduerin, më duhej ta braktisja këtë opsion. Edhe pse VRF ofron një version determinist të nënshkrimit dhe provës së tij, ekziston një vend i çuditshëm në algoritëm që hap një vrimë të zezë për manipulimin e orakullit. Përkatësisht, gjatë llogaritjes së vlerës 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 të verifikojë saktësinë e llogaritjes së k, që do të thotë se orakulli mund të përdorë çdo vlerë të k që i nevojitet dhe në të njëjtën kohë të mbajë një bazë të dhënash të korrespondencave e k dhe të dhënave të nënshkruara në mënyrë që gjithmonë të jetë në gjendje të rillogarisë rezultatin e saktë nga pikëpamja e VRF . Nëse shihni një vizatim të bazuar në VRF pa zbuluar çelësin privat, mund të jeni të zgjuar: tregoni 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 kur të shfaqet nënshkrimi i parë . Në përgjithësi, siç u përmend tashmë, një skemë e çuditshme për një orakull të rastësishëm.

Pasi u mendua pak dhe kërkoi mbështetjen e analistëve vendas, lindi skema e punës VECRO.

VECRO është një shkurtim për Oracle të rastësishme të kurbës eliptike të verifikueshme, që në rusisht do të thotë orakull i rastësishëm i verifikueshëm në kthesat eliptike.

Gjithçka doli të ishte mjaft e thjeshtë; për të arritur determinizmin, duhet të rregulloni vlerën e R përpara se të shfaqet mesazhi që do të nënshkruhet. Nëse R është kryer dhe është pjesë e mesazhit që nënshkruhet, gjë që më tej siguron që R është kryer në mesazhin që nënshkruhet, vlera e S përcaktohet në mënyrë unike nga mesazhi i përdoruesit dhe për këtë arsye mund të përdoret si burim për numrat pseudorandom.

Në një skemë të tillë, nuk ka rëndësi se si fiksohet R; kjo mbetet përgjegjësi e orakullit. Është e rëndësishme që S të përcaktohet në mënyrë unike nga përdoruesi, por vlera e tij nuk dihet derisa orakulli ta publikojë atë. Gjithçka që donim!

Duke folur për R fikse, vini re se ripërdorur R kur nënshkruani mesazhe të ndryshme, ai zbulon në mënyrë unike çelësin privat në skemën EdDSA. Bëhet jashtëzakonisht e rëndësishme për pronarin e orakullit që të eliminojë mundësinë e ripërdorimit të R për të nënshkruar mesazhe të ndryshme përdoruesi. Kjo do të thotë, me çdo manipulim ose marrëveshje të fshehtë, orakulli gjithmonë do të rrezikojë të humbasë çelësin e tij privat.

Në total, orakulli duhet t'u ofrojë përdoruesve dy funksione: inicializimi, i cili rregullon vlerën R dhe nënshkrimi, i cili kthen vlerën S. Në këtë rast, çifti R, S është nënshkrimi i zakonshëm i verifikueshëm i një mesazhi përdoruesi që përmban një mesazh të caktuar. vlera R dhe të dhënat arbitrare të përdoruesit.

Mund të argumentohet se kjo skemë për blockchain nuk është asgjë më shumë se e zakonshme commit-expand skemë. Në thelb, po, është ajo. Por ka disa nuanca. Së pari, orakulli punon gjithmonë me të njëjtin çelës në të gjitha operacionet, për shembull, ky është i përshtatshëm për t'u përdorur në kontrata. Së dyti, ekziston rreziku që orakulli të humbasë çelësin privat nëse ai sillet gabimisht, për shembull, orakulli ju lejon të bëni mostra të rezultatit, atëherë mjafton të bëni vetëm dy teste për të gjetur çelësin privat dhe për të fituar të plotë qasje në portofol. Së treti, një nënshkrim që është i verifikueshëm në mënyrë origjinale në blockchain dhe është një burim rastësie është i bukur.

Për gjashtë muaj më zinte në kokë ideja e zbatimit, derisa më në fund u shfaq në formë motivimi grant nga Waves Labs. Me një grant të madh vjen përgjegjësi e madhe, kështu që projekti do të jetë aty!

Zbatimi

Pra, në këtë projekt VECRO u zbatua në blockchain Waves në modalitetin kërkesë-përgjigje duke përdorur transaksione transferimi midis përdoruesit dhe orakullit. Në të njëjtën kohë, një skript është instaluar në llogarinë e orakullit që kontrollon punën në mënyrë rigoroze në përputhje me logjikën e përshkruar më sipër. Transaksionet e Oracle verifikohen dhe i gjithë zinxhiri i ndërveprimit të përdoruesit është restauruar. Të katër transaksionet janë të përfshira në verifikimin e vlerës përfundimtare; kontrata inteligjente i bashkon ato me një fije verifikimi të rreptë, duke kontrolluar të gjitha vlerat hap pas hapi dhe duke mos lënë vend për asnjë manipulim.

Edhe një herë, për ta lënë mënjanë dhe për ta bërë më të qartë. Orakulli nuk funksionon vetëm sipas skemës së propozuar. Puna e tij kontrollohet plotësisht në nivelin blockchain nga themeluesit fort me një kontratë të zgjuar. Hap majtas dhe transaksioni thjesht nuk do të kalojë. Pra, nëse një transaksion përfshihet në blockchain, përdoruesi as nuk ka nevojë të kontrollojë asgjë; qindra nyje rrjeti kanë kontrolluar tashmë gjithçka për të.

Aktualisht, ekziston një VECRO që funksionon në rrjetin kryesor të valëve (ju mund të përdorni vetë, nuk është e vështirë, thjesht hidhini një sy shembullit të konfigurimit). Kodi aktual funksionon në PHP (aktiv WavesKit, për të cilën Ju thashë më herët).

Për të përdorur shërbimin e Oracle ju duhet:

  • Rregulloni R;
    • Dërgo të paktën 0.005 Valë te oracle alias init@vecr;
    • Merrni kodin R në fushën e bashkëngjitjes në transferimin e 1 token R-vecr nga orakulli te përdoruesi;
  • Merrni një nënshkrim;
    • Dërgoni të paktën 0.005 Valë tek alias oracle random@vecr, dhe gjithashtu DUHET të tregojë kodin R të marrë më parë dhe të dhënat shtesë të përdoruesit në fushën e bashkëngjitjes;
    • Merrni kodin S në fushën e bashkëngjitjes në transferimin e 1 token S-vecr nga orakulli te përdoruesi;
  • Përdorni kodin S si burim të numrave pseudo të rastësishëm.

Nuancat e zbatimit aktual:

  • Valët e dërguara në orakull përdoren si komision për transaksionin e kthimit tek përdoruesi, deri në maksimum 1 Valë;
  • R-kodi është lidhja e një bajt të karakterit 'R' dhe një vlere R të koduar me bazë 32 58 bajt;
  • Kodi R në bashkëngjitje duhet të jetë i pari, të dhënat e përdoruesit vijnë pas kodit R;
  • S-kodi është lidhja e një bajt të karakterit 'S' dhe një vlere 32-bajtëshe të koduar me bazë58 të S;
  • S është rezultat i ndarjes së modulit, kështu që nuk mund të përdorni S si një numër të plotë pseudorandom 256-bit (ky numër mund të konsiderohet një numër maksimumi 252-bitësh pseudorandom);
  • Opsioni më i thjeshtë është përdorimi i hash-it të kodit S si një numër pseudo-rastësor.

Shembull i marrjes së kodit S:

Nga pikëpamja teknike, orakulli është plotësisht i gatshëm për punë, mund ta përdorni me siguri. Nga pikëpamja e përdorimit nga përdoruesi mesatar, mungon një ndërfaqe grafike e përshtatshme; kjo do të duhet të presë.

Do të jem i lumtur t'u përgjigjem pyetjeve dhe të pranoj komente, faleminderit.

Burimi: www.habr.com

Shto një koment