Bitcoin

1 Comment

Bitcoin

Reprezentarea simbolică a Bitcoin

Din 2010, de când am auzit prima dată de Bitcoin, am citit multe explicații. Majoritatea lor fiind artificial limitate în profunzime pentru a face articolul pe înțelesul tuturor. Înțelegerea acestui protocol în detalii este destul de greu. Multe articole jurnalistice, populiste, scriu despre posibilul impact financiar și social, nu și despre modul în care lucrează acest protocol. Pentru a vedea pe deplin impactul lui, trebuie să se înțeleagă cum el într-adevăr funcționează.

Pentru a înțelege acest articol trebuie să aveți cât de cât cunoștințe de noțiuni despre cheie publică/privată, semnătură digitală și funcții hash. Aceste noțiuni nu sunt foarte complicate, deschideți wikipedia și citiți.

Cât nu ar părea de straniu, criptografia este ceea ce stă la bazele Bitcoin-ului. Este Bitcoin-ul o monedă, este o metodă de a transmite mesaje secrete? De fapt, Bitcoin-ul este o metodă de a securiza tranzacțiile. De a proteja utilizatorii contra furturilor și de a face anonime tranzacțiile.

Eu voi încerca să vă explic cum lucrează Bitcoin, construind un protocol similar cum ar fi Moldocoin. Vom încerca împreună să construim acest sistem pas cu pas, pentru a vedea la fiecare etapă ce probleme apar și cum le putem rezolva.

Primul pas. Cum să inventăm o monedă virtuală?

La prima vedere, o monedă virtuală – pare imposibil. Presupunem că o oarecare persoană, cu numele Alinuța, are ceva monede virtuale și dorește să le cheltuie. Dacă Аlinuța are un șir de biți ca monede, ce-i poate interzice ei ca același șir de biți să-i cheltuie din nou, și apoi iar și iar … la infinit? Sau dacă cineva copie acel șir de biți, să-i cheltuie mai departe la infinit.

Acesteа sunt doar două din problemele care trebuie rezolvate pentru a avea bani virtuali.

Să încercăm să găsim o soluție pentru prima problemă, unde Alinuța folosește un șir de biți ca bani, contra falsificării acestui șir. Să presupunem că Alinuța vrea să-i transmită altei persoane, lui Bulă, un moldocoin. Pentru aceasta, Alinuța scrie un mesaj: “Eu, Alinuța îi dau lui Bulă un moldocoin”. Ea semnează digital acest mesaj utilizând cheia privată și anunță tuturor că a făcut aceasta.

Hei, nu e cel mai super-puper prototip de monedă, însă are unele calități. Oricine din lume (inclusiv și Bulă) poate utiliza cheia publică a Alinuței și verifica dacă într-adevăr Alinuța a semnat mesajul “Eu, Alinuța îi dau lui Bulă un moldocoin”. Nimeni altcineva nu poate crea un astfel de mesaj semnat și nici Alinuța nu se mai poate dezice de acea semnătură și să zică că: “Nu, Eu nu îi dau lui Bulă un moldocoin”. Deci protocolul stabilește că Alinuța are o adevărată intenție de a-i da lui Bulă un moldocoin. Cu alte cuvinte, nimeni nu mai poate publica un astfel de mesaj semnat și oarecum o protejează pe Alinuța contra falsificării.

Observați că am folosit doar un mesaj textual semnat, în următorii pași acest mesaj va deveni mai formalizat.

Utilizarea numerelor unice pentru identificarea monedelor.

O problemă a primei versiuni Moldocoin este că Alinuța poate trimite lui Bulă același mesaj semnat încă odată și încă odată. Presupunem că Bulă a primit zece copii a mesajului “Eu, Alinuța îi dau lui Bulă un moldocoin”. Înseamnă această că Alinuța i-a trimis 10 monede diferite? Poate ea accidental a trimis o copie? Poate ea încearcă  să-l amăgească pe Bulă că-i trimite zece monede, iar tuturor le spune că doar una.

Deci, trebuie să facem moldocoinii unici. Trebuie să le asignăm un număr unic de serie. Mesajul semnat al Alinuței va arăta astfel: “Eu, Alinuța îi dau lui Bulă un moldocoin, cu numărul de serie 35312408”. Iar mai târziu când Alinuța va trimte un mesaj “Eu, Alinuța îi dau lui Bulă un moldocoin, cu numărul de serie 733232323”, toată lumea, inclusiv și Bulă, va ști că un moldocoin diferit a fost transferat.

