Slušaj robot čitača
Bitkoin: P2P elektronski keš sistem
Satoshi Nakamotosatoshin@gmx.com
www.bitcoin.org
1. Uvod
Trgovina na internetu se gotovo isključvo oslanja na finansijske institucije, koje vrše ulogu treće partije od poverenja koja procesuira elektronsko plaćanje. Dok ovakav sistem funkcioniše dovoljno dobro za većinu transakcija, on i dalje pati od neizbežne mane svih modela baziranih na poverenju. Pošto finansijske institucije ne mogu da izbegnu posredovanje u sporovima, to su transakcije koje se ne mogu poništiti, nemoguće. Cena ovog posredovanja povećava cenu transakcija, ograničavajući time najmanju količinu novca koja se može praktično razmeniti, i sprečavajući mogućnost malih transakcija, a tu je i cena u širem smislu jer se gubi mogućnost da se transakcije učine nepovratnim za nepovratne usluge. Pošto postoji mogućnost povraćaja novca, potreba za poverenjem raste. Trgovci moraju biti oprezni sa svojim mušterijama, gnjaveći ih da daju više ličnih podataka nego što bi im u suprotnom trebalo. Određeni procenat prevare se prihvata kao neizbežan. Ovi troškovi i nesigurnost izvršenja transakcije se mogu izbeći ako se transakcije vrše licem u lice pomoću papirnog novca, ali nikakvi mehanizmi ne postoje da omoguće plaćanje preko komunikacionih kanala bez partije od poverenja.
Javlja se potreba za sistemom elektronskog plaćanja koji se bazira na kriptografskom dokazu umesto na poverenju, omogućavajući dvema voljnim partijama da izvrše transakciju direktno bez potreba za trećom partijom od poverenja. Transakcije koje su računarski zahtevne su nepraktične za poništavanje što bi zaštitilo prodavce od prevare, a rutinski ugovorni mehanizmi se mogu lako implementirati da zaštite kupce. U ovom dokumentu, mi nudimo rešenje za problem duplog trošenja, koristeći P2P distribuiran server vremenskog žiga za kreiranje računarskog dokaza o hronološkom redosledu transakcija. Sistem je bezbedan dokle god pošteni učesnici zajedno, kontrolišu više procesorske snage od bilo koje udružene grupe napadača.
2. Transakcije
Mi definišemo elektronski novac kao lanac digitalnih potpisa. Svaki vlasnik transferuje novac sledećem, tako što digitalno potpiše haš prethodne transakcije i javni ključ sledećeg vlasnika, i doda ih na kraj lanca. Primalac može da verifikuje potpise da potvrdi lanac vlasništva.
Problem je naravno što primalac ne može da verifikuje da neki od prethodnih vlasnika nije dva puta potrošio novac. Uobičajeno rešenje je da se uvede centralna uprava, ili kovnica, koja bi proveravala protiv duplog trošenja. Nakon svake transakcije, novac se mora vratiti u kovnicu da se izda novi novac, i samo novac koji je direktno izdala kovnica, sigurno nije dvaput potrošen. Problem s ovim rešenjem je da sudbina celog monetarnog sistema zavisi od kompanije koja drži kovnicu, gde svaka transakcija mora da se odvija preko njih, baš kao da su banka.
Nama je potreban način da primalac zna da prethodni vlasnici nisu ranije već potpisali neku drugu transakciju. Za naš slučaj, najranija transakcija je ona koja nas zanima, pa nas nije briga za kasnije pokušaje duplog trošenja. Jedini način da se potvrdi odsustvo transakcije je da se zna o svim transakcijama. U modelu sa kovnicom, kovnica zna za sve transakcije i odlučuje koja je stigla prva. Da bi se ovo postiglo bez partije od poverenja, transakcije moraju biti javno obznanjene, i nama treba sistem po kome učesnici mogu da se slože o jedinstvenoj istoriji redosleda po kome su [transakcije] primljene. Primaocu treba dokaz da se u vreme svake transakcije, većina korisnika složila da je ona bila prva primljena.
3. Server vremenskog žiga
Rešenje koje mi nudimo počinje sa serverom vremenskog žiga. Server vremenskog žiga radi tako što uzme haš grupe stavki koje treba vremenski označiti, i javno objavljuje haš, kao kad bi ih objavili u novinama ili u usenet postu[2-5]. Vremenski žig potvrđuje da je podatak postojao u to vreme, očigledno, inače se ne bi pojavio u hašu. Svaki vremenski žig sadrži i prethodni vremenski žig u svom hašu, tako formirajući lanac, gde svaki novi žig ojačava one prethodne.
4. Dokaz o radu
Da bismo implementirali distribuiran server vremenskog žiga na P2P osnovi, trebaće nam sistem za dokaz o radu, sličan onom koga Adam Back koristi u Hashcash-u, umesto objavljivanja u novinama ili u Usenet postovima. Dokaz o radu uključuje potragu za vrednošću koja bi, kad se hašuje, npr sa SHA-256, davala haš koji počinje sa zadatim brojem nula. Prosečan potreban rad je eksponencijalan broju bitova koji su nula, i može biti verifikovan izvršavanjem samo jednog haša.
Za našu mrežu vremenskog žiga, implementiramo dokaz o radu tako što uvećavamo nons dok se ne nađe vrednost koja daje haš koji počinje s traženim brojem nula. Kada je napor CPU-a potrošen da zadovolji dokaz o radu, blok se ne može više promeniti bez ponavljanja rada. Kako su kasniji blokovi lančano povezani sa njim, to znači da rad da se izmeni blok uključuje i ponavljanje rada za sve blokove koji slede.
Dokaz rada takođe rešava problem utvrđivanja većinskog mišljenja. Ako je većina bazirana na jedna-IP-adresa-jedan-glas, to bi onda svako ko može da alocira veći broj IP adresa mogao da je podrije. Dokaz rada je u suštini jedan procesor, jedan glas. Većinska odluka je prezentovana najdužim lancem, u koji je uložen najveći dokaz rada. Ako je većina CPU snage kontrolisana od strane poštenih korisnika, pošten lanac će rasti brže i prerastati bilo koji drugi lanac. Da bi se izmenio prethodni blok, napadač mora da ponovi dokaz rada tog bloka i svih blokova koji slede, i da stigne i prestigne rad poštenih korisnika. Pokazaćemo kasnije da verovatnoća da sporiji napadač sustigne pošten lanac opada eksponencijalno sa svakim sledećim dodatim blokom
Kako bi se kompenzovalo povećanje brzine hardvera, kao i varijabilno interesovanje učesnika tokom vremena, težina dokaza rada se određuje na osnovu promenjivog proseka blokova nastalih u jednom satu. Ako se blokovi dodaju previše brzo, težina se povećava.
5. Mreža
Koraci za održavanje mreže su sledeći
- Nove transakcije se obznjanjuju svim učesnicima
- Svaki učesnik skuplja sve nove transakcije u blok
- Svaki učesnik radi na pronalaženju teškog dokaza rada za svoj blok
- Kada učesnik pronađe dokaz rada, obznjanjuje ga svim ostalim učesnicima
- Ostali učesnici prihvataju blok samo ako su sve transakcije u njemu validne i nisu već potrošene
- Učesnici obznjanjuju svoje prihvatanje bloka tako što rade na kreiranju novog bloka u lancu, koristeći haš novoprihvaćenog bloka kao prethodni haš
Učesnici uvek smatraju da je najduži lanac tačan, i nastavljaju da rade na njegovom produženju. Ako dva učesnika objave različite verzije sledećeg bloka u isto vreme, neki učesnici će prvo primiti jedan ili drugi blok. U takvom slučaju, učesnici rade na bloku koji su prvi primili, ali čuvaju drugu granu za slučaj da ona postane duža. Kada se pronađe sledeći dokaz rada i jedna grana postane duža, učesnici koji su radili na drugoj grani prelaze na dužu granu.
Novoobznjanene transakcije ne moraju obavezno da stignu do svih učesnika. Dokle god stignu do mnogih učesnika, ubrzo će biti uvršćene u blok. Objavljivanje blokova je takođe tolerantno na propuštene poruke. Ako učesnik ne primi blok, zatražiće ga kada primi sledeći blok i shvati da je propustio jedan.
6. Podsticaj
Po konvenciji, prva transakcija na bloku je specijalna transakcija koja započinje novi novčić čiji je vlasnik onaj koji je kreirao blok. Ovo predstavlja podsticaj za učesnike da podržavaju mrežu, i omogućava način da se novac pusti u cirkulaciju, pošto ne postoji centralna uprava koja bi novac izdavala. Stalno dodavanje konstantne količine novog novca je analogno rudarima zlata koji troše resurse da dodaju zlato u cirkulaciju. U našem slučaju, troši se CPU vreme.
Podsticaj se takođe može postići novčanom naknadom. Ako je izlazna vrednost transakcije manja od ulazne vrednosti transakcije, razlika predstavlja novčanu naknadu koja se dodaje na vrednost podsticaja bloka koji sadrži transakciju. Kada se unapred definisana količina novca nađe u cirkulaciji, podsticaj može u celosti da pređe na novčane naknade i time bude u celosti obezbeđen od inflacije.
Podsticaj može pomoći da učesnici ostanu pošteni. Ako bi gramzivi napadač uspeo da skupi veću CPU snagu od poštenih učesnika, on bi morao da odluči da li hoće da vara ljude tako što bi krao nazad svoje prethodne uplate, ili tako što bi kreirao novi novac. Ispostavlja se da mu je profitabilnije da igra po pravilima, gde ta pravila njega nagrađuju sa više novca nego sve ostale zajedno, nego da potkopava sistem i validnost sopstvenog bogatstva.
7. Oslobađanje prostora na disku
Kada se najnovije transakcije zatrpaju sa dovoljno novijih blokova, potrošene transakcije pre nje mogu da se obrišu da oslobode prostor na disku. Da se ovo postigne a da se ne poremeti haš bloka, transakcije se hašuju u Merkle stablu, gde se samo koren uključuje u haš bloka. Stari blokovi se onda mogu zbiti otsecanjem grana sa stabla. Unutrašnji hašovi ne moraju da se čuvaju.
Header bloka bez transakcija bi bio oko 80 bajta. Ako zamislimo da se blokovi generišu svakih 10 minuta, 80 bajta * 6 * 24 * 365 = 4.2MB godišnje. Kako se kompjuteri uglavnom prodaju sa 2GB rama u 2008-oj, i s Moore-ovim zakonom koji predviđa porast od 1.2GB godišnje, prostor ne bi trebalo da predstavlja problem čak i ako se headeri blokova moraju čuvati u memoriji.
8. Pojednostavljena verifikacija plaćajna
Moguće je verifikovati uplate bez pokretanja cele mreže. Korisnik samo treba da ima kopiju blok headera najdužeg lanca, koji može dobiti upitima ka učesnicima u mreži dok nije siguran da ima najduži lanac, i da uzme Merkle granu koja povezuje transakciju sa blokom u kojoj je vremenski mapirana. Ne može da proveri transakciju sam za sebe, ali linkovanjem ka mestu u lancu, može da vidi da ju je učesnik prihvatio, i blokovi dodati kasnije potvrđuju da ju je i mreža prihvatila.
Kao takva, verifikacija ima smisla samo dok pošteni učesnici formiraju mrežu, ali je osetljivija ako napadač osvoji mrežu. Dok učesnici u mreži mogu da verifikuju transakcije za sebe, pojednostavljeni metod može biti prevaren ako napadač lažira transakcije dokle god napadač može da vlada mrežom. Jedna strategija zaštite od ovoga bi bila da se prihvate upoorenja od mreže kada detektuju nevalidan blok, potičući korisnički softver da skine ceo blok da potvrdi problem. Biznisi koji primaju česte uplate će verovatno želeti da sami budu učesnici u mreži zarad nezavisnije sigurnosti i brže verifikacije.
9. Kombinovanje i vrednosti
Mada bi bilo moguće baratati s apoenima individualno, bilo bi neoprezno napraviti posebnu transakciju za svaki cent u transferu. Da se omogući deljenje vrednosti i njeno kombinovanje, transakcije sadrže više inputa i outputa. Normalno bi bio ili jedan input od ranije veće transakcije, ili više inputa koji kombinuju manje količine, i najviše dva outputa: jedan za uplatu, i jedan koji vraća kusur, ako ga ima, nazad pošiljaocu.
Trebalo bi istaći da ovo rasparčavanje, gde jedna transakcija zavisi od nekoliko manjih, i one zavise od drugih još manjih, ne predstavlja problem. Nikada neće postojati potreba da se sastavi kompletna verzija istorije transakcija.
10. Privatnost
Tradicionalno bankarstvo postiže određeni nivo privatnosti tako što limitira dostupnost informacija o učesnicima u transakciji i trećoj partiji od poverenja. Pošto je ovde neophodo da se sve transakcije javno objave, onemogućava se ovakvo rešenje, ali se privatnost i dalje može održavati narušavanjem toka informacija na drugom mestu: tako što će javni ključevi biti anonimni. Javnost će videti da neko šalje količinu novca nekom drugom, ali neće sadržati informaciju o tome ko vrši transakcije. Ovo je slično nivou informacija koje objavljuju berze, gde su vreme i veličina posebnih trgovina, "traka", javno objavljeni, ali se ne objavljuje ko su partije koje trguju.
Kao dodatnu meru zaštite, novi par ključeva bi trebalo koristiti za svaku transakciju kako ih ne bi bilo moguće povezati sa jedinstvenim vlasnikom. Neko linkovanje je neizbežno, zbog transakcija sa više inputa, što otkriva da su njihovi inputi bili u vlasništvu iste osobe. Rizik je da ako se vlasnik ključa otkrije, linkovanje bi moglo da otkrije ostale transakcije tog istog korisnika.
11. Proračuni
Uzimamo u obzir scenario u kome napadač pokušava da kreira alternativni lanac brže od poštenog lanca. Čak iako ovo postigne, to ne omogućava pravljenje proizvoljnih izmena na lancu, kao što su kreiranje nove vrednosti ni iz čega, ili uzmanje novca koji mu nikada nije pripadao. Učesnici neće prihvatiti individualne transakcije kao plaćanje, i pošteni učesnici nikada neće prihvatiti blok koji ih sadrži. Napadač može samo da proba da izmeni neku od svojih skorijih transakcija da povrati novac.
Utrka između poštenog lanca i napadača se može okarakterisati kao binomialna slučajna šetnja. Uspeh je okarakterisan time što se pošten lanac produži za jedan blok, čime mu se povećava dužina za 1, a neuspeh je ako lanac napadača bude produžen za jedan blok smanjujući razmak za -1.
Verovatnoća da napadač sa trenutnim deficitom sustigne pošten lanac, je analogna problemu propasti kockara. Zamislimo da kockar sa neograničenim kreditom počne u deficitu, i igra možda beskonačan broj krugova u pokušaju da ostane na nuli. Možemo preračunati verovatnoću da on ikada dosegne nulu, ili da napadač ikada sustigne pošten lanac
Gde je p verovatnoća da pošteni učesnik nađe novi blok, a q verovatnoća da napadač nađe novi blok
qz je verovatnoća da napadač ikada stigne pošten lanac ako kasni z blokova
Za datu pretpostavku da je p > q, verovatnoća opada eksponencijalno kako broj blokova koje napadač treba da stigne raste. Kako su šanse protiv njega, ako ne postigne srećan proboj rano, njegove šanse postaju mizerno male kako sve više kasni.
Sada uzmimo koliko dugo primalac nove transakcije treba da čeka pre nego što je dovoljno siguran da pošiljalac ne može da promeni transakciju. Smatramo da je pošiljalac napadač koji hoće da učini da primalac veruje neko vreme da mu je plaćeno, a onda da okrene i da plati samom sebi nakon što neko vreme prođe. Primalac će biti obavešten kada se to desi, ali se pošiljalac nada da će tada biti prekasno.
Primalac kreira novi ključ i daje javni ključ pošiljaocu malo pre nego što pošiljalac potpiše transakciju. Ovo sprečava pošiljaoca da unapred pripremi lanac blokova radeći na njemu dovoljno dugo dok mu se ne posreći da njegov lanac bude dovoljno dugačak, pa da onda izvrši uplatu. Kada se transakcija pošalje, nepošteni pošiljalac počinje da radi na paralelnom lancu koji sadrži izmenjenu verziju njegove transakcije.
Primalac čeka dok se transakcija ne doda na blok, i z blokova je bilo linkovano na njega. On (primalac) ne zna koliki progres je napadač načinio, ali pretpostavljajući da pošteni blokovi troše neko određeno vreme po bloku, napadačev progres će imati Poasonovu raspodelu sa očekivanom vrednošću:
Da bi se dobila verovatnoća da bi napadač i dalje mogao da sustigne pošten lanac, množimo Poasonovu gustinu za svaku količinu progresa koji je mogao postići, sa verovatnoćom da bi mogao da sustigne pošten lanac od tog momenta:
Preraspodelom da se izbegne sabiranje u beskonačnost...
u C kôdu:
#include <math.h>
double AttackerSuccessProbability(double q, int z)
{
double p = 1.0 - q;
double lambda = z * (q / p);
double sum = 1.0;
int i, k;
for (k = 0; k <= z; k++)
{
double poisson = exp(-lambda);
for (i = 1; i <= k; i++)
poisson *= lambda / i;
sum -= poisson * (1 - pow(q / p, z - k));
}
return sum;
}
Za neke testove, vidimo da verovatnoća opada eksponencijalno sa z.
q=0.1
z=0 P=1.0000000
z=1 P=0.2045873
z=2 P=0.0509779
z=3 P=0.0131722
z=4 P=0.0034552
z=5 P=0.0009137
z=6 P=0.0002428
z=7 P=0.0000647
z=8 P=0.0000173
z=9 P=0.0000046
z=10 P=0.0000012
q=0.3
z=0 P=1.0000000
z=5 P=0.1773523
z=10 P=0.0416605
z=15 P=0.0101008
z=20 P=0.0024804
z=25 P=0.0006132
z=30 P=0.0001522
z=35 P=0.0000379
z=40 P=0.0000095
z=45 P=0.0000024
z=50 P=0.0000006
Rešavanjem za P < 0.1%
P < 0.001
q=0.10 z=5
q=0.15 z=8
q=0.20 z=11
q=0.25 z=15
q=0.30 z=24
q=0.35 z=41
q=0.40 z=89
q=0.45 z=340
12. Zaključci
Mi nudimo sistem za elektronsko transakcionisanje bez potreba za oslanjanjem na poverenje. Krenuli smo sa uobičajenim okvirom novčića sačinjenih od digitalnih potpisa, koji omogućavaju jaku kontrolu vlasništva, ali nisu kompletni bez načina da se spreči duplo trošenje. Da bismo ovo rešili, mi nudimo P2P mrežu koja koristi dokaz rada da sačinimo javnu istoriju transakcija koja brzo postaje nepraktična da je napadač izmeni ako pošteni učesnici kontrolišu većinsku CPU snagu. Mreža je robustna u svojoj nestruktuiranoj jednostavnosti. Učesnici svi rade u isto vreme s vrlo malo koordinacije. Ne moraju da se identifikuju, pošto se poruke ne rutiraju na neko određeno mesto, i samo moraju da se dostave na osnovu najboljeg napora. Učesnici mogu svojevoljno napustiti mrežu, prihvatajući dokaz rada kao dokaz o onome što se desilo dok su bili odsutni. Glasaju sa svojom CPU snagom, oglašavajući svoje prihvatanje validnih blokova, time što rade na njihovom proširenju, i odbijaju nevalidne blokove time što odbijaju da rade na njima. Bilo koja pravila i podsticaji se mogu postići pomoću ovog mehanizma koncenzusa
Članak prvi put objavljen: 27.4.2021.
Poslednje izmene: 10.2.2022.
Autor: k.