Selles artiklis räägin teile DAG (suunatud akükliline graaf) ja selle rakendustest jagatud registrites ning võrdleme seda plokiahelaga.

DAG ei ole krüptovaluutade maailmas midagi uut. Võib-olla olete kuulnud sellest kui lahendusest plokiahelate skaleeritavuse probleemidele. Kuid täna räägime mitte skaleeritavusest, vaid sellest, mis eristab krüptovaluutasid kõigest muust: tsentraliseerimatus, vahendajate puudumine ja tsensuuri vastuolu.

Näitan teile ka, et DAG on tegelikult tsensuuri suhtes vastupidavam ja selles puuduvad vahendajad registrisse pääsemiseks.

Tavapärastes plokiahelates ei ole kasutajatel otsest juurdepääsu registrile. Kui soovite lisada tehingu registrisse, peate «paluma», et plokkide tootja (plokkide tootja, tuntud ka kui „kaevur“) selle teeks. Just kaevurid otsustavad, milline tehing lisatakse järgmisse plokki ja milline mitte. Ainult kaevuritel on eksklusiivne juurdepääs plokkidele ja õigus otsustada, kelle tehingut aktsepteerida registrisse lisamiseks.
Kaevurid on vahendajad, kes seisavad teie ja jagatud registri vahel.

Praktikas kontrollib tavaliselt väike arv kaevurite gruppe kollektiivselt üle poole võrgu arvutusvõimsusest. Bitcoini puhul on see neli gruppi, Ethereum'i puhul - kaks. Nende õiguskaitse korral võivad nad blokeerida mistahes tehingud, mida nad soovivad.

Viimastel aastatel on välja pakutud palju plokiahela variatsioone, mis erinevad plokkide tootjate valimise põhimõtetest. Kuid plokkide tootjad ei kao kuskile, nad seisavad endiselt «tasul» kohal: iga tehing peab läbima plokkide tootja ning kui ta ei aktsepteeri, siis tehingu sisuliselt ei eksisteeri.

See on paratamatu probleem plokiahela puhul. Ja kui soovime seda lahendada, peame radikaalselt muutma kujundust ja täielikult loobuma plokkidest ja plokkide tootjatest. Ja selle asemel, et ehitada plokkide ahelat, ühendame tehingud ise, lisades igasse tehingusse mitme eelneva hässe. Tulemuseks on struktuur, mida matemaatikas tuntakse suunatud aküklilise graafina – DAG.
Nüüd on igalühel otsepääs registrisse, ilma vahendajateta. Kui soovite lisada tehingu registrisse, siis lisate selle lihtsalt. Valite mõned vanemtehingud, lisate oma andmed, allkirjastate ja saadate oma tehingu võrku. Valmis. Ei ole kedagi, kes saaks seda takistada, seega on teie tehing juba registris.
See on kõige detsentraliseeritum ja tsensuuri suhtes kõige kindlam viis tehingute lisamiseks registrisse ilma vahendajateta. Sest igaüks, kes soovib, saab lihtsalt oma tehingud registrisse lisada, küsimata kellegi käest luba.

DAG-i võib pidada registrite evolutsiooni kolmandaks etapiks. Esmalt olid tsentraliseeritud registrid, kus üks pool kontrollis juurdepääsu. Siis tulid plokiahelad, kus juba oli mitu kontrollijat, kes registreerisid tehingud. Ja lõpuks, DAG-is ei ole üldse kontrollijaid, kasutajad lisavad oma tehingud otse.

Nüüd, kui meil on selline vabadus, ei tohiks see viia kaoseni. Me peame omama kokkulepet registri oleku üle. Ja see kokkulepe, või konsensus, tähendab tavaliselt kokkulepet kahe asja üle:
- Mis juhtus?
- Millises järjekorras see toimus?
Esimesele küsimusele saame kergesti vastata: kui õigesti loodud tehing on registrisse lisatud, siis see on toimunud. Ja punkt. Info selle kohta võib jõuda kõikide osaliste juurde erineval ajal, kuid lõpuks saavad kõik sõlmed selle tehingu ja saavad teada, et see on toimunud.
Kui see oleks plokiahel, otsustaksid kaevandajad, mis toimub. Kõik, mida kaevandaja otsustab plokki lisada – see toimub. Kõik, mida ta plokki ei lisa – see ei toimu.
Plokiahelates otsustavad kaevandajad ka teise konsensuse probleemi: järjekorra. Neil on lubatud korraldada tehingud ploki sees kuidas iganes nad soovivad.
Kuidas määrata tehingute järjekorda DAG-is?

Ainult seetõttu, et graaf on suunatud, on meil juba teatav kord. Iga tehing viitab ühele või mitmele eelnevale, vanematele. Vanemad viitavad omakorda oma vanematele ja nii edasi. Vanemad ilmuvad ilmselgelt enne tütartehingut. Kui mõni tehing on saavutatav linkide 'vanem-laps' kaudu, teame me täpselt järjekorda nende tehingute vahel selle tehingute ahela sees.

Kuid tehingute vahelise järjekorra määramine ei ole alati võimalik ainult graafi kuju põhjal. Näiteks, kui kaks tehingut asuvad graafiku paralleelsetes okstele.