Pentru a face să lucreze corect această schemă avem nevoie de o sursă de încredere care va genera aceste numere de serie. O soluție ar fi o bancă. Această bancă va genera numere de serie pentru fiecare moldocoin, va urmări fiecare moldocoin și va verifica dacă tranzacțiile sunt valide.

De exemplu, Alinuța se duce la bancă și zice: “Doresc să iau un moldocoin din contul meu”. Banca reduce contul ei cu un moldocoin și îi asignează ei, un număr de serie nemaifolosit până atunci, să zicem 654321. Apoi când Alinuța va dori să transfere moldocoin-ul ei lui Bulă, ea va semna un mesaj “Eu, Alinuța îi dau lui Bulă un moldocoin, cu numărul de serie 654321”. Bulă nu va accepta imediat moldocoin-ul, se va duce mai întâi la bancă pentru verificarea tranzacției. Se va convinge că într-adevăr acest moldocoin cu numărul de serie 654321 îi aparține Alinuței și că ea nu l-a mai cheltuit pe altundeva. Dacă ambele condiții sunt adevărate, Bulă îi spune băncii că el dorește să accepte acest moldocoin și banca face o rectificare în baza de date că acest moldocoin va aparține lui Bulă.

Să-i facem pe toți să acționeze ca o bancă.

Soluția cu banca e una bună însă noi avem ambiții mult mai mari. Noi putem elimina cu totul banca din protocol. Aceasta va schimba considerabil natura banilor. Și când te gândești că puterea unei bănci centrale este imensă, controlul asupra masei monetare, schimbarea este destul de mare.

Idea este ca să-i facem pe toți participanții să acționeze ca o bancă. În special, vom presupune că toți utilizatorii de Moldocoin țin o copie a tuturor înscrierilor: care moldocoin și cui aparține. O carte contabilă în care sunt înscrise toate tranzacțiile. Să numim această carte block chain, fiindcă așa se numește în Bitcoin.

Acum, să presupunem că Alinuța dorește să transfere un moldocoin lui Bulă. Ea semnează mesajul: “Eu, Alinuța, îi dau lui Bulă un moldocoin, cu numărul de serie 654321” și transmite acest mesaj lui Bulă. Bulă poate utiliza copia sa de block chain pentru verificare. Dacă e ok, el acceptă moldocoin-ul, rectifică block chain-ul său și transmite mai departe în rețea pentru ca fiecare să-și modifice block chain-ul.

Mai rămâne problema, “de unde vine numărul de serie”? Această problemă e destul de ușor de rezolvat, veți vedea mai jos. O problemă mai mare care trebuie rezolvată, însă, este dubla cheltuire. Alinuța ne poate amăgi generând două mesaje cu același număr de serie, însă adresat la două persoane diferite. Ea poate trimite un mesaj: “Eu, Alinuța, îi dau lui Bulă un moldocoin, cu numărul de serie 654321” lui Bulă și altul “Eu, Alinuța, îi dau lui Ghiță un moldocoin, cu numărul de serie 654321” lui Ghiță. Ambii, Bulă și Ghiță utilizează copiile lor de block chain pentru verificare. Verificarea e efectuată în aceeași perioadă scurtă de timp și ambii acceptă tranzacția și transmit acceptul lor mai departe în rețea. Iată problema. Cum alții din rețea trebuie să rectifice block chain-ul lor? Nu există o metodă coerentă de a rectifica block chain-ul. Și chiar de ar fi, pe cine să-l credem? Pe Bulă sau pe Ghiță?

Cum putem rezolva problema cu dubla cheltuire? O soluție ar fi, ca atunci când Alinuța transmite lui Bulă un moldocoin, Bulă să nu încerce să verifice singur tranzacția. Bulă ar putea să transmită mesajul rețelei întregi de Moldocoin și să-i întrebe pe ei dacă tranzacția e validă. Dacă ei, cei din rețea, colectiv decid că tranzacția e validă atunci Bulă acceptă moldocoin-ul și toți rectifică block chain-ul. Acest prototip de protocol ne ajută să prevenim dubla cheltuire, pentru că dacă Alinuța va încerca să cheltuie moldocoin-ul său cu Bulă și Ghiță, alții din rețea vor vedea aceasta și îi vor comunica lui Bulă și lui Ghiță că există o problemă cu această tranzacție.

