Pirms jūsmot par blokķēdēm, uzziniet, kas ir versiju kontrole

marts 02 2018

Kad paudu savu viedokli par Bitcoin, daudzi man ir jautājuši, ko es domāju par blokķēdēm, kas ir bitkoinu tehnoloģiskais pamats. Šajā rakstā es parādīšu, ka blokķēdes ir tikai viens (un ne vienmēr labākais) veids, kā nodrošināt kopīgu, nemainīgu notikumu vēsturi. (Piedodiet par kalambūru, bet) izmaiņu vēstures aprakstīšanai ir daudz garāka vēsture nekā digitālajai naudai.

Ja neesat jau lasījuši, pirms lasīt šo rakstu tālāk, iesaku izlasīt senāku emuāru ierakstu par Bitcoin. Nepacietīgajiem atgādināšu dažas svarīgākās lietas par digitālo naudu. Digitālā nauda, piemēram, Bitcoin, kuru izveidoja 2008. gadā, ir sadalīta informācijas sistēma, kurā ar dažādiem algoritmiem tiek radīta ierobežota daudzuma nauda, un darījumus ar to saglabā visiem pieejamā darījumu žurnālā. Lai naudu varētu lietot tikai tas, kam tā pieder, maku īpašnieku (lietotāju) autentifikācijai izmanto publiskās atslēgas kriptogrāfiju.

Versiju kontrole (zīmīgi, ka par versiju kontroli nav lapu vikipēdijā latviešu valodā) ir izmaiņu pārvaldības paņēmieni un rīki, kas ļauj izsekot failu (piemēram, elektronisko dokumentu) satura izmaiņām laika gaitā un salīdzināt to dažādas "versijas" (t.i. saturu noteiktā laikā). Versiju kontroli ieviesa programmētāji, lai izsekotu programmatūras pirmkoda izmaiņām. Pirmā atvērtā pirmkoda versiju kontroles sistēma RCS tika izveidota 1982. gadā. Tagad jebkurš, kas izmanto datoru un rada elektroniskus dokumentus, nonāk pie kaut kādas versiju kontroles, kas parasti ir neefektīva un neuzticama:

Final_doc.gif

Piemēram, arī Personas datu aizsardzības likums tīmeklī arī ir apskatāms ar vāju un nepilnīgu versiju kontroli, kur konkrētās izmaiņas lasītājam ir jāmeklē pašam:

/xwiki/bin/download/Blog/180302/Att01.png