Sellistes olukordades kahtluste lahendamiseks toetume nn järjekorra pakkujatele. Me nimetame neid ka "tunnistajateks". Need on tavalised kasutajad, kelle ülesanne on pidevalt saata tehinguid võrku vastava järjekorra alusel, st nii, et iga nende eelmine tehing on saavutatav linkide 'vanem-laps' kaudu. Järjekorra pakkujad – usaldusväärsed kasutajad, ja kogu võrk toetub sellele, et nad ei riku seda reeglit. Selleks, et ratsionaalselt neisse usaldada, nõuame, et iga järjekorra pakkuja oleks tuntud (anonüümne) inimene või organisatsioon ning omaks midagi, mida nad võivad kaotada reeglite rikkumise korral, näiteks maine või usaldusväärsusele tuginev äri.

Järjekorra pakkujad valitakse kasutajate poolt ning iga kasutaja lisab oma usaldusväärsete pakkujate nimekirja igasse tehingusse, mille ta saadab võrku. See nimekiri koosneb 12 pakkujast. See on piisavalt väike arv, et inimene saaks igaühe isikuid ja mainet kontrollida ning piisav, et võrk jätkaks tööd võimalike probleemide korral väikese pakkujate vähemuse osas.
See nimekiri pakkujatest varieerub kasutajalt kasutajale, kuid naabertehingute nimekirjad võivad erineda maksimaalselt ühte pakkujat.

Nüüd, kui meil on järjekorra pakkujad, saame eraldada nende tehingud DAG-is ja korraldada kõik muud tehingud nende poolt loodud järjekorra ümber. Selle tüüpi algoritmi loomise võimalus on olemas (vt. tehniliste üksikasjade jaoks).
Aga kogu võrgu järjekorda ei saa kohe määrata, kuna meil on vaja aega, et korraga laekuks piisavalt tehingute järjekordi, et olla kindel varasemate tehingute lõppjärjekorras.
Ja kuna järjekord määratakse ainult tehingute positsioonide põhjal DAG-is, saavad kõik võrgu sõlmed varem või hiljem kõik tehingud ning jõuavad sama järeldusele tehingute järjekorra osas.

Nii et meil on kokkulepe selle üle, mis on toimunud: iga tehing, mis on DAG-i jõudnud, on toimunud. Samuti on meil kokkulepe sündmuste järjekorra üle: see on kas nähtav tehingute omavaheline seos või tuletatakse see tehingute järjekorrast, mille on saatnud järjekorranduse pakkujad. Seega on meil konsensus.

See konsensuse variant eksisteerib Obyte'is. Kuigi Obyte'i registrile on täielik detsentraliseeritud juurdepääs, on tehingute järjekorra osas konsensus endiselt tsentraliseeritud, kuna 10 12-st pakkujast on kontrollitud loojate (Anton Churyumov) poolt, ja vaid kaks neist on iseseisvad. Otsime kandidaate, kes soovivad saada üheks iseseisvaks järjekorranduse pakkujaks, et aidata meil detsentraliseerida järjekorra kehtestamine registris.
Hiljuti on ilmunud kolmas iseseisev kandidaat, kes soovib luua ja hoida järjekorranduse pakkuja sõlme – Nikosia Ülikool.

Nüüd, kuidas me kontrollime kahekordseid kulutusi (double-spends)?
Reeglite kohaselt, kui avastatakse kaks tehingut, mis kulutavad sama münti, võidab see tehing, mis on kõigi tehingute lõppjärjekorras varem. Teine kehtetuks tunnistatakse konsensuse algoritmi poolt.

Juhul, kui on võimalik määrata järjekord kahe münti kulutava tehingu vahel (lastevanema seostest), siis kõik sõlmed tõrjuvad koheselt sellise katse kahekordse kulutuse.

Kuid juhul, kui järjekord ei ole nähtav kahe sellise tehingu vahel, võetakse mõlemad registrisse ja peame ootama konsensust ja järjekorra määramist järjekorranduse pakkujate abil. Siis võidab varasem tehing ja teine muutub kehtetuks.

Kuigi teine tehing muutub kehtetuks, jääb see ikkagi registrisse, kuna sellel on juba sellele viitavad järgmised tehingud, mis ei rikkunud midagi ja ei teadnud, et see tehing muutub tulevikus kehtetuks. Vastasel juhul peaksime eemaldama headelt järgmistelt tehingutelt vanema, mis rikuks võrgu peamist põhimõtet – iga õige tehing võetakse registrisse.

See on väga oluline reegel, mis võimaldab kogu süsteemil olla vastupidav tsenseerimiskatsetele.
Kujutame ette, et kõik korraldajate pakkujad on koostööd teinud, et püüda "tsenseerida" ühte konkreetset tehingut. Nad võivad seda ignoreerida ja mitte kunagi valida "vanemaks" oma tehingutele, kuid see pole piisav, see tehing võib ikkagi olla kaudse vanemana mõnele teisele tehingule, mille on välja andnud mis tahes võrgu kasutaja, kes ei osale kokkuleppes. Aja jooksul hakkab see tehing saama üha rohkem ja rohkem lapsi, lapselapsi ja lapselaste lapsi tavalistelt kasutajatelt, laienedes nagu lumepall, ja kõik koostööd teinud korraldajate pakkujad peavad ignoreerima ka need tehingud. Lõpuks peavad nad tsenseerima kogu võrgu, mis on samaväärne saboteerimisega.

Nii jääb DAG tsenseerimiskindlaks, isegi kui korraldajate pakkujate kokkulepe on olemas, ületades seega bitti ahelat tsenseerimise vastupidavuses, kus me ei saa midagi teha, kui kaevurid otsustavad mitte kaasata mõnda tehingut. Ja see tuleneb DAGi peamisest omadusest: osalemine registris on täiesti sõltumatu ja vahendajateta ning tehingud on pöördumatud.
Allikas: habr.com