Ca exemplu, să presupunem că Alinuța dorește să-i dea lui Bulă un moldocoin. Ea semnează mesajul “Eu, Alinuța, îi dau lui Bulă un moldocoin, cu numărul de serie 654321” și-i transmite mesajul semnat lui Bulă. Bulă controlează la validitate, însă nu acceptă imediat, ci răspândește mesajul în rețea. Ei toți, verifică mesajul și confirmă că “Da, Alinuței îi aparține moldocoin-ul cu numărul de serie 654321, și poate fi transferat lui Bulă”. Demîndată ce un număr suficient de oameni confirmă, toți rectifică block chain-ul că moldocoin-ul 654321 îi aparține lui Bulă.

Acest protocol are multe elemente imprecise încă. De exemplu, ce înseamnă “îndată ce un număr suficient de oameni confirmă”? Ce înseamnă “suficient”? Nu poate fi toți cei din rețea și nici nu e specificat un procent anumit. Nu încercăm să rezolvăm această problemă acum, însă vom încerca să rezolvăm o altă problemă soluția căreia o rezolvă și pe aceasta.

Dovada muncii (proof-of-work).

Să presupunem că Alinuța dorește să facă o dublă cheltuire în rețeaua descrisă mai sus. Ea o poate face prin preluarea rețelei Moldocoin. Ea poate utiliza un sistem automatizat pentru a crea un număr mare de identități, să zicem un miliard, în rețeaua Moldocoin. Ca și mai devreme, ea va încerca să cheltuie dublu același moldocoin cu Bulă și Ghiță. Dar atunci când Bulă și Ghiță vor întreba rețeaua să valideze tranzacțiile, toate identitățile false create de Alinuța îi pot amăgi. Zicându-i lui Bulă că tranzacția lui e validă și zicându-i lui Ghiță că și a lui e validă.

O soluție șmecheră de a rezolva această problemă e să utilizăm ideea de proof-of-work (dovada muncii). Idea e destul de neintuitivă și implică combinația a două idei: 1) de a face (artificial) costisitoare validarea tranzacțiilor pentru utilizatorii din rețea și 2) de a-i remunera pe cei care ajută cu validarea tranzacțiilor. Remunerarea e necesară pentru a-i face pe utilizatorii din rețea să valideze tranzacțiile chiar dacă noi le-am făcut calculabile costisitor. Beneficiul de a face costisitoare validarea tranzacțiilor e că validarea nu mai poate fi făcută de cineva care controlează o mulțime de identități din rețea, ci de cei care au putere de calculator pentru validare. Cum vom vedea mai jos, putem face ca celor care trișează să nu le mai fie rentabil să trișeze.

Aceasta e esența dovezii muncii. Dar pentru a înțelege într-adevăr dovada muncii (proof-of-work) vom trece prin niște exemple.

Să presupunem că Alinuța distribuie în rețea mesajul: “Eu, Alinuța, îi dau lui Bulă un moldocoin, cu numărul de serie 654321”.

Alții din rețea primesc acest mesaj și îl adaugă într-o coadă cu tranzacțiile care au fost distribuite, însă nu au fost încă aprobate. De exemplu, un utilizator din rețea cu numele Vlad poate avea următoarele tranzacții în așteptare:

“Eu, Ion, îi dau lui Vasile un moldocoin, cu numărul de serie 443322”
“Eu, Alinuța, îi dau lui Bulă un moldocoin, cu numărul de serie 654321”
“Eu, Maria, îi dau lui Mihai un moldocoin, cu numărul de serie 445566”

Vlad verifică cu block chain-ul lui și vede că toate tranzacțiile sunt valide. El poate transmite întregii rețele că aceste tranzacții sunt valide. Însă, până a face aceasta el trebuie să rezolve puzzle de calcul - proof-of-work. Fără soluția la acest puzzle, restul rețelei nu-i va accepta validitatea tranzacțiilor.