Sadalīta versiju kontrole ir zīmīga ar to, ka izmaiņu vēsturi glabā nevis vienā, centralizētā krātuvē, bet gan katram krātuves lietotājam ir sava, pilnīga kopējās vēstures kopija (t.s. "klons"). Katrs krātuves dalībnieks var veikt izmaiņas savā krātuvē un pieprasīt (ar t.s. "vilkšanas pieprasījumu", lai viņa krātuvē veiktās izmaiņas pieņem arī citi dalībnieki viņiem piederošajās krātuves kopijās. Ja citi dalībnieki šīm izmaiņām nepiekrīt, viņi "vilkšanas pieprasījumu" var ignorēt. Populārākā (bet ne vienīgā, ir arī Mercurial, Bazaar u.c.) atvērtā pirmkoda sadalītā versiju kontroles sistēma ir Git, kuru izveidoja 2005. gadā. Git ir GitHub sadarbības vietnes pamatā.

Ja likumu saturu saglabā GitHub versiju kontroles krātuvē, izmaiņu salīdzināšana ir vienkārša un ērta. Piemēram, Vācijas federālajiem likumiem un noteikumiem konkrētas izmaiņas var viegli salīdzināt, precīzi parādot mainītās rindas un vārdus:

Att02.png

Tāpat, kā programmas darbību var izmainīt uz pilnīgi pretējo ar vienu burtu (pareizāk sakot, rakstzīmi), piemēram, nomainot == (vienāds) uz != (nav vienāds), tāpat arī uz pilnīgi pretējo var izmainīt likuma pantu, pieliekot priedēkli ne. Tāpēc ir svarīgi, ka ar versiju kontroles rīkiem izmaiņas var salīdzināt ar precizitāti līdz noteiktai rindai, vārdam, rakstzīmei vai pat vienam bitam.

Lai varētu ātri pārbaudīt vēstures pareizību, gan digitālajās naudas darījumu vēsturē, gan versiju kontroles rīkos izmanto bināro jaucējfunkciju koku, jeb Merkles koku. Ar jaucējfunkciju nosaka viena elementa (digitālajai naudai — darījumu blokiem, versiju kontroles sistēmās — failiem) "digitālo pirkstu nospiedumu", bet Merkles kokā augošā secībo apvieno pirmelementu jaucējfunkciju vērtības, lai var ātri pārbaudīt visas kopējās struktūras un tās elementu pareizību. Ja kādam elementam ir mainījies tikai viens bits, tā jaucējfunkcijas vērtība ir savādāka, attiecīgi izmainot veselu zaru Merkles kokā, ko var ātri pamanīt.

Digitālajai naudai vēstures pareizības nodrošināšanai ir izmantoti papildu paņēmieni:

  1. jaunu izmaiņu apstiprināšanu veikt nav vienkārši, jo darījumu apstiprināšanai ir jāatrisina kriptogrāfisks uzdevums, t.s. darba pierādījums — darījumu datiem jāpievieno papildu kods (nonce) tā, lai jaucējfunkcijas rezultāts sāktos ar noteiktu nuļļu skaitu. Jo garāku vēsturi kāds izdomā pārrakstīt, jo daudzkārt lielāks darbs ir nepieciešams jau apstiprināto darījumu papildu kodu atrašanai.
  2. Par oficiālo darījumu vēsturi uzskata to, kuru ir nolēmuši izmantot par patieso vairāk par pusi no kopējo lietotāju skaita (pareizāk sakot, vairāk par pusi no t.s. "pilno mezglu" īpašnieku).

Šie divi papildu nosacījumi padara vēstures pārrakstīšanu (un attiecīgi šmaukšanos ar darījumiem) ļoti grūtu, ilgu un dārgu, bet tas apgrūtina arī "nesenās vēstures", jeb jaunākā darījuma bloka apstiprināšanu. Piemēram, ja jums gadās pārskaitīt naudu uz nepareizu adresātu, jums nav iespēju atcelt šo darījumu un nauda ir zaudēta neatgriezeniski. Bitcoin viena darījuma apstiprināšanai šobrīd patērē gandrīz 800kWh elektroenerģijas! Manuprāt, šī iemesla dēļ, jeburam biznesa risinājumam, kurš vēstures nemainībai izmanto "darba pierādīšanu", nākotnes izredzes ir apšaubāmas.

Bitcoin un tamlīdzīga digitālā nauda ir veidota uz principu, ka jums nevienam nav jāuzticās, jo uzticamību nodrošina bezpersonisks un neieinteresēts pūlis. Bet vēsture pierāda, ka sabiedrība, kuras pārstāvji viens otram neuzticās, strādā neefektīvi.

Jo mazāka uzticamība, jo vairāk līdzekļu — naudas, laika, elektrības un citu resursu ir jātērē, lai nodrošinātos, ka jūs neapkrāpj. Tāpēc jaunu digitālo naudu izgudrotāji izmanto citus, efektīvākus vienprātības panākšanas veidus — "Ieinteresētības pierādīšanu" (Proof of stake) u.c. paņēmienus. Un te mēs atgriežamies pie versiju kontroles.

Versiju kontroles rīkos jaunāko izmaiņu apstiprināšana, un līdz ar to arī vēsture pārrakstīšana, ir ātri un efektīvi veicams darbs. Ja nepieciešams nodrošināt vēstures nemainību, pilnīgi pietiek ar to, ka krātuves īpašnieks ir uzticams un vēsturi bez vajadzības nepārraksta. Piemēram, lai arī ir neskaitāmi Linux vēstures kloni, par tās pirmkoda oficiālo vēsturi uzskata Linusa Torvaldsa vēsturi. Ja pastāv aizdomas, ka viens īpašnieks nav pietiekami uzticams, par īsto vēsturi var uzskatīt to, kuru par patiesu uzskata vairākums. Tāpēc bankas, kas vienojas par savstarpēju naudas apmaiņu; augstskolas, kas publicē augstskolu beigušo studentu sarakstu; valsts iestādes vai juridiskas firmas, lai parādītu likumu/līgumu secību un izmaiņas; preču pārvadātāji, kas izseko ražotāju preces — var izmantot arī sadalītu versiju kontroles risinājumu, kur taisnība pieder vairākumam.

Vēstures pārrakstīšanas novēršana vēl negarantē pilnīgu datu uzticamību. Ļaunprātīgi sistēmas lietotāji vēsturē var iekļaut jau sākotnēji nepareizus datus (piemēram, darbinot mezglus, kas apstiprina vispārīgi neatļautus darījumus).

Sekojošā tabula parāda Bitcoin digitālās naudas un Git versiju kontroles risinājumu līdzības un atšķirības, un šo atšķirību piemērotās/nepiemērotās īpašības:

ĪpašībaBitCoinGit
Risinājuma būtībaDigitālā naudaVersiju kontrole
Datu glabāšanaSadalīta krātuvju sistēmaSadalīta krātuvju sistēma
Izmaiņu pievienošanaDarbietilpīga un lēnaViegla un ātra
Izmaiņu satursStrukturēti dati, kurš kuram pārskaita naudu, vai īpaši aprakstīts "viedais līgums"Jebkāds fails
Metadati (skat. ieraksta struktūru zemāk)Ķēdes versija, iepriekšējā bloka jaucējsumma, darījumu jaucējsumma, laiks, darījumu datu izmērs, papildu kodsIzmaiņu apraksts, izmaiņu apstiprinātājs, izmaiņu datums, autors, autora izmaņu datums, izmainīto datu jaucējsumma, iepriekšējo izmaiņu jaucējsumma
Izmaiņu autentifikācijaIzmaiņu parakstīšana ar maka publisko-privāto atslēguNav, bet var izmantot PGP
Izmaiņu vēsture

Viens lineārs zars

/xwiki/bin/download/Blog/180302/bitcoin_chain.png

Vienvirziena straume ar zariem un apvienojumiem.

/xwiki/bin/download/Blog/180302/git_tree.png

Vēstures kontroleAr 256 bitu SHA256 aprēķināta iepriekšējā bloka kontrolsumma un jaunā bloka satursAr 160 bitu SHA1 aprēķināta iepriekšējo izmaiņu kontrolsumma, izmaiņu metadati un mainītā faila kontrolsumma
Notikumu gaita vēsturēViens, lineārs, visgarākais vēstures zarsVairāki, paralēli vēstures zari, kurus var sapludināt
Vēstures pārrakstīšanaPraktiski neiespējama, jo prasa milzīgu darbu un laikuVienkārša un ātra
Kas ir autoritāteAnonīmi mezgli ar lielāko skaitļošanas jaudu"Kanoniskā" krātuve
Izmaiņu salīdzināšanaTiešā veidā nav paredzēta, vēsturē var meklēt darbības ar konkrētu maku/lietotājuBūtiska sistēmas sastāvdaļa, izmaiņas var ērti aplūkot, salīdzinot blakus vai tālu atrodošos versiju izmaiņas

Viena ieraksta datu struktūras salīdzinājums:

  • Bitcoin bloka ieraksta struktūra. Katrs bloks norāda uz iepriekšējo.

    version       = 1
    prevBlockHash = 00000000000008a3a41b85b8b29ad444def299fee21793cd8b9e567eab02cd81
    rootHash      = 2b12fcf1b09288fcaff797d71e950e71ae42b91e8bdb2304758dfcffc2b620e3
    time          = 1305998791
    bits          = 440711666
    nonce         = 2504433986
  • Git izmaiņu ieraksta struktūra. Izmaiņām var būt vairāk par vienu vecāku:

    commit message  = "Jaunākās izmaiņas"
    commiter        = Valdis Vitolins <valdis.vitolins@odo.lv>
    commit date     = Thu Feb 22 15:25:57 2018 +0200
    author          = Valdis Vitolins <valdis.vitolins@odo.lv>
    author date     = Thu Feb 22 15:25:57 2018 +0200
    tree            = 9c435a86e664be00db0d973e981425e4a3ef3f8d
    parents         = [44d99581b287e47562b5865a2bc24c823ec829ac,e71ae42b91e8bdb2304758dfcffc2b620e36732]

Šobrīd top arvien jauni blokķēžu projekti, kuri vairāk vai mazāk cenšas novērst Bitcoin darbībā atklātās problēmas, piemēram:

  • Ethereum, kuru izveidoja 2013. g., darījumu apstiprināšanai izmanto efektīvāku algoritmu ("ieinteresētības pierādīšanu").
  • Hyperledger projekts tika uzsākts 2015. g. un ir vairāk orientēts uz "viedo kontraktu" un vispārīgu biznesa darījumu apstiprināšanu.
  • Zerocoin (2016. g.) izmanto pierādīšanu nezinot, kur kopējā vēsturē nav redzams, tieši no kura maka uz kuru maku ir pārskaitīta nauda.

Tomēr, sliktākais, ko jūs varat darīt, ir piedalīties vēstures apstiprināšanas "bruņotajā sacensībā" un pārskaitīt kādam vienu satoši vai gveju tāpēc vien, ka digitālā nauda, uz ko šis risinājums ir balstīts, to pieprasa.

Apdomājiet, vai tur kur jums sākumā likās, ka ir jāizmanto digitālā nauda, patiesībā nevajag izmantot sadalītu versiju kontroli.

Es nesaku, ka dažādos risinājumos ir jāizmanto tieši Git. Tas ļauj saglabāt jebkādus, nestrukturētus datus un uzturēt vairākas "paralēlas" vēstures. Tāpēc, ja risinājumā nepieciešama tikai viena, "oficiālā" vēsture un jāapstrādā strukturētus datus, Git iespējas var būt pārāk plašas un vispārīgas. Tomēr, veidojot savu kopīgās vēstures risinājumu, versiju kontroles filozofija, paņēmieni un rīki varētu būt piemērotāks pamats, nekā digitālās naudas "viedie kontrakti".

Izveidojis Valdis Vītoliņš 2018-03-02 18:26
Pēdējais mainījis Valdis Vītoliņš 2018-03-03 18:26
 
Xwiki Powered
Creative Commons Attribution 3.0 Unported License