Bitcoin: Sistem electronic de monedă pereche-pereche.
Satoshi Nakamoto -
satoshin@gmx.com -
http://www.bitcoin.org(Traducători: Benkebab, Grondilu, Mackila)
Rezumat. Un sistem de monedă electronică peer-to-peer complet ar permite efectuarea plăților online direct de la o terță parte la alta fără a trece printr-o instituție financiară. Semnăturile digitale oferă o astfel de soluție, dar își pierd interesul atunci când un terț de încredere este obligat să împiedice dubla plată. Oferim o soluție la problema plății duble folosind o rețea peer-to-peer. Tranzacțiile de marcă de timp de rețea folosind o funcție hash care le traduce într-un lanț continuu de dovezi de lucru (amprente digitale), formând o înregistrare care nu poate fi modificată fără a efectua din nou dovada muncii. Cel mai lung lanț (al amprentelor) servește nu numai ca dovadă a cursului evenimentelor observate, ci și ca dovadă că provine din cea mai mare grupare a puterii de calcul. Atâta timp cât cea mai mare parte a puterii de calcul (CPU) este controlată de noduri care nu cooperează pentru a ataca rețeaua, acestea vor genera cele mai lungi atacanți în lanț și mai mari. Rețeaua în sine necesită doar o structură redusă. Mesajele sunt transmise cât se poate de bine, iar nodurile pot părăsi sau se pot alătura rețelei așa cum doresc, acceptând cea mai lungă dovadă a lanțului de lucru ca dovadă a ceea ce s-a întâmplat în timpul absenței lor.
1. Introducere
Comerțul prin Internet azi depinde aproape exclusiv de instituțiile financiare care servesc ca terți de încredere în procesarea plăților electronice. Deși acest sistem funcționează destul de bine pentru majoritatea tranzacțiilor, acesta încă suferă de punctele slabe inerente modelului său bazat pe încredere. Tranzacțiile complet ireversibile nu sunt cu adevărat posibile, deoarece instituțiile financiare trebuie să gestioneze medierea conflictelor. Costul acestei medieri crește costurile tranzacției, limitând în practică dimensiunea minimă a unei tranzacții și prevenind posibilitatea de a avea mici tranzacții ieftine. Imposibilitatea de a avea plăți ireversibile pentru servicii nereversabile generează un cost și mai mare. Cu capacitatea de a inversa tranzacțiile, nevoia de încredere crește. Comercianții ar trebui să fie precauți de clienții lor, hărțuindu-i pentru mai multe informații decât este necesar. O anumită cantitate de fraudă este acceptată ca fiind inevitabilă. Toate aceste costuri de plată și incertitudini pot fi evitate prin utilizarea monedei fizice, dar nu există niciun mecanism pentru efectuarea plăților printr-un sistem de comunicație fără a apela la un terț de încredere.
Ceea ce avem nevoie este un sistem de plăți electronice bazat pe dovezi criptografice, în loc de un model bazat pe încredere, care să permită două părți care doresc să tranzacționeze direct fără a recurge unui terț de încredere. Tranzacțiile imposibil de anulat de către computer ar proteja vânzătorii de eventuale fraude, iar un sistem de cont escrow ar putea fi pus în aplicare cu ușurință pentru a proteja cumpărătorii. În acest document, vă propunem o soluție la problema dublei cheltuieli, folosind un server imprimat timp distribuit în modul peer-to-peer pentru a genera dovezi pe computer de ordinea cronologică a tranzacțiilor. Sistemul este sigur, atâta timp cât nodurile oneste controlează împreună mai multă putere de calcul decât un grup de noduri care ar coopera pentru a efectua un atac.
2. Tranzacții
Definim o parte electronică ca un lanț de semnături digitale. Orice proprietar transferă această piesă către alta semnând digital o amprentă a tranzacției anterioare, precum și cheia publică a noului proprietar și adăugându-le la sfârșitul piesei. Orice beneficiar poate examina semnăturile pentru a verifica lanțul de proprietate.
hârtie albă 1
Problema, desigur, este că destinatarul nu poate verifica dacă unul dintre proprietarii precedenți nu a „cheltuit dublu” pentru acea parte. O soluție obișnuită este introducerea unei autorități centrale de încredere sau menta, care ar verifica fiecare tranzacție pentru a evita „dubla cheltuială”. După fiecare tranzacție, monedele trebuie returnate la Hôtel des Monnaies, ceea ce creează o nouă, și numai monedele direct de la Hôtel des Monnaies sunt considerate a nu fi fost cheltuite de două ori. Problema acestei soluții este că soarta întregului sistem monetar se bazează pe compania care administrează Monetă și că fiecare tranzacție trebuie să treacă prin ele, ca o bancă.
Avem nevoie de o metodă pentru ca destinatarul să știe dacă proprietarii anteriori nu au semnat tranzacții anterioare. Pentru aceasta, cea mai veche tranzacție trebuie să fie cea care contează, nu trebuie să ne preocupăm de încercările ulterioare de a cheltui moneda duplicată. Singura modalitate de a confirma absența unei tranzacții anterioare este de a fi la curent cu toate tranzacțiile. În modelul bazat pe un Mint, acesta din urmă era la curent cu toate tranzacțiile și, prin urmare, a decis care a venit prima. Pentru a face același lucru fără un terț, tranzacțiile trebuie anunțate public [1] și avem nevoie de un sistem pentru ca toți participanții să fie de acord cu un singur istoric al ordinului în care sunt primite tranzacțiile. . Beneficiarul are nevoie de dovada că la fiecare moment al unei tranzacții, majoritatea nodurilor sunt de acord că a fost primul primit.
3. Server timbru de timp
Baza soluției propuse este un server de timbru. Un server de timbru de timp ia amprenta unui set de elemente de timp imprimate și publică această amprentă, precum o reclamă de ziar sau un mesaj pe un forum Usenet [2-5]. Timpul demonstrează că datele au existat, pentru a fi luate în considerare în amprentă. Fiecare marcaj de timp include indicatorul de timp anterior în amprenta sa, formând un lanț, fiecare element nou confirmându-le pe cele anterioare.
hârtie albă 2
4. Dovada muncii
Pentru a implementa un server de timbru timp distribuit pe o rețea peer-to-peer, este necesar să utilizați un sistem bazat pe dovezi de lucru, cum ar fi sistemul Hashcash al lui Adam Back [6], mai degrabă decât un jurnal sau un mesaj pe o forum Usenet. Dovada muncii necesită căutarea unei valori astfel încât amprenta sa, calculată de exemplu folosind SHA-256, să înceapă cu un anumit număr de biți la 0. Lucrarea necesară depinde exponențial de numărul de biți la 0 necesar și poate să fie validat prin efectuarea unui singur calcul de amprentă.
Pentru rețeaua noastră de timbrare a timpului, implementăm dovada lucrării prin creșterea unei variabile în bloc până când se găsește o valoare care dă o amprentă cu suficiente biți la 0. Odată ce efortul de calcul necesar obținerii dovezii lucrului a fost făcut, nu mai este posibil să modificați blocul fără a repeta acest efort de calcul. Deoarece blocurile noi sunt înlănțuite după el, efortul de calcul necesar pentru a modifica un bloc include tot efortul de calcul necesar pentru a modifica toate blocurile următoare.
hârtie albă 3
Dovada muncii rezolvă problema alegerii reprezentativității votului. Dacă majoritatea s-ar baza pe voturile alocate pe adresa IP, votul ar putea fi pervertit de cineva capabil să își dea o mulțime de adrese. Dovada muncii se bazează în esență pe puterea de calcul (un procesor, o voce). Decizia majoritară este reprezentată de cel mai lung lanț, cel care necesită cea mai mare dovadă a calculelor muncii. Dacă majoritatea puterii de calcul a rețelei este controlată de noduri oneste, lanțul legitim progresează cel mai repede și distanțează lanțurile concurente. Pentru a modifica un bloc vechi, un atacator ar trebui să recalculeze dovezile de lucru pentru blocul modificat și toate blocurile ulterioare, pentru a prelua și depăși munca furnizată de nodurile cinstite. Vom arăta mai târziu că probabilitatea ca un atacator cu mai puțină putere de calcul să poată recupera scade exponențial cu fiecare nou bloc adăugat.
Pentru a compensa îmbunătățirea puterii de calcul a hardware-ului și schimbarea interesului pentru nodurile de rețea de operare, dificultatea probei de lucru este determinată de o medie a numărului de blocuri care se găsesc pe oră. Dacă aceste blocuri sunt generate prea repede, dificultatea crește.
5. Rețea
Pașii implementați pentru operarea rețelei sunt următorii:
Tranzacțiile noi sunt transmise tuturor nodurilor.
Fiecare nod grupează noile tranzacții într-un bloc.
Fiecare nod lucrează pentru a rezolva dovada de lucru pe blocul său.
Când un nod găsește o dovadă de lucru, acesta transmite acest bloc tuturor nodurilor.
Nodurile acceptă blocul numai dacă toate tranzacțiile pe care le conține sunt valabile și nu au fost deja cheltuite.
Nodurile exprimă acceptarea blocului lucrând la un bloc nou în lanț, acest nou bloc având ca amprentă anterioară cel al blocului acceptat.
Nodurile consideră întotdeauna cel mai lung lanț drept lanțul legitim și lucrează pentru extinderea acestuia. Dacă două noduri difuzează simultan două versiuni diferite ale următorului bloc, unele dintre noduri vor primi una sau alta. În această situație, fiecare lucrează la blocul primit mai întâi, dar păstrează cealaltă ramură în caz că devine cea mai lungă. Această legătură va fi spartă atunci când se va găsi următoarea dovadă de lucru și o ramură devine mai lungă decât cealaltă; nodurile care lucrau apoi pe cealaltă ramură se vor schimba pentru o perioadă mai lungă.
Distribuțiile noilor tranzacții nu trebuie să ajungă la toate nodurile. Din momentul în care vor ajunge la suficiente noduri, se vor găsi într-un bloc în cel mai scurt timp. Emisiile blocate tolerează pierderea mesajelor. Dacă un nod nu primește un bloc, îl va solicita atunci când primește următorul bloc, când își dă seama că lipsește unul.
6. Incentivant
Prin convenție, prima tranzacție a unui bloc este o tranzacție specială care creează o nouă parte aparținând creatorului blocului. Acest lucru încurajează nodurile să participe la rețea și permite distribuirea inițială a banilor, deoarece nu există o autoritate centralizată în acest sens. Această adăugare regulată a unei sume constante de bani se apropie de efortul depus de mineri pentru a adăuga aur în circulație. În cazul nostru, efortul constă în calcularea puterii și a timpului.
Stimulentul poate fi finanțat și din comisioane de tranzacție. Dacă valoarea de ieșire a unei tranzacții este mai mică decât valoarea ei de intrare, diferența corespunde taxelor de tranzacție care se adaugă la valoarea de stimulare a blocului care conține această tranzacție. Odată ce suma prestabilită de bani a intrat în circulație, stimulentul poate trece la finanțare complet bazată pe costurile de tranzacție și nu poate provoca inflație.
Stimulentul poate încuraja nodurile să rămână sinceri. Dacă un atacator lacom are mijloacele de a obține mai multă putere de calcul decât toate nodurile cinstite, el poate alege între persoane care se războiesc colectând plăți sau folosind puterea sa pentru a genera bani noi. Trebuie să găsească mai interesant să joace jocul, ceea ce îl favorizează în mod clar, deoarece de atunci va genera mai mulți bani noi decât toate celelalte noduri, în loc să submineze sistemul și valoarea propriei averi.
7. Salvați spațiu pe disc
Odată ce ultima tranzacție pentru o parte este îngropată în blocuri suficiente, tranzacțiile anterioare pot fi șterse pentru a economisi spațiu pe disc. Pentru a permite acest lucru fără a invalida amprenta blocului, tranzacțiile sunt rezumate într-un arbore Merkle [7] [2] [5], din care doar rădăcina este inclusă în amprenta blocului. Blocurile vechi pot fi comprimate prin tăierea ramurilor din copac. Impresiile intermediare nu trebuie stocate.
Un antet de bloc fără o tranzacție cântărește aproximativ 80 de octeți. Dacă presupunem că blocurile sunt generate la fiecare 10 minute, aceasta reprezintă 80 de octeți * 6 * 24 * 365 = 4.2 MB pe an. În 2008, sistemele de calcul au fost vândute cu o capacitate medie de 2 GB RAM și, prin Legea lui Moore, care prevedea o creștere de 1.2 GB pe an, stocarea nu ar trebui, prin urmare, să fie o problemă, chiar dacă toate - anteturile blocului trebuie păstrate în memoria RAM.
8. Verificare simplificată de plată
Este posibil să verificați plățile fără a opera un nod complet al rețelei. Un utilizator trebuie doar să păstreze o copie a anteturilor celui mai lung lanț de dovezi, pe care îl poate obține prin interogări pe nodurile rețelei până când este convins că 'aveți cel mai lung lanț, apoi recuperați sucursala din arborele Merkle care leagă tranzacția cu blocul în care este timbrată timpul. Utilizatorul nu poate verifica singur tranzacția, dar legând-o la locul său în lanț, poate vedea că un nod din rețea a acceptat-o, iar următoarele blocuri confirmă în continuare acceptarea rețelei.
Ca atare, verificarea este fiabilă atât timp cât nodurile oneste controlează rețeaua, dar este mai vulnerabilă dacă rețeaua este compromisă de un atacator cu mai multă putere de calcul. Deși nodurile de rețea pot verifica tranzacțiile în sine, metoda simplificată poate fi păcălită de tranzacțiile falsificate de atacator, atât timp cât acesta are mijloacele de a depăși puterea de calcul a rețelei. O strategie pentru a vă proteja de un astfel de atac ar putea fi primirea alertelor de la nodurile de rețea atunci când detectează un bloc nevalid, solicitând software-ului utilizatorului să descarce blocul complet și tranzacțiile suspecte pentru a verifica incoerența. Companiile care primesc plăți frecvente vor beneficia cu siguranță de rularea propriilor noduri pentru o securitate mai independentă și o verificare mai rapidă.
9. Combinarea și divizarea valorii
Deși este posibil să prelucrați monedele separat, ar fi imposibil să se genereze o tranzacție diferită pentru fiecare bănuț în timpul transferului. Pentru a permite combinarea și împărțirea banilor, tranzacțiile includ intrări și ieșiri multiple. În mod normal, există fie o singură intrare dintr-o tranzacție mare anterioară, fie mai multe înregistrări care combină sume mai mici și maxim două ieșiri: una pentru plată și cealaltă pentru a returna schimbul, dacă există, la transmițătorul.
Trebuie remarcat faptul că dispersia, atunci când o tranzacție depinde de mai multe tranzacții, iar aceste tranzacții depind ele însele de multe alte tranzacții, nu este o problemă. Nu este niciodată nevoie să regăsiți istoricul complet al unei tranzacții.
10. Confidențialitate
Sistemul bancar tradițional garantează un anumit nivel de confidențialitate prin limitarea accesului la informații către părțile în cauză și către terții de încredere. Nevoia de a publica toate tranzacțiile exclude această metodă, dar confidențialitatea poate fi obținută prin întreruperea fluxului de informații la un alt nivel: prin păstrarea cheilor publice anonime. Este posibil să vezi că cineva trimite o anumită sumă către altcineva, dar fără nicio legătură cu oamenii. Aceasta este similară cu nivelul de informații disponibile pe piețele de schimb, unde data și valoarea fiecăruia dintre schimburi, „cursul”, sunt publice, dar fără a dezvălui identitatea părților.
Ca barieră suplimentară, o nouă pereche de chei poate fi utilizată pentru fiecare tranzacție, pentru a evita legarea cu un proprietar comun. Cu toate acestea, o anumită relație este inevitabilă cu tranzacțiile cu mai multe intrări, care dezvăluie în mod necesar că intrările lor erau deținute de același proprietar. Evenimentul temut este că, dacă este dezvăluit proprietarul uneia dintre chei, legăturile permit dezvăluirea altor tranzacții ale aceluiași proprietar.
11. Calcule
Luați în considerare cazul unui atacator care încearcă să genereze un lanț alternativ mai rapid decât lanțul legitim. Chiar dacă are succes, nu ar lăsa sistemul vulnerabil la schimbări arbitrare, cum ar fi crearea de bani din aer subțire sau însușirea de bani care nu au aparținut niciodată atacatorului. Nodurile nu acceptă tranzacții nevalide ca plată, iar nodurile oneste nu vor accepta niciodată un bloc care conține una dintre aceste tranzacții. Un atacator poate modifica doar una din tranzacțiile sale proprii pentru a recupera banii pe care tocmai i-a cheltuit.
Cursa dintre lanțul legitim și lanțul atacatorului poate fi caracterizată ca o plimbare binară aleatorie. Evenimentul de succes este prelungirea lanțului legitim, sporind avantajul său cu +1, iar evenimentul eșec este alungirea lanțului atacatorului, reducându-i întârzierea cu -1.
Probabilitatea ca un atacator să se prindă este analog cu problema ruinei jucătorului. Imaginați-vă un jucător cu credite nelimitate, începând cu negativul și putând juca un număr infinit de jocuri pentru a încerca să atingă punctul de pauză. Probabilitatea ca acesta să ajungă acolo sau ca un atacator să reușească să prindă lanțul legitim, este calculat după cum urmează [8]:
p = probabilitatea ca un nod sincer să găsească următorul bloc
q = probabilitatea ca atacatorul să găsească următorul bloc
qz = probabilitatea ca atacatorul să reușească să prindă lanțul cu blocuri de întârziere z
Având în vedere ipoteza noastră p> q, probabilitatea scade exponențial în funcție de numărul de blocuri pe care atacatorul trebuie să le prindă. Cu șansele împotriva lui, dacă nu are o serie norocoasă devreme, șansele sale devin mai mici cu cât se află în spate.
Acum suntem interesați de momentul în care beneficiarul unei noi tranzacții trebuie să aștepte înainte de a fi suficient de sigur că emitentul nu va putea modifica tranzacția. Presupunem că inițiatorul este un atacator care dorește să facă crezul destinatarului că a fost plătit pentru un anumit timp, apoi dorește să modifice tranzacția pentru a recupera banii tranzacției după o anumită întârziere. Destinatarul va fi alertat când se va întâmpla acest lucru, dar expeditorul speră că va fi prea târziu.
Destinatarul generează o nouă pereche de chei și oferă cheia publică expeditorului cu puțin timp înainte de semnare. Acest lucru împiedică emițătorul să pregătească un blockchain în avans, lucrând la acesta până când obține un avans suficient și că va efectua tranzacția în acel moment. Odată ce tranzacția este emisă, emitentul necinstit începe să lucreze la un lanț alternativ care conține o versiune modificată a tranzacției.
Destinatarul așteaptă până când tranzacția a fost adăugată la un bloc și până când au fost adăugate z blocuri în urma acesteia. Nu știe care este exact progresul atacatorului, dar presupunând că blocurile legitime au luat timpul mediu preconizat pentru fiecare bloc pentru a fi generat, progresul potențial al atacatorului este o distribuție Poisson având valoarea preconizată:
Pentru a obține probabilitatea ca atacatorul să mai poată recupera, multiplicăm densitatea Poisson pentru fiecare cantitate de progresie pe care a fost capabil să o obțină prin probabilitatea ca acesta să ajungă din acest punct:
Reorganizând pentru a evita să continue mai departe ...
Convertit în cod C.
#include
dublu AttackerSuccessProbabilitate (q dublu, int z)
{
dublu p = 1.0 - q;
lambda dublă = z * (q / p);
suma dubla = 1.0;
int i, k;
pentru (k = 0; k <= z; k ++)
{
pește dublu = exp (-lambda);
pentru (i = 1; i <= k; i ++)
pește * = lambda / i;
suma - = pește * (1 - pow (q / p, z - k));
}
suma de returnare;
}
Prin efectuarea unor teste, observăm că probabilitatea scade exponențial în funcție de z:
q = 0.1
z = 0p = 1.0000000
z = 1p = 0.2045873
z = 2p = 0.0509779
z = 3p = 0.0131722
z = 4p = 0.0034552
z = 5p = 0.0009137
z = 6p = 0.0002428
z = 7p = 0.0000647
z = 8p = 0.0000173
z = 9p = 0.0000046
z = 10 p = 0.0000012
q = 0.3
z = 0p = 1.0000000
z = 5p = 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
Soluții pentru P mai puțin de 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. Concluzie
Am propus un sistem de tranzacții electronice care nu se bazează pe încredere. Am început cu un cadru obișnuit de piese realizate cu semnături digitale, care asigură un control puternic al proprietății, dar rămâne incomplet fără o modalitate de a preveni cheltuielile duble. Pentru a rezolva această problemă, am propus o rețea peer-to-peer folosind dovezi de lucru pentru a înregistra un jurnal de tranzacții publice, care devine rapid inaccesibil prin calcul dacă nodurile oneste controlează majoritatea puterii de calcul. Rețeaua este robustă datorită simplității sale nestructurate. Nodurile funcționează împreună cu o coordonare foarte mică. Acestea nu trebuie să fie autentificate, deoarece mesajele nu sunt trimise către un anumit destinatar și nu trebuie să fie livrate decât în cel mai bun caz. Nodurile pot pleca și se pot alătura rețelei în voie, acceptând dovada lanțului de lucru ca dovadă a ceea ce s-a întâmplat în timpul absenței lor. Aceștia votează folosindu-și puterea de calcul, exprimându-și acordul cu privire la blocurile valide în timp ce lucrează pentru extinderea acestora și respingând blocurile invalide, refuzând să lucreze asupra lor. Toate regulile și stimulentele necesare pot fi aplicate cu acest mecanism de consens.
referințe
[1] W. Dai, „b-money”,
http://www.weidai.com/bmoney.txt, 1998.
[2] H. Massias, XS Avila și J.-J. Quisquater, „Proiectarea unui serviciu de cronometrare sigur, cu cerințe minime de încredere”, în al 20-lea simpozion despre teoria informațiilor din Benelux, mai 1999.
[3] S. Haber, WS Stornetta, „Cum să imprimați un document digital”, în Journal of Cryptology, vol. 3, nr. 2, paginile 99-111, 1991.
[4] D. Bayer, S. Haber, WS Stornetta, „Îmbunătățirea eficienței și fiabilității timbrii digitale a timpului”, în Secvențe II: Metode în comunicare, securitate și informatică, paginile 329-334, 1993.
[5] S. Haber, WS Stornetta, „Secure names for bit-strings”, în lucrările celei de-a 4-a Conferințe ACM privind securitatea computerelor și comunicațiilor, paginile 28-35, aprilie 1997.
[6] A. Înapoi, "Hashcash - o contra-măsură a refuzului serviciului",
http://www.hashcash.org/papers/hashcash.pdf, 2002.
[7] RC Merkle, „Protocoale pentru criptosistemele cu cheie publică”, în Proc. 1980 Simpozionul privind securitatea și confidențialitatea, IEEE Computer Society, paginile 122-133, aprilie 1980.
[8] W. Feller, „O introducere în teoria probabilității și aplicațiile sale”, 1957.