Ce puzzle trebuie Vlad să rezolve? Pentru a Vă explica să luăm o funcție hash h care e cunoscută de toți din rețea - adică e inclusă în protocol. Bitcoin utilizează funcția hash binecunoscută SHA-256, însă poate fi utilizată orice hash funcție. Deci, Vlad ia toate tranzacțiile din coada l și adaugă la sfârșit un număr x (să-l numim nonce). De exemplu dacă l=“Salut lume!” și nonce x=0 vom avea.

h(“Salut lume!0”)= 4f8574dc0ca7fa7f046cf2a61c7964b177d3b60c3133e7537ea1f76829aacdc0

Puzzle care Vlad trebuie să-l rezolve, proof-of-work, să găsească un astfel de x, ca atunci când îl adăugăm la lista tranzacțiilor l hash-ul să se înceapă cu un anumit număr de zerouri. Să încercăm cu x=1.

h(“Salut lume!1”)= 5905051116ef23c9fa77cd654575cd86d8e42cd744f5b5a6980493f7e171e53f

heh.. nu se începe cu nici un zero..

Putem continua cu x=2,3 … În sfârșit x=8 obținem:

h(“Salut lume!8”) = 03b94aaf33d0a4bb88d3c1c7fa4aace92891e34b9689d793a060e6645e80af7f

Acest nonce ne dă doar un zero la început de rezultat, e doar un puzzle simplu, pentru un puzzle complicat se cer multe zerouri consecutive.

Ceea ce face ca acest puzzle să fie foarte greu de rezolvat e funcția hash, care se comportă ca un număr aleator, la cea mai mică schimbare a mesajului rezultatul funcției se schimbă total. Deci dacă dorim să avem un rezultat care să înceapă cu 10 zerouri, va trebui să încercăm 16^10 valori diferite pentru x pentru a găsi nonce-ul necesar. E un lucru foarte greu de calculat.

Evident, acest puzzle poate fi mai puțin sau mai mult dificil de rezolvat prin mărirea numărului de zerouri la rezultatul funcției hash. De fapt, protocolul Bitcoin anume asta și face, doar că nu numărul de zerouri, ci un număr care se numește target, iar rezultatul funcției hash trebuie să fie mai mic decât acest target. Acest target se ajustează pentru a da posibilitate oricui din sistem să găsească o soluție în 10 minute.

Deci, să zicem că Vlad a găsit nonce-ul x norocos. Felicitări. (El va fi remunerat pentru că a găsit soluția). El va distribui blocul de tranzacții spre aprobare împreună cu valoarea x. Ceilalți participanți din rețeaua Moldocoin pot verifica x dacă într-adevăr e proof-of-work. Și apoi să rectifice block chain-urile lor cu noile tranzacții din block.

Pentru ca idea cu proof-of-work să aibă succes, utilizatorii din rețea trebuie să fie stimulați pentru a ne ajuta cu validarea tranzacțiilor. Fără o astfel de stimulare, ei nu au nici un motiv să-și cheltuie timpul de calculator cu validarea tranzacțiilor altor oameni. Și dacă nimeni din sistem nu va valida tranzacțiile, sistemul nu va lucra. Soluția e să remunerăm oamenii pentru validarea tranzacțiilor. Să presupunem că vom recompensa cu moldocoini pe fiecare care va valida cu succes tranzacțiile. Recompensa trebuie să fie destul de mare pentru ca să avem doritori.

În protocolul Bitcoin, procesul de validare se numește minerit. Pentru fiecare block de tranzacții validate, minerul norocos primește o recompensă în bitcoini. Inițial se împărțeau a câte 50 de bitcoini. Însă la fiecare 210000 de blocuri validate (aproximativ la fiecare 4 ani) recompensa se înjumătățește. Rata de înjumătățire s-a întâmplat doar o singură dată, acum se dau câte 25 de bitcoini. Rata de înjumătățire la fiecare 4 ani va dura până în 2140. Până atunci când remunerarea va ajunge la 10^-8 bitcoini. 10^-8 bitcoin e unitatea minimală a bitcoin-ului și se numește satoshi. Deci spre 2140 masa totală de bitcoini va înceta să crească. Însă nu va elimina stimularea pentru validarea tranzacțiilor. Bitcoin presupune o plată minimă pentru procesarea tranzacțiilor, care se va duce la minerul care validează tranzacția.

Proof-of-work e un fel de competiție pentru a aproba tranzacții. Un miner are șansa de a câștiga proporțional cu puterea de calcul a a mașinilor sale față de puterea de calcul totală a sistemului. De exemplu dacă deține calculatoare cu puterea de 1% din puterea totală de calcul a rețelei Bitcoin, el va avea aproximativ șansa de 1% că  va câștiga competiția. Cu cât mai multă putere de calcul, cu atât mai mari șanse de câștig. Un miner necinstit, are relativ puține șanse pentru coruperea validării tranzacțiilor.

Deși un miner necinstit are puține șanse de a corupe block chain-ul, nu e deajuns pentru a avea încredere în valuta virtuală. Noi încă nu am finalizat problema cu dubla cheltuială.

Acuș vom analiza dubla cheltuială. Însă până atunci vom descrie un detaliu important în Moldocoin. Noi dorim ca în rețeaua Moldocoin să avem o ordine a tranzacțiilor. Dacă nu vom avea aceasta, nu va fi clar cine și ce moldocoini deține. Pentru aceasta noi vom cere ca orice block nou întotdeauna să includă un pointer la ultimul block validat din chain. Un block chain este un șir de block-uri aranjate unul după altul și fiecare conține pointer la block-ul precedent.

Ocazional, apare câte o bifurcație în block chain. Aceasta se poate întâmpla atunci când 2 mineri rezolvă puzzle-ul aproape simultan și ambii distribuie în rețea blocul nou validat și unii oameni rectifică după rezultatul la un miner alții de altul.

Și aceasta cauzează exact problema pe care noi o doream rezolvată, nu mai este clară ordinea tranzacțiilor și nici nu e clar cui aparțin moldocoinii. Din fericire este o soluție simplă pentru a anula bifurcațiile. Regula e următoarea: dacă apare o bifurcație, utilizatorii rețelei păstrează ambele ramificări. Iar minerii continuă să lucreze doar la bifurcația care are cel mai lung block chain. În rețeaua Bitcoin, o tranzacție nu se consideră confirmată până când: 1) Nu face parte din cea mai lungă bifurcație și 2) după ea urmează încă 5 blocuri în aceiași bifurcație.

Am pus la punct problema cu ordinea tranzacțiilor, să ne întoarcem la utilizatorul necinstit care vrea o dublă cheltuire. Presupunem că Alinuța încearcă să cheltuie aceiași bani cu Bulă și Ghiță. O variantă ar fi ca ea să valideze blocul care include ambele tranzacții. Presupunând că ea deține un procent din puterea de calcul a rețelei, există o șansă ca ea prima să rezolve puzzle-ul. Din nefericire pentru Alinuța, dubla cheltuială imediat va fi detectată de alții din rețeaua Moldocoin și vor respinge blocul chiar dacă conține rezolvarea proof-of-work.

O problemă mai serioasă e atunci când ea va distribui ambele tranzacții cu același moldocoin cheltuiți cu Bulă și Ghiță. Ea poate să distribuie o tranzacție spre unii mineri iar alta către alții în speranța că ambele vor fi validate. Din fericire rețeaua, după cum am văzut mai sus va confirma doar o tranzacție, nu și pe ambele.

Voila, dubla cheltuire a fost rezolvată, cu ajutorul unor tehnici de proof-of-work și ordonarea tranzacțiilor. Avem o valută virtuală deplin funcțională. Aceasta și este adevărata invenție. Până la Bitcoin lumea credea că e imposibil de a transmite un mesaj digital și înghețat în timp.

Proof-of-work și mineritul generează multe întrebări. Ce răsplată e îndeajuns pentru miner pentru a mineri? Cum creșterea masei de moldocoin afectează economia Moldocoin? Se vor concentra toți moldocoinii în câteva mâini?

Tranzacțiile care le-am prezentat în forme de mesaje, într-adevăr e un limbaj mult mai complex și uneltele financiare care vor fi inventate în viitor vor fi anume în baza acestui limbaj.

Ce unelte financiare vor fi inventate? Multe, foarte multe. Ne rămâne să așteptăm ca oamenii cu scaun la cap să le inventeze, până atunci ne vedem la bursă!