Povzetek. Različica elektronske gotovine, ki bi bila izključno medsebojna, bi omogočala, da bi spletna plačila pošiljala ena stranka drugi neposredno, ne da bi šla prek finančne institucije. Digitalni podpisi so del rešitve, vendar se glavne prednosti izgubijo, če je za preprečevanje dvojne porabe še vedno potrebna zaupanja vredna tretja oseba. Predlagamo rešitev problema dvojne porabe z uporabo medsebojnega (peer-to-peer) omrežja. Omrežje časovno označuje transakcije tako, da jih z hashanjem vključi v stalno verigo dokazov o delu, ki temeljijo na hashanju, in tako oblikuje zapis, ki ga ni mogoče spremeniti brez ponovne izvedbe dokaza o delu. Najdaljša veriga ni le dokaz za zaporedje dogodkov, ki smo jim bili priča, temveč tudi dokaz, da je izhajala iz največjega bazena procesorske moči. Dokler večino procesorske moči nadzorujejo vozlišča, ki ne sodelujejo pri napadih na omrežje, bodo ustvarila najdaljšo verigo in prehitela napadalce. Samo omrežje zahteva minimalno strukturo. Sporočila se oddajajo po najboljših močeh, vozlišča pa lahko poljubno zapustijo omrežje in se mu ponovno pridružijo, pri čemer kot dokaz o tem, kaj se je zgodilo, ko jih ni bilo, sprejmejo najdaljšo verigo dokaza o delu.
Trgovanje na internetu se pri obdelavi elektronskih plačil skoraj izključno opira na finančne institucije kot zaupanja vredne tretje osebe. Čeprav sistem deluje dovolj dobro za večino transakcij, ima še vedno pomanjkljivosti, značilne za model, ki temelji na zaupanju. Popolnoma nepovratne transakcije v resnici niso mogoče, saj se finančne institucije ne morejo izogniti posredovanju v sporih. Stroški posredovanja povečujejo stroške transakcij, saj omejujejo najmanjšo praktično velikost transakcij in onemogočajo majhne priložnostne transakcije, širši strošek pa je tudi izguba možnosti izvajanja nepovratnih plačil za nepovratne storitve. Z možnostjo preobrata se širi potreba po zaupanju. Trgovci morajo biti pozorni na svoje stranke in od njih zahtevati več informacij, kot bi jih sicer potrebovali. Določen odstotek goljufij je sprejet kot neizogiben. Tem stroškom in negotovostim pri plačilih se je mogoče izogniti osebno z uporabo fizične valute, vendar ni mehanizma za izvajanje plačil prek komunikacijskega kanala brez zaupanja vredne stranke. Potreben je elektronski plačilni sistem, ki bo namesto na zaupanju temeljil na kriptografskem dokazu in bo dvema voljnima strankama omogočal neposredno medsebojno poslovanje brez potrebe po zaupanja vredni tretji osebi. Transakcije, ki jih je računsko nepraktično razveljaviti, bi prodajalce zaščitile pred goljufijami, za zaščito kupcev pa bi bilo mogoče zlahka uvesti rutinske mehanizme hrambe. V tem članku predlagamo rešitev problema dvojne porabe z uporabo medsebojno porazdeljenega strežnika časovnih žigov za ustvarjanje računalniškega dokaza o kronološkem vrstnem redu transakcij. Sistem je varen, dokler poštena vozlišča skupaj nadzorujejo več procesorske moči kot katera koli sodelujoča skupina napadalnih vozlišč.
Elektronski kovanec opredelimo kot verigo digitalnih podpisov. Vsak lastnik prenese kovanec na naslednjega tako, da digitalno podpiše hash prejšnje transakcije in javni ključ naslednjega lastnika ter ju doda na konec kovanca. Prejemnik plačila lahko preveri podpise, da preveri verigo lastništva.
Težava je seveda v tem, da prejemnik plačila ne more preveriti, ali je eden od lastnikov kovanec uporabil dvakrat. Običajna rešitev je uvedba zaupanja vrednega osrednjega organa ali kovnice, ki vsako transakcijo preveri, ali je bila dvakrat uporabljena. Po vsaki transakciji je treba kovanec vrniti kovnici, da izda nov kovanec, in le za kovance, izdane neposredno v kovnici, velja, da niso dvakrat zapravljeni. Težava te rešitve je, da je usoda celotnega denarnega sistema odvisna od podjetja, ki upravlja kovnico, saj mora vsaka transakcija iti prek njega, tako kot v banki. Potrebujemo način, da prejemnik plačila ve, da prejšnji lastniki niso podpisali nobene prejšnje transakcije. Za naše namene je pomembna najzgodnejša transakcija, zato nas poznejši poskusi dvojne porabe ne zanimajo. Edini način za potrditev odsotnosti transakcije je, da se zavedamo vseh transakcij. Pri modelu, ki je temeljil na kovnici, je bila kovnica seznanjena z vsemi transakcijami in je odločala o tem, katera je prispela prva. Da bi to dosegli brez zaupanja vredne stranke, morajo biti transakcije javno objavljene [1], poleg tega pa potrebujemo sistem, s katerim se udeleženci dogovorijo o enotni zgodovini vrstnega reda, v katerem so jih prejeli. Prejemnik plačila potrebuje dokaz, da se je ob vsaki transakciji večina vozlišč strinjala, da je bila prejeta prva.
Rešitev, ki jo predlagamo, se začne s strežnikom časovnih žigov. Strežnik časovnega žiga deluje tako, da vzame bloka elementov, ki jih je treba označiti s časovnim žigom, in ga na široko objavi, na primer v časopisu ali objavi na Usenetu [2-5]. Časovni žig dokazuje, da so podatki morali obstajati ob tistem času, bi lahko bili vključeni v hash. Vsak časovni žig vključuje prejšnji časovni žig v svojem hashu in tvori verigo, pri čemer vsak dodatni časovni žig okrepi prejšnjega.
Za izvajanje porazdeljenega strežnika časovnih žigov po medsebojnem načelu bomo morali uporabiti sistem dokazovanja dela, podoben sistemu Hashcash [6] Adama Backa, in ne objav v časopisih ali Usenetu. Dokazovanje dela vključuje iskanje vrednosti, ki se po hashiranju, na primer s SHA-256, začne s številom ničelnih bitov. Povprečno zahtevano delo je eksponentno s številom bitov in ga je mogoče preveriti z izvedbo enega samega hasha.
V našem omrežju časovnih žigov izvajamo dokazovanje dela s povečevanjem nonce v omrežju dokler ne najdemo vrednosti, ki zagotavlja zahtevano število ničelnih bitov v hashu bloka. Ko je bil vložen napor procesorja povečan, da bi zadostil dokazilu o delu, bloka ni mogoče spremeniti, ne da bi ponovno opravili delo. Ker so za njim verižno povezani kasnejši bloki, bi delo za spremembo bloka vključevalo ponovno izdelavo vseh blokov za njim.
Dokazilo o delu rešuje tudi problem določanja zastopanosti pri večinskem odločanju. Če bi večina temeljila na načelu "en naslov IP en glas", bi jo lahko spodkopal vsakdo, ki bi lahko dodelil veliko naslovov IP. Dokaz o delu je v bistvu en procesor na en glas. Odločitev večine predstavlja najdaljša veriga, v katero je vloženo največ truda za dokazovanje dela. Če večino procesorske moči nadzorujejo poštena vozlišča, bo poštena veriga rasla najhitreje in prehitela vse konkurenčne verige. Da bi spremenil pretekli blok, bi moral napadalec ponovno izvesti dokazovanje dela tega bloka in vseh blokov za njim ter nato dohiteti in preseči delo poštenih vozlišč. Kasneje bomo pokazali, da se verjetnost, da bo počasnejši napadalec nadoknadil zaostanek, eksponentno zmanjšuje z dodajanjem naslednjih blokov. Za izravnavo naraščajoče hitrosti strojne opreme in spreminjajočega se zanimanja za delujoča vozlišča s časom se težavnost dokaza o opravljenem delu določi z drsečim povprečjem, ki meri na povprečno število blokov na uro. Če se ustvarjajo prehitro, se težavnost poveča.
Koraki za upravljanje omrežja so naslednji:
1) Nove transakcije se razpošljejo vsem vozliščem.
2) Vsako vozlišče zbere nove transakcije v blok.
3) Vsako vozlišče dela na iskanju težavnega dokaza o delu za svoj blok.
4) Ko vozlišče najde dokaz za delo, razpošlje blok vsem vozliščem.
5) Vozlišča sprejmejo blok le, če so vse transakcije v njem veljavne in niso že porabljene.
6) Vozlišča svoj sprejem bloka izrazijo tako, da delajo na ustvarjanju naslednjega bloka v
verigi, pri čemer kot prejšnji hash uporabijo hash sprejetega bloka.
Vozlišča vedno smatrajo, da je najdaljša veriga pravilna, in jo bodo še naprej podaljševala. Če dve vozlišči hkrati oddajata različni različici naslednjega bloka, lahko nekatera vozlišča prej prejmejo eno ali drugo. V takem primeru se lotijo prvega prejetega dela, drugo vejo pa shranijo, če bi se podaljšala. Naveza se prekine, ko se najde naslednji dokaz o delu in ena veja postane daljša; vozlišča, ki so delala na drugi veji, bodo takrat preklopila na daljšo vejo. 3 Blok Prev hash Nonce Tx Tx Tx ... Blok Prev Hash Nonce Tx Tx Tx ... Ni nujno, da morajo nova sporočila o transakcijah doseči vsa vozlišča. Če dosežejo veliko vozlišč, bodo kmalu prišle v blok. Blokovna oddajanja so tolerantna tudi do prekinjenih sporočil. Če vozlišče ne prejme bloka, ga bo zahtevalo, ko bo prejelo naslednji blok in ugotovilo, da ga je zamudilo.
Po dogovoru je prva transakcija v bloku posebna transakcija, s katero se začne izdaja novega kovanca, ki je v lasti ustvarjalca bloka. To vozlišča spodbuja k podpori omrežja in zagotavlja način za začetno distribucijo kovancev v obtok, saj ni centralnega organa, ki bi jih izdajal. Stalno dodajanje konstantne količine novih kovancev je podobno kot pri rudarjih zlata, ki porabljajo sredstva za dodajanje zlata v obtok. V našem primeru gre za porabo procesorskega časa in električne energije. Spodbuda se lahko financira tudi s provizijami za transakcije. Če je izhodna vrednost transakcije manjša od njene vhodne vrednosti, je razlika transakcijska provizija, ki se doda spodbujevalni vrednosti bloka, ki vsebuje transakcijo. Ko je v sistem vstopilo vnaprej določeno število kovancev
v obtoku, lahko spodbuda v celoti preide na provizije za transakcije in je popolnoma brez inflacije. Spodbuda lahko vozlišča dodatno spodbudi, da ostanejo poštena. Če lahko pohlepni napadalec zbere več procesorske moči kot vsa poštena vozlišča, se mora odločiti, ali jo bo uporabil za goljufanje ljudi s krajo svojih plačil ali za ustvarjanje novih kovancev. Bolj se mu splača igrati po pravilih, ki mu prinašajo več novih kovancev kot vsem drugim skupaj, kot pa spodkopavati sistem in veljavnost lastnega bogastva.
Ko je zadnja transakcija v kovancu zakopana pod zadostnim številom blokov, se lahko porabljene transakcije pred njo zavržejo, da se prihrani prostor na disku. Da bi to olajšali, ne da bi razbili hash bloka, se transakcije hashajo v drevesu Merkle [7][2][5], pri čemer je v hash bloka vključen samo koren. Stare bloke lahko nato zgoščite tako, da odrežete veje drevesa. Notranjih hashev ni treba shranjevati.
Glava bloka brez transakcij bi obsegala približno 80 bajtov. Če predpostavimo, da se bloki ustvarijo vsakih 10 minut, je 80 bajtov * 6 * 24 * 365 = 4,2 MB na leto. Pri računalniških sistemih od leta 2008 običajno prodajajo z 2 GB pomnilnika RAM, Moorov zakon pa napoveduje trenutno rast 1,2 GB na leto, shranjevanje ne bi smelo biti problem, tudi če je treba glave blokov hraniti v pomnilniku.
Plačila je mogoče preveriti, ne da bi bilo treba zagnati celotno omrežno vozlišče. Uporabnik mora hraniti le kopijo glave blokov najdaljše verige dokazovanja dela, ki jo lahko dobi s poizvedbo omrežnih vozlišč, dokler se ne prepriča, da ima najdaljšo verigo, in pridobiti vejo Merkle, ki povezuje transakcijo z blokom, v katerem je časovno označena. Sam transakcije ne more preveriti, lahko pa s povezavo z mestom v verigi vidi, da jo je omrežno vozlišče sprejelo, bloki, dodani za njo, pa dodatno potrjujejo, da jo je omrežje sprejelo.
Tako je preverjanje zanesljivo, dokler omrežje nadzorujejo poštena vozlišča, vendar je bolj ranljivo, če omrežje obvladuje napadalec. Medtem ko lahko vozlišča omrežja preverijo transakcije sami, lahko poenostavljeno metodo zavajajo napadalčeve izmišljene transakcije tako dolgo, dokler ima napadalec moč nad omrežjem. Ena od strategij za zaščito pred tem bi bila sprejemanje opozoril omrežnih vozlišč, ko zaznajo neveljaven blok, kar bi uporabniško programsko opremo spodbudilo k prenosu celotnega bloka, opozorjene transakcije pa bi potrdile neskladnost. Podjetja, ki pogosto prejemajo plačila, bodo verjetno še vedno želela upravljati svoja vozlišča zaradi bolj neodvisne varnosti in hitrejšega preverjanja.
Čeprav bi bilo mogoče kovance obravnavati posamično, bi bilo nerodno za vsak cent pri prenosu opraviti ločeno transakcijo. Da bi omogočili delitev in združevanje vrednosti, transakcije vsebujejo več vhodov in izhodov. Običajno je na voljo en vhod iz večje predhodne transakcije ali več vhodov, ki združujejo manjše zneske, in največ dva izhoda: eden za plačilo, drugi pa vrača morebitno razliko pošiljatelju.
Opozoriti je treba, da pri tem ne gre za pojav "fan-out", ko je transakcija odvisna od več transakcij, te pa še od več drugih. Nikoli ni treba izpisati celotne samostojne kopije zgodovine transakcije.
Tradicionalni bančni model dosega določeno raven zasebnosti z omejevanjem dostopa do informacij na vpletene stranke in zaupanja vredno tretjo osebo. Potreba po javni objavi vseh transakcij to metodo izključuje, vendar je zasebnost še vedno mogoče ohraniti s prekinitvijo pretoka informacij na drugem mestu: z ohranjanjem anonimnosti javnih ključev. Javnost lahko vidi, da nekdo pošilja znesek nekomu drugemu, vendar brez informacij, ki bi transakcijo povezovale s komer koli. To je podobno ravni informacij, ki jih objavljajo borze, kjer sta čas in obseg posameznih transakcij, "trak", objavljena, vendar brez podatka o tem, kdo so bile stranke.
Kot dodatni požarni zid je treba za vsako transakcijo uporabiti nov par ključev, da se prepreči povezava s skupnim lastnikom. Nekaj povezav je še vedno neizogibnih pri večvhodnih transakcijah, ki neizogibno razkrivajo, da so bili njihovi vhodi v lasti istega lastnika. Tveganje je v tem, da če se razkrije lastnik ključa, lahko povezovanje razkrije druge transakcije, ki so pripadale istemu lastniku.
Obravnavamo scenarij, v katerem napadalec poskuša ustvariti nadomestno verigo hitreje od poštene verige. Tudi če to uspe, sistem ni odprt za poljubne spremembe, kot je ustvarjanje vrednosti iz zraka ali jemanje denarja, ki napadalcu nikoli ni pripadal. Vozlišča ne bodo sprejela neveljavne transakcije kot plačila, poštena vozlišča pa ne bodo nikoli sprejela bloka, ki jih vsebujejo. Napadalec lahko le poskuša spremeniti eno od svojih transakcij, da bi vzel nazaj denar, ki ga je pred kratkim porabil.
Tekmo med pošteno verigo in verigo napadalca lahko opišemo kot "binomsko naključno hojo" (Binomial random Walk). Uspešen dogodek je podaljšanje poštene verige za en blok, s čimer se poveča njeno vodstvo za +1, neuspeh pa je, da se napadalčeva veriga podaljša za en blok, kar zmanjša razliko za -1.
Verjetnost, da bo napadalec nadoknadil določen primanjkljaj, je podobna problemu igralčevega uničenja (Gambler's Ruin problem). Predpostavimo, da igralec na srečo z neomejenimi sredstvi začne s primanjkljajem in igra potencialno neskončno število poskusov, da bi dosegel dobiček. Verjetnost, da bo kdaj dosegel izkupiček ali da bo napadalec kdaj dohitel pošteno verigo, lahko izračunamo na naslednji način [8]:
p = verjetnost, da pošteno vozlišče najde naslednji blok
q = verjetnost, da napadalec najde naslednji blok
qz = verjetnost, da bo napadalec kdaj dohitel z blokov
Glede na našo predpostavko, da je p > q, verjetnost eksponentno upada s povečevanjem števila blokov, ki jih mora napadalec dohiteti. Če napadalec že na začetku ne naredi srečnega koraka naprej, so njegove možnosti ob takšnem številu blokov vedno manjše, saj je njegov zaostanek vedno večji.
Zdaj preučimo, koliko časa mora prejemnik nove transakcije počakati, da je dovolj prepričan, da pošiljatelj ne more spremeniti transakcije. Predpostavljamo, da je pošiljatelj napadalec, ki želi prejemnika prepričati, da mu je nekaj časa plačeval, nato pa ga zamenjati in po preteku določenega časa plačati nazaj sebi. Prejemnik bo opozorjen, ko se to zgodi, vendar pošiljatelj upa, da bo prepozno.
Prejemnik ustvari nov par ključev in tik pred podpisom pošiljatelju posreduje javni ključ. To pošiljatelju preprečuje, da bi vnaprej pripravil verigo blokov z delom na njem, dokler se mu ne posreči priti dovolj daleč naprej, nato pa v tem trenutku izvede transakcijo. Ko je transakcija poslana, začne nepošteni pošiljatelj v tajnosti delati na vzporedni verigi, ki vsebuje alternativno različico njegove transakcije.
Prejemnik počaka, da se transakcija doda v blok in se za njo poveže z blokov. Ne pozna natančnega napredka, ki ga je naredil napadalec, vendar ob predpostavki, da so pošteni bloki potrebovali povprečni pričakovani čas na blok, bo napadalčev potencialni napredek Poissonova porazdelitev s pričakovano vrednostjo.
Predlagali smo sistem za elektronske transakcije brez zaupanja. Začeli smo z običajnim okvirom kovancev iz digitalnih podpisov, ki zagotavlja močan nadzor nad lastništvom, vendar je nepopoln brez načina za preprečevanje dvojne porabe. Da bi to rešili, smo predlagali medsebojno omrežje (peer-to-peer), ki uporablja dokazovanje dela za beleženje javne zgodovine transakcij, ki hitro postane računsko nepraktična za napadalca, če poštena vozlišča nadzorujejo večino procesorske moči. Omrežje je robustno v svoji nestrukturirani preprostosti. Vozlišča delajo vsa hkrati in se le malo usklajujejo. Ni jih treba identificirati, saj sporočila niso usmerjena na določeno mesto in jih je treba dostaviti le po najboljših močeh. Vozlišča lahko zapustijo omrežje in se vanj ponovno vključijo po želji, pri čemer sprejmejo verigo dokazov o delu kot dokaz, kaj se je zgodilo, ko jih ni bilo. Glasujejo s svojo močjo procesorja in s tem izražajo, da sprejemajo veljavne bloke tako, da jih podaljšujejo, neveljavne bloke pa zavračajo tako, da ne želijo delati na njih. Vsa potrebna pravila in spodbude je mogoče uveljaviti s tem mehanizmom soglasja.