Notă: Pe 31 octombrie 2008, Satoshi Nakamoto a publicat white paper-ul Bitcoin pe site-ul P2P foundation. Cu ocazia aniversării a 16-a a publicării acestui document care a schimbat pentru totdeauna lumea financiară, Golden Finance publică din nou versiunea în limba chineză a white paper-ului Bitcoin.
Autor: Satoshi Nakamoto; Traducător: Li Xiaolai
Rezumat: Un sistem pur de numerar electronic bazat pe peer-to-peer va permite plăți online direct de la o parte la alta, fără a fi nevoie de intermediari financiari. Deși semnăturile digitale oferă o parte a soluției, dacă este încă nevoie de o terță parte de încredere pentru a preveni plățile duble, atunci avantajul principal al plăților electronice este anulat. Propunem o soluție care folosește o rețea peer-to-peer pentru a rezolva problema plăților duble. Rețeaua peer-to-peer va marca fiecare tranzacție cu un timestamp, înregistrând datele hash ale tranzacției într-un lanț bazat pe dovada de lucru, care nu poate fi modificat fără a fi complet refăcut. Cel mai lung lanț, pe de o parte, servește pentru a demonstra evenimentele care au fost atestate și ordinea lor, iar, în același timp, pentru a demonstra că provine din cea mai mare bază de putere de calcul. Atâta timp cât majoritatea puterii de calcul este controlată de noduri benevole - adică nu colaborează cu noduri care încearcă să atace rețeaua - nodurile benevole vor genera cel mai lung lanț și vor depăși viteza atacatorului. Această rețea trebuie să aibă o structură minimizată. Informațiile vor fi difuzate cu cea mai mare efort, nodurile se pot conecta și deconecta liber; dar, atunci când se alătură, trebuie să accepte cel mai lung lanț de dovadă de lucru ca dovadă a tot ceea ce s-a întâmplat în perioada în care nu au participat.
1. Introducere (Introduction)
Comerțul pe internet depinde aproape complet de instituții financiare ca terțe părți de încredere pentru a procesa plățile electronice. Deși acest sistem funcționează bine pentru majoritatea tranzacțiilor, este totuși afectat de defectele inerente modelului bazat pe încredere. Tranzacțiile complet ireversibile nu sunt de fapt posibile, deoarece instituțiile financiare nu pot evita arbitrarea disputelor. Costurile de arbitraj cresc costul tranzacțiilor, limitând astfel dimensiunea minimă posibilă a tranzacțiilor și pur și simplu împiedicând multe tranzacții de mică valoare. În plus, există costuri și mai mari: sistemul nu poate oferi plăți ireversibile pentru servicii ireversibile. Posibilitatea de reversare a plăților creează o cerință omniprezentă de încredere. Comercianții trebuie să se ferească de clienții lor, obligând clienții să furnizeze informații suplimentare care altfel (dacă ar exista încredere) nu ar fi necesare. O anumită proporție de fraudă este considerată inevitabilă. Aceste costuri și incertitudinea plăților, deși pot fi evitate atunci când se utilizează numerar fizic în plățile directe între oameni; nu există nicio mecanism care să permită plăți în cadrul unei comunicări între două părți, atunci când una dintre părți nu este de încredere.
Ceea ce avem cu adevărat nevoie este un sistem de plată electronic bazat pe dovezi criptografice, nu pe încredere, care să permită oricăror două părți să tranzacționeze direct fără a avea nevoie de o terță parte de încredere. Tranzacțiile ireversibile garantate prin puterea de calcul pot ajuta vânzătorul să nu fie înșelat, iar protecția zilnică a cumpărătorului este, de asemenea, ușor de realizat. În această lucrare, vom propune o soluție pentru problema plăților duble, folosind un server de timestampare distribuit și peer-to-peer pentru a genera dovezi bazate pe puterea de calcul, înregistrând fiecare tranzacție în ordinea temporală. Acest sistem este sigur, atâta timp cât nodurile oneste controlează, în total, mai multă putere de calcul decât atacatorii care colaborează.
2. Tranzacții (Transactions)
Definim o monedă electronică ca un lanț de semnături digitale. Atunci când un proprietar dă o monedă unei alte persoane, trebuie să anexeze la sfârșitul acestui lanț de semnături digitale următoarea semnătură digitală: hash-ul tranzacției anterioare, precum și cheia publică a noului proprietar. Beneficiarul poate verifica semnătura pentru a confirma proprietatea asupra lanțului de semnături digitale.
Problema acestui traseu este că beneficiarul nu poate verifica dacă vreunul dintre foștii proprietari nu a efectuat plăți duble. Soluția obișnuită este introducerea unei autorități centralizate de încredere, cunoscută sub numele de 'mint', care să verifice dacă fiecare tranzacție a fost efectuată fără plăți duble. După fiecare tranzacție, monedele trebuie returnate la mint, care va emite apoi o nouă monedă. Astfel, doar monedele emise direct de mint sunt de încredere și nu au fost supuse plăților duble. Problema acestei soluții este că soarta întregului sistem monetar depinde de compania care operează mintul (exact ca o bancă), fiecare tranzacție trebuie să treacă prin ea.
Avem nevoie de un mod prin care beneficiarului să poată confirma că proprietarul anterior nu a semnat în nicio tranzacție anterioară. În scopul nostru, doar prima tranzacție contează, așa că nu ne pasă de încercările ulterioare de plată dublă. Singura modalitate de a confirma că o tranzacție nu există este să cunoști toate tranzacțiile. În modelul monetar, monetarul cunoaște toate tranzacțiile și poate confirma ordinea acestora. Pentru a realiza această sarcină fără participarea unei 'părți de încredere', înregistrările de tranzacții trebuie să fie publicate, iar noi avem nevoie de un sistem care să permită participanților să recunoască aceeași istorie unică de tranzacții pe care o primesc. Beneficiarul trebuie să demonstreze că, în momentul fiecărei tranzacții, majoritatea nodurilor au putut recunoaște că aceasta este prima care a fost acceptată.
3. Server de timestamp (Timestamp Server)
Această soluție pornește de la un server de timestampuri. Serverul de timestampuri funcționează astfel: se aplică un timestamp hash-ului pentru un set (bloc) de înregistrări (items) și apoi se difuzează hash-ul, așa cum ar face un ziar sau o postare într-un grup de discuții. Evident, timestampul poate dovedi că datele au existat înainte de acel moment, altfel hash-ul nu ar fi putut fi generat. Fiecare timestamp conține în hash-ul său timestampul anterior, formând astfel un lanț; fiecare nou timestamp este adăugat după timestampul anterior.
4. Dovada de lucru (Proof-of-Work)
Pentru a implementa un server de timestamp distribuit bazat pe peer-to-peer, trebuie să folosim un sistem de dovadă de lucru asemănător cu Hashcash a lui Adam Back, nu ceva de genul ziarelor sau postărilor pe grupuri de discuții. Așa-numita dovadă de lucru implică căutarea unei valori; această valoare trebuie să îndeplinească următoarele condiții: după ce se extrage valoarea hash - de exemplu, folosind SHA-256 pentru a calcula valoarea hash - această valoare hash trebuie să înceapă cu un anumit număr de 0. Fiecare cerință de un 0 suplimentar va crește exponential volumul de muncă, iar validarea acestui volum de muncă necesită doar calcularea unei hash.
În rețeaua noastră de timestampuri, implementăm dovada de lucru prin adăugarea constantă a unui număr aleatoriu (Nonce) într-un bloc, până când se găsește o valoare care îndeplinește condițiile; această condiție este că hash-ul acestui bloc începe cu un număr specificat de 0. Odată ce rezultatul obținut prin consumul de putere de calcul satisface dovada de lucru, blocul nu mai poate fi modificat, cu excepția cazului în care se finalizează din nou toată munca anterioară. Pe măsură ce noi blocuri sunt adăugate constant, modificarea blocului curent înseamnă că trebuie să se finalizeze din nou toată munca tuturor blocurilor ulterioare.
Dovada de lucru rezolvă, de asemenea, problema de a determina cine poate reprezenta majoritatea în luarea deciziilor. Dacă așa-numita 'majoritate' este determinată pe baza modelului 'un IP o vot', atunci oricine poate obține multe adrese IP poate fi considerat 'majoritate'. Dovada de lucru este, în esență, 'un CPU o vot'. Așa-numita 'decizie a majorității' este reprezentată de cel mai lung lanț, deoarece lanțul care a consumat cea mai mare cantitate de muncă este acesta. Dacă majoritatea puterii de calcul este controlată de noduri oneste, atunci lanțul onest va crește cel mai repede, cu o viteză care depășește cu mult alte lanțuri concurente. Pentru a modifica un bloc deja generat, atacatorul va trebui să finalizeze din nou acel bloc și toate blocurile ulterioare, apoi să ajungă și să depășească munca nodurilor oneste. Următoarele secțiuni vor arăta de ce un atacator întârziat va avea o probabilitate de a recupera care va scădea exponențial pe măsură ce blocurile continuă să se acumuleze.
Pentru a face față creșterii continue a puterii de calcul hardware și posibilei variații a numărului de noduri implicate în timp, dificultatea dovezii de lucru este stabilită astfel: pe baza unei medii mobile a numărului mediu de blocuri generate pe oră. Dacă blocurile sunt generate prea repede, dificultatea va crește.
5. Rețea (Network)
Pașii pentru a rula rețeaua sunt următorii:
Toate tranzacțiile noi sunt difuzate către toate nodurile;
Fiecare nod include noile tranzacții într-un bloc;
Fiecare nod începe să caute o dovadă de lucru cu dificultate pentru acest bloc;
Când un bloc găsește dovada sa de lucru, acesta trebuie să difuzeze acest bloc tuturor nodurilor;
Multe noduri vor accepta acest bloc doar dacă următoarele condiții sunt îndeplinite: toate tranzacțiile din acesta sunt valide și nu au fost supuse plăților duble;
Multe noduri din rețea își exprimă acceptul pentru acest bloc prin faptul că, atunci când creează următorul bloc, folosesc hash-ul blocului acceptat ca hash pentru blocul anterior.
Nodurile consideră întotdeauna că cel mai lung lanț este cel corect și vor continua să adauge date noi la acesta. Dacă două noduri difuzează simultan două versiuni diferite ale 'următorului bloc', unele noduri vor primi mai întâi unul, iar alte noduri vor primi mai întâi celălalt. În această situație, nodurile vor continua să lucreze pe blocul pe care l-au primit prima dată, dar vor salva și celălalt ramificat, în caz că acesta devine cel mai lung lanț. Când următoarea dovadă de lucru este găsită, iar unul dintre ramificații devine un lanț mai lung, această divergență temporară va fi eliminată, iar nodurile care lucrau pe cealaltă ramificație vor trece la lanțul mai lung.
Noile tranzacții nu trebuie neapărat să fie difuzate tuturor nodurilor. Atâta timp cât ajung la un număr suficient de mare de noduri, aceste tranzacții vor fi incluse într-un bloc în scurt timp. Difuzarea blocurilor permite, de asemenea, ca unele mesaje să fie pierdute. Dacă un nod nu a primit un anumit bloc, acesta va realiza că a ratat blocul anterior atunci când va primi următorul bloc, și va face o solicitare pentru a completa acel bloc pierdut.
6. Recompensă (Incentive)
Conform convenției, prima tranzacție din fiecare bloc este o tranzacție specială care generează o nouă monedă, iar proprietatea este a celui care a generat acest bloc. Aceasta înseamnă că nodurile care susțin rețeaua primesc recompense și oferă o modalitate de a introduce monede în circulație - în acest sistem, oricum nu există o autoritate centralizată care să emită acele monede. Astfel, se adaugă constant o cantitate stabilă de monede noi în circulație, exact așa cum minerii de aur își consumă resursele pentru a adăuga aur în circulație. În sistemul nostru, resursele consumate sunt timpul de lucru al CPU-urilor și energia pe care o folosesc.
Recompensele pot proveni și din taxele de tranzacție. Dacă valoarea de ieșire a unei tranzacții este mai mică decât valoarea de intrare, atunci diferența este taxa de tranzacție; iar această taxă este folosită pentru a recompensa nodurile care includ acea tranzacție în acest bloc. Odată ce un număr stabilit de monede a intrat în circulație, recompensele vor fi complet realizate prin taxe de tranzacție și nu va exista inflație.
Mecanismul de recompensă ar putea, de asemenea, încuraja nodurile să rămână oneste. Dacă un atacator lacom poate controla mai multă putere de calcul decât toate nodurile oneste, el trebuie să facă o alegere: să folosească această putere de calcul pentru a fura banii pe care i-a cheltuit, înșelând pe alții? Sau să folosească această putere de calcul pentru a genera noi monede? Ar trebui să descopere că a acționa conform regulilor este mai profitabil, regulile curente îi permit să câștige mai multe monede decât toți ceilalți la un loc, ceea ce este evident mai profitabil decât să distrugă sistemul în secret și să-și transforme averea în nimic.
7. Recuperarea spațiului pe disc (Reclaiming Disk Space)
Dacă o tranzacție recentă a unei monede a avut loc cu suficient de multe blocuri în urmă, atunci înregistrările de cheltuieli ale acelei monede pot fi eliminate - scopul fiind economisirea spațiului pe disc. Pentru a realiza această funcționalitate fără a compromite hash-ul blocului, hash-ul înregistrărilor de tranzacții va fi inclus într-un arbore Merkle, iar doar rădăcina arborelui va fi inclusă în hash-ul blocului. Prin metoda tăierii ramurilor, blocurile vechi pot fi comprimate. Hash-urile interne nu trebuie păstrate.
Un cap de bloc fără nicio înregistrare a tranzacțiilor este de aproximativ 80 de octeți. Să presupunem că un bloc este generat la fiecare zece minute, 80 de octeți înmulțiți cu 6, înmulțiți cu 24, înmulțiți cu 365, este egal cu 4.2M pe an. Începând cu 2008, majoritatea calculatoarelor în vânzare au 2GB de memorie, iar conform legii lui Moore, aceasta va crește cu 1.2GB pe an, astfel încât chiar și stocarea capetelor de bloc în memorie nu ar trebui să fie o problemă.
8. Confirmarea simplificată a plăților
Chiar dacă nu rulezi un nod complet al rețelei, este posibil să confirmi o plată. Utilizatorul are nevoie doar de o copie a capului blocului din lanțul de lucru cel mai lung - el poate verifica online pentru a confirma că ceea ce deține provine într-adevăr din lanțul cel mai lung - și apoi obține nodul ramificării din Merkle tree, conectându-se astfel la tranzacția care a fost timestampată în momentul respectiv. Utilizatorul nu poate verifica tranzacția, dar, conectându-se la un anumit loc din lanț, poate vedea că un nod din rețea a acceptat această tranzacție, iar blocurile adăugate ulterior au confirmat că rețeaua a acceptat această tranzacție.
Atâta timp cât nodurile oneste continuă să controleze rețeaua, verificarea este de încredere. Totuși, dacă rețeaua este controlată de atacatori, verificarea nu mai este atât de de încredere. Deși nodurile din rețea își pot verifica singure înregistrările de tranzacții, atâta timp cât atacatorii pot continua să controleze rețeaua, metodele de verificare simplificate pot fi păcălite de înregistrările de tranzacții falsificate de atacatori. Una dintre strategiile de răspuns este ca software-ul clientului să accepte alertele din partea nodurilor de rețea. Când nodurile din rețea descoperă blocuri invalide, acestea emit o alertă, notificând utilizatorul să descarce blocul complet, avertizându-l să confirme consistența tranzacției. Comercianții care efectuează frecvent plăți ar trebui să își dorească să ruleze propriul nod complet, pentru a asigura o siguranță mai independentă și o confirmare mai rapidă a tranzacțiilor.
9. Combinarea și divizarea valorii
Deși este posibil să se proceseze monede pe rând, a avea un singur record pentru fiecare bănuț este foarte stângaci. Pentru a permite divizarea și combinarea valorilor, înregistrările de tranzacții conțin mai multe intrări și ieșiri. În general, fie este o singură intrare provenind dintr-o tranzacție anterioară relativ mare, fie sunt mai multe intrări provenind din combinații de sume mai mici; în același timp, pot exista cel mult două ieșiri: una este plata (către beneficiar), iar, dacă este necesar, cealaltă este restituirea (către plătitor).
Este de remarcat că 'răspândirea' nu este o problemă aici - așa-numita 'răspândire' se referă la o tranzacție care depinde de mai multe tranzacții, iar aceste tranzacții depind de și mai multe tranzacții. Nu a fost niciodată necesar să extragem o copie completă și independentă a istoriei oricărei tranzacții.
10. Intimitate (Privacy)
Modelul bancar tradițional realizează un anumit grad de protecție a intimității prin limitarea accesului altora la informațiile comercianților și la terțe părți de încredere. Cerința de a face publice toate înregistrările de tranzacții a respins acest model. Totuși, păstrarea intimității poate fi realizată prin tăierea fluxului de informații din altă parte - anonimatul cheii publice. Publicul poate vedea că cineva a transferat o anumită sumă către altcineva, dar nu există nicio informație care să indice o persoană anume. Acest nivel de publicare a informațiilor este similar cu tranzacțiile pe piața de capital, unde doar timpul și sumele fiecărei tranzacții sunt publicate, dar nimeni nu știe cine sunt părțile tranzacției.
Există un alt strat de protecție. Comercianții ar trebui să activeze o pereche de chei publice și private pentru fiecare tranzacție, astfel încât ceilalți să nu poată lega aceste tranzacții de același proprietar. Unele tranzacții cu multe intrări pot fi totuși urmărite, deoarece acele intrări vor fi întotdeauna identificate ca provenind de la același proprietar. Pericolul este că, dacă proprietarul unei chei publice este expus, toate celelalte tranzacții asociate cu aceasta vor fi, de asemenea, expuse.
11. Calculații (Calculations)
Să presupunem o situație în care un atacator încearcă să genereze un lanț alternativ mai rapid decât lanțul onest. Chiar dacă reușește, nu poate face modificări arbitrare în sistem, adică nu poate crea valoare din nimic și nu poate obține bani care nu i-au aparținut niciodată. Nodurile din rețea nu vor considera o tranzacție invalidă ca fiind o plată, iar nodurile oneste nu vor accepta niciodată un bloc care conține o astfel de plată. Atacatorul poate modifica cel mult tranzacțiile care îi aparțin, încercând astfel să recupereze banii pe care i-a cheltuit.
Competiția dintre lanțul onest și atacator poate fi descrisă printr-o plimbare aleatorie binomială. Un eveniment de succes este atunci când lanțul onest tocmai a adăugat un nou bloc, ceea ce îi crește avantajul cu 1; iar un eveniment eșuat este atunci când lanțul atacatorului tocmai a adăugat un nou bloc, ceea ce reduce avantajul lanțului onest cu 1.
Probabilitatea ca atacatorul să recupereze dintr-o situație defavorabilă este similară cu problema falimentului jucătorului. Să presupunem că un jucător cu fise nelimitate începe cu un deficit și are voie să joace nelimitat, cu obiectivul de a acoperi deficitul existent. Putem calcula probabilitatea ca el să reușească să acopere deficitul, adică probabilitatea ca atacatorul să ajungă la lanțul onest, astfel:
Având în vedere că am presupus p > , q, iar numărul de blocuri pe care atacatorul trebuie să le depășească devine din ce în ce mai mare, probabilitatea sa de succes va scădea exponențial. În condiții nefavorabile, dacă atacatorul nu a reușit să facă un salt norocos de la început, atunci șansele sale de câștig se vor diminua pe măsură ce devine din ce în ce mai în urmă.
Acum să ne gândim cât timp trebuie să aștepte un beneficiar al unei noi tranzacții pentru a se asigura că plătitorul nu poate modifica această tranzacție. Presupunem că plătitorul este un atacator care încearcă să-l convingă pe beneficiar pentru o perioadă de timp că a plătit suma, iar apoi să returneze acești bani pentru sine. În această situație, beneficiarului, desigur, îi va apărea o avertizare, dar plătitorul speră că la acel moment va fi deja prea târziu.
Beneficiarul generează o pereche de chei publice și private, și apoi, cu puțin timp înainte de a semna, îi comunică persoanei care face plata cheia publică. Acest lucru împiedică o situație în care persoana care plătește pregătește în avans un bloc pe un lanț prin calcule continue, și, atâta timp cât are suficient noroc, va fi suficient de avansat pentru a efectua tranzacția. Odată ce banii au fost trimiși, persoana onestă începe în secret să lucreze pe un alt lanț paralel, încercând să introducă o versiune inversă a tranzacției.
Beneficiarul așteaptă ca această tranzacție să fie inclusă într-un bloc și că z blocuri să fie adăugate ulterior. Nu știe cum decurge progresul atacatorului, dar poate presupune că blocurile oneste consumă un timp mediu pentru a fi generate; progresul potențial al atacatorului se conformează unei distribuții Poisson, cu un așteptat de:
Pentru a calcula probabilitatea ca atacatorul să poată ajunge din nou, trebuie să înmulțim densitatea de probabilitate Poisson a numărului de blocuri pe care atacatorul trebuie să le recupereze cu probabilitatea de a recupera din acea situație defavorabilă:
Conversie în program C...
Obținând o parte din rezultate, putem observa că probabilitatea scade exponențial pe măsură ce z crește:
Dacă P este mai mic de 0,1%...
12. Concluzie
Am propus un sistem de tranzacții electronice care nu depinde de încredere; pornind de la un cadru de monedă care folosește semnături digitale, deși acesta oferă un control robust al proprietății, nu poate preveni plățile duble. Pentru a rezolva această problemă, propunem o rețea peer-to-peer care utilizează un mecanism de dovadă de lucru pentru a înregistra o istorie publică a tranzacțiilor, atâta timp cât nodurile oneste pot controla majoritatea puterii de calcul, atacatorii nu pot reuși să modifice sistemul din punct de vedere al puterii de calcul. Robustetea acestei rețele constă în simplitatea sa neorganizată. Nodurile pot lucra instantaneu simultan cu puțină colaborare. Nu trebuie nici măcar să fie identificate, deoarece calea mesajelor nu depinde de un punct final specific; mesajele trebuie doar să fie difuzate cu cea mai mare efort. Nodurile se pot conecta și deconecta liber, iar la reintrare trebuie să accepte lanțul de dovezi de lucru ca dovadă a tot ceea ce s-a întâmplat în absența lor. Ele își votează prin puterea lor de calcul, adăugând constant noi blocuri valide la lanț, respingând blocurile invalide, pentru a-și arăta acceptul sau refuzul față de tranzacțiile valide. Orice reguli necesare și recompense pot fi implementate prin acest mecanism de consens.
Referințe (References)
b-money Dai Wei (1998-11-01) http://www.weidai.com/bmoney.txt
Designul unui serviciu de timestampare sigur cu cerințe minime de încredere Henri Massias, Xavier Serret-Avila, Jean-Jacques Quisquater 20th Symposium on Information Theory in the Benelux (1999-05) http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.13.6228
Cum să timestampăm un document digital Stuart Haber, W.Scott Stornetta Journal of Cryptology (1991) https://doi.org/cwwxd4 DOI: 10.1007/bf00196791
Îmbunătățirea eficienței și fiabilității timestampării digitale Dave Bayer, Stuart Haber, W. Scott Stornetta Sequences II (1993) https://doi.org/bn4rpx DOI: 10.1007/978-1-4613-9323-8_24
Nume sigure pentru șiruri de biți Stuart Haber, W. Scott Stornetta Proceedings of the 4th ACM conference on Computer and communications security - CCS ’97(1997) https://doi.org/dtnrf6 DOI: 10.1145/266420.266430
Hashcash - O măsură de contracarare a atacurilor de tip Denial of Service Adam Back (2002-08-01) http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.15.8
Protocoale pentru criptosisteme cu cheie publică Ralph C. Merkle 1980 IEEE Symposium on Security and Privacy (1980-04) https://doi.org/bmvbd6 DOI: 10.1109/sp.1980.10006
O introducere în teoria probabilităților și aplicațiile sale William Feller John Wiley & Sons (1957) https://archive.org/details/AnIntroductionToProbabilityTheoryAndItsApplicationsVolume1