Hogyan működik a bitcoin?! (közérthető módon)
Mikor először hallottam a bitcoinról mint alternatív fizetőeszközről, nem csigázott fel a dolog. A digitális pénz mint olyan nem tűnt technológiai szempontból érdekes témának, de olyan gyakran hallottam róla, hogy úgy éreztem érdemes kicsit utánaolvasni. Ekkor kellett rádöbbennem, hogy a kriptovaluták világa korántsem unalmas. Sőt, meglehetősen komplex és valójában zseniális megoldásokat hozott olyan problémákra, ahol még maga a problémafelvetés sem egyszerű.
A bitcoint 2009-ben egy Satoshi Nakamoto (https://hu.wikipedia.org/wiki/Bitcoin) nevű úriember találta fel. Egy ismerősöm azt mondta, hogy a rendszer annyira zseniális, hogy Nakamoto-nak Nobel díj járna érte, de biztosak lehetünk benne, hogy ezt soha nem fogja megkapni. Satoshi Nakamoto ugyanis nem létezik. Valójában senki nem tudja, kicsoda ő, vagy hogy egyáltalán egy emberről van-e szó vagy egy csoportról. Egy dolgot tudhatunk róla, hogy mostanra már szinte biztosan nagyon gazdag. (Majd később az is kiderül, miért.)
Ahhoz, hogy megértsük hogyan működik a bitcoin, előbb tisztáznunk kell pár alapfogalmat.
Az első ilyen az aszimmetrikus titkosítás. Amikor egy dokumentumot hagyományos módon titkosítunk, akkor ugye az történik, hogy megadunk egy jelszót (kulcsot). A jelszó ismeretében valamilyen módszerrel titkosítjuk a dokumentumot. Ezt követően a dokumentumot csak a jelszó ismeretében lehet visszafejteni. Tehát ha pl. valaki ellopja, nem kell izgulnunk, nem tudja elolvasni, csak akkor, ha ismeri az általunk megadott jelszót. A “jelszót” a továbbiakban általánosabban kulcsnak fogjuk hívni. Ezt hívják szimmetrikus kódolásnak, hiszen a kulccsal kódoljuk le a dokumentumot, amit aztán kibontani is a kulccsal tudunk. A modern technológiának és a mögötte lévő matematikának köszönhetően létezik azonban aszimmetrikus kódolás is. Ez esetben nem egy kulcs van, hanem egy kulcspár. A kulcspár egyik tagja a publikus kulcs, a másik tagja a privát kulcs. Ha egy dokumentumot a publikus kulccsal kódolunk le, azt csak a privát kulccsal lehet visszafejteni. Ez ugye azért jó, mert a publikus kulcsomat odaadhatom bárkinek, aki innentől kezdve tud nekem titkos üzeneteket küldeni. A szimmetrikus esetben mindig gond, hogy ha elküldenek nekem egy titkos dokumentumot, utána hogyan juttassák el hozzám a hozzá tartozó kulcsot. Itt ez a probléma megszűnik. Bárki tud nekem titkos dokumentumokat küldeni úgy, hogy nem kell a kulcsok küldözgetésével foglalkoznia, és persze nem kell attól sem félni, hogy valaki ezt küldés közben ellopja. Ha kellően vigyázok a privát kulcsomra, úgy biztos lehetek benne, hogy rajtam kívül senki nem fogja tudni elolvasni a nekem küldött titkos (publikus kulccsal titkosított) dokumentumokat. A dolog visszafelé is működik, tehát az én publikus kulcsommal csakis olyan dokumentumot lehet visszafejteni, amit én kódoltam el a privát kulcsommal. Ha bármilyen más privát kulccsal kódolták azt le, akkor az én publikus kulcsommal kikódolva csak krix-krax lesz belőle. Majd ez is nagyon jó lesz valamire, de ehhez előbb tisztáznunk kell egy másik alapfogalmat, a hash-t.
A hash-t szokták “lenyomatnak” vagy “ellenőrzőösszegnek” is fordítani. Ez egy fix hosszúságú karaktersorozat ami csakis a dokumentumra jellemző. Ha a dokumentumon bármit változtatok a hash is változik. A hash tehát arra jó, hogy ellenőrizzük vele, hogy valami megváltozott-e vagy sem. A hash-ből és az előbb említett aszimmetrikus titkosításból összerakható egy egész érdekes dolog, a digitális aláírás. A digitális aláírás úgy működik, hogy a dokumentumról készítünk egy hash-t, amit aztán a privát kulcsunkkal elkódolunk. Ha elküldjük valakinek a dokumentumot és ezt az elkódolt hash-t (ez maga a digitális aláírás), akkor a fogadó ellenőrizheti, hogy azt valóban mi küldtük-e. Egyszerűen visszafejti a publikus kulcsunkkal a digitális aláírást és ő is legenerálja a hash-t. Ha ez egyezik, akkor mi küldtük a dokumentumot. Amiatt lehet ebben biztos amit az aszimmetrikus titkosításos rész végén írtunk. Nevezetesen, hogy a mi publikus kulcsunkkal csakis olyan dokumentum kódolható ki amit a mi privát kulcsunkkal kódoltak el. Ha bármilyen más privát kulccsal próbálkozik valaki, akkor azt a mi publikus kulcsunkkal kibontva valami krix-kraxot kapunk, de semmiképp sem a szükséges hash-t. A digitális aláírás tehát biztosítja, hogy az adott dokumentumot valóban mi küldtük, illetve hogy pontosan abban a formában küldtük el, ahogyan a fogadó fél megkapta, hisz ha bárki bármit módosít rajta utólag, a hash megváltozik, a digitális aláírás pedig érvénytelen lesz.
Ennyi kriptográfiai (titkosítás tudományi?) alapismerettel felvértezve már nekivághatunk a bitcoin világának.
Amikor valaki a pénzre gondol, általában pénzérmék, bankjegyek jutnak az eszébe, pedig ez a kép már rég túlhaladott. Az emberek a pénzüket bankokban tartják és bankkártyával fizetnek a boltban. A pénz ma már valójában nem más, mint egy bejegyzés a bank adatbázisában. Egy szám, ami csökken, ha veszünk valamit (pl. a boltban fizetünk a bankkártyával), vagy növekszik (pl. megkapjuk a fizetésünket). A pénzünket tároló adatbázisnak persze nagyon nagyon nagyon megbízhatónak kell lennie, de ez a tényeken nem változtat. A pénz nem más, mint egy szám egy nyilvántartásban. A bitcoinnál sincs ez másképp. A különbség annyi, hogy míg a bankok a pénzünket egy központosított adatbázisban tartják nyilván ami felett teljes kontrollal rendelkeznek, addig a bitcoin decentralizáltan működik. A decentralizáltság azt jelenti, hogy a bitcoin adatbázisát egyetlen központi szerver helyett a bitconit használók mindegyike tárolja és működteti. Ennek köszönhetően a bitcoint senki sem kontrollálja. Az árfolyamát nem lehet mesterségesen manipulálni, a tranzakciókat nem lehet megadóztatni, illetve minden teljesen anonim módon történik. Ez persze remek táptalajt biztosíthat a feketekereskedelemnek, de azért a bitcoin messze többről szól annál mint hogy biztonságosan vehetünk drogot az interneten. A bitcoin a tökéletes szabad, független fizetőeszköz. A decentralizáltságnak tehát vannak előnyei, ugyanakkor elég sok vele a probléma. Egy olyan hálózatról beszélünk ami mindig változik. Gyakran megjelennek benne új csomópontok (épp valaki felcsatlakozott a netre), vagy éppen eltűnnek (valaki épp kikapcsolta a gépét). E mellett a csomópontok egyáltalán nem megbízhatóak. Elképzelhető, hogy a rajtuk futó szoftver hibásan működik, vagy éppen egy csomópont rossz szándékkal fel akarja törni a rendszert, hogy így jusson pénzhez. Valójában az egész egy nagy katyvasz ami folyton változik. Senkiről nem tudjuk kicsoda, és senki nem megbízható. Erre a kuplerájra kell felhúzni egy olyan rendszert ami a bankokéval vetekedő biztonságot ad. Valójában már az is egy kisebb csoda, hogy ez megvalósítható, de ahogy a mellékelt példa mutatja, a modern kriptográfiának (és a mögötte lévő komplex matematikának) köszönhetően mindez kivitelezhető. Ebben rejlik a bitcoin zsenialitása.
Elsőként ejtsünk pár szót a decentralizált adatbázisról. Itt eleve már az is problémás, hogy A pontból B pontba hogy jutnak el az üzenetek. A bitcoin esetén általában broadcast jellegű kommunikáció van, ami azt jelenti, hogy az üzenetek mindenkinek szólnak. Egy ilyen hálózatban az üzenetek úgy terjednek, mint a pletyka. Az én gépem szól pár véletlenszerűen kiválasztott csomópontnak, akik továbbítják azt más általuk ismert csomópontoknak, és így tovább. A bitcoin esetén 8 másik csomópontot szólít meg a küldő csomópont. Gyors számolással kideríthető, hogy pár ilyen üzenetváltást követően hamar szétterjed bármilyen információ a hálózatban és nem okoz gondot az, ha egy-egy csomópont kiesik vagy éppen bekerül. A bitconokat tároló adatbázisból minden résztvevő tárol egy példányt amit aztán ezek a broadcast műveletek módosítanak és tartanak szinkronban. Az adatbázisban minden tranzakció szerepel ami a bitcoin keletkezése óta történt. Ez elsőre soknak tűnhet, de mivel egy tranzakció csak pár bájt, ezért pár Gb-ban elfér a teljes adatbázis. No de ha mindenkinek ott van a gépén a teljes adatbázis amit kedvére böngészhet, akkor hogy maradhat az egész rendszer anonim és követhetetlen? A bitcoin felépítéséből adódóan a tranzakciók nyíltak ugyan, de anonimak, hiszen a küldő és fogadó fél azonosítóiról nem tudjuk megmondani hogy kihez tartoznak. E mellett egy embernek akár több száz azonosítója is lehet, tehát azt sem lehet megmondani, hogy valaki hány bitcoin-al rendelkezik. Akár az is elképzelhető, hogy valaki bitcoin milliomos ugyan, de minden egyes bitcoinját külön azonosítón tartja. No de hogy lehet egy ilyen anonimizált rendszerben biztonságosan pénzt küldeni valakinek? Itt jön a képbe az aszimmetrikus titkosítás. A bitcoin esetén minden azonosító valójában egy aszimmetrikus kulcspár publikus fele amihez ugye tartozik egy privát kulcs is. Erre a privát kulcsra kell nagyon vigyázni, ugyanis ezzel tudjuk azonosítani magunkat egy tranzakciónál, ezzel tudunk pénzt küldeni. Tulajdonképpen minden egyes tranzakciót digitálisan alá kell írnunk, ezzel hitelesítve azt. Pont olyan ez, mint a bankoknál az átutalási megbízás. Ráírjuk a küldő azonosítóját (bank esetén számlaszám, bitcoin esetén az azonosítónk, miről pénzt akarunk küldeni), a fogadó azonosítóját, majd aláírjuk. Ilyen megbízást csak mi tudunk adni, hiszen mi rendelkezünk csak a szükséges digitális aláírással (privát kulccsal). Ezzel tehát biztosítva van, hogy a mi pénzünket csakis mi tudjuk költeni (kivéve, ha ellopják a privát kulcsunkat, amire ugye vigyáznunk kell, pl. kódolhatjuk egy plusz jelszóval is a biztonság kedvéért). Amikor pénzt akarunk utalni valakinek, akkor broadcastoljuk (szétküldjük) a hálózatban a tranzakciónkat, amit rövid időn belül mindenki megkap, és bekerül az adatbázisba. Az adatbázisban tehát nem az egyenleget tartjuk nyilván, hanem a tranzakciók listáját. Ha kíváncsiak vagyunk, hogy valakinek mennyi a bitcoin egyenlege, akkor a tranzakció listából összeszedjük azokat a tranzakciókat, ahol hozzá jött be bitcoin, aztán azokat, ahol ő küldött, és kivonjuk egymásból a kettőt. Nem is hangzik annyira bonyolultnak az egész, igaz? Csakhogy van ezzel egy kis probléma. Ki lehet trükközni azt, hogy egy adag pénzt 2x költök el (https://en.wikipedia.org/wiki/Double-spending). Megcsinálhatom azt, hogy kinézek 2 mobiltelefont 2 webshopban, ahol fizethetek bitcoin-al. Mondjuk kerüljön a telefon 1 bitcoin-ba (BTC), és nekem pont ennyi van. Írok egy tranzakciót az egyik webshop, és egy másik tranzakciót a másik webshop nevére, aztán szépen szétküldöm mindkettőt. Ha jól jön ki a lépés, mindketten megkapják azt a tranzakciót ami az ő nevükre szól, elfogadják a fizetséget, és elküldik a telefonokat. Aztán később jön a probléma, amikor kiderül, hogy a kapott bitcoinnal nem tudnak fizetni, mert az a hálózat egy része szerint másnál van, és sehogy nem lehet igazságot tenni, hogy melyik tranzakciót fogadjuk el valósnak. Szakszóval ezt úgy mondják, hogy inkonzisztens lesz az adatbázis. Igazából ennek a problémának a megoldása az, amitől Satoshi Nakamoto (bárki is legyen) bitcoinja annyira zseniális. Ahhoz, hogy csak egyetlen hiteles adatbázis változat létezhessen egy ilyen decentralizált hálózatban (globális konszenzus legyen a csomópontok közt), valakinek (egy 3. félnek) hitelesítenie kell azt. No de ki legyen ez a 3. fél?
A megoldás alapja a blockchain (https://en.wikipedia.org/wiki/Blockchain), ami a nevéből adódóan blokkok láncolata. Valójában a tranzakció listáról van szó, ami elég speciális kialakítással rendelkezik. A lista ugyanis blokkokból áll össze, amik szigorú sorrendben követik egymást. Minden blokkot egy véletlenszerűen választott csomópont hitelesít és minden blokk visszahivatkozik az előző blokkokra (tartalmazz az előző blokkok hash-ét), így biztosítva, hogy saját magán kívül minden régebbi blokk is hiteles, azokat nem piszkálta meg senki. A blokkok kb. 10 percenként jönnek létre és az addig felgyülemlett tranzakciókat tartalmazzák. Olyasmi ez, mint egy folyamatosan növekvő dokumentum, amit minden növekedés után valaki más ellenőriz és ír alá digitálisan. Ez a sokak általi hitelesítés teszi végül hitelessé a dokumentumot a teljes decentralizált hálózatban. Leírva sem annyira egyszerű, megvalósítani azonban még nehezebb. Gondoljunk bele, egy olyan hálózatról beszélünk, ahol egyik csomópontról sem tudjuk kicsoda. Elképzelhető, hogy egy csomópont egy emberhez tartozik, de akár csomópontok százait is kontrollálhatja egyetlen ember. A véletlenszerű választás sem olyan egyszerű, hiszen szükség lenne hozzá egy központi rendszerre, ami kisorsolja a soron következő felhasználót, ilyen meg ugye nem lehet egy decentralizált rendszerben. A probléma megoldására Nakamoto kitalált egyfajta lottót. Aki nyer a lottón, az írhatja alá a következő tranzakciót. Tranzakciókat hitelesíteni persze nem olyan mókás dolog (ráadásul számítási kapacitás igényes is), hogy csak ezért lottózzon az ember. Éppen ezért a lottónyertes a tranzakció hitelesítésén túl némi pénzt is nyer. A nyeremény jelenleg 25 bitcoin, ami aktuális árfolyamon számítva kis híján 8 millió forint. Ráadásul minden 10 percben van egy sorsolás. Ezért már érdemes ringbe szállni. Persze a lottónak van pár speciális szabálya. Egy szelvény kitöltése egy adott feltételeknek megfelelő hash kiszámítását jelenti. Ha megvan a hash, a “játékos” azonnal ellenőrizheti annak megfelelőségét. Ha megfelel a feltételeknek, szétküldi a hálózatba, ha nem, akkor próbálkozhat újra. Itt rögtön látszik is, hogy minél nagyobb valakinek a számítási kapacitása (minél izmosabb a számítógépe), annál több szelvényt kitölthet, így annál nagyobb az esélye, hogy nyerni fog. No de mi van akkor, ha többen is nyernek a lottón? Ez ugye problémát jelent, mivel egy blokkot csak egy csomópont hitelesíthet. Ennek kiküszöbölésére van egy másik mechanizmus. Mikor valaki megtalálta a hash-t (nyert a lottón, amit saját magának tud ellenőrizni), azt azonnal szétküldi a hálózatban, a fogadó csomópontok pedig azonnal elkezdenek dolgozni a következő blokkon. Mindezt azért teszik, mert ha több párhuzamos szál keletkezne (egy ponton többen is nyertek a lottón), a résztvevők azt a láncot fogják hitelesnek elfogadni, amelyik hosszabb. De ha 10 percenként keletkezik új blokk, hogy keletkezhetnek azonos idő alatt különböző hosszúságú láncok? Nos, ez a 10 perc valójában nem egy egzakt bebetonozott érték, hanem olyan, ami a rendszer működése során dinamikusan áll be. Ha túl gyorsan keletkeznek a blokkok, nehezebbé válik a lottó, így sokkal nehezebb nyerni. Ezzel a mechanizmussal próbálja 10 perc környékén tartani a rendszer a blokkok létrehozásához szükséges időt. Tehát egyfelől mindenki kapar, hogy minél hamarabb, minél több blokkot hitelesítsen a nyeremény reményében, másfelől a rendszer folyamatosan nehezíti a lottót, hogy minél jobban megközelítse a 10 percenként egy blokkos ideális nyerési gyakoriságot. Ez valójában azt jelenti, hogy a lottó nehézsége mindig a lottót játszó csomópontok összes számítási kapacitásával arányos. Mivel a lottó pénzt termel, ezért a bitcoin terminológia ezt bányászatnak hívja, hiszen olyan az egész, mintha aranyat bányásznánk. Ez egyben a válasz arra a kérdésre is, hogy hogyan keletkezik a bitcoin. A hálózat indulásakor egyáltalán nem volt bitcoin a rendszerben, aztán ahogy telt az idő, minden 10 percben keletkezett 50 egység (akkoriban ennyi volt a lottó nyereménye), mostanra pedig már csak 25 egység keletkezik blokkonként (ami azért 8 millió forinttal számolva nem olyan rossz). Ezen a ponton érthetjük meg azt is, hogy miért írtam a bejegyzés elején, hogy Nakamoto (és mindenki, aki még az elején csatlakozott a rendszerhez) nagy valószínűség szerint piszok gazdag. A hálózat indulásakor ugyanis még csak kevés csomópont volt a rendszerben, ami kis számítási kapacitást jelent, következésképp elég nagy eséllyel lehetett nyerni a lottón. Nakamoto gépe valószínűleg a kezdeti csomópontok között lehetett, így jó eséllyel igen szép ütemben növekedett a bankszámlája. Mostanra már elég nagy a bitcoin hálózat, ráadásul a bányászatra külön iparág épült fel. Léteznek például célhardverek, amiknek egyetlen célja, hogy piszok hatékonyan bányásszanak (vagy lottózanak ha úgy tetszik, ami véletlen hash-ek generálgatását jelenti). Ezek összes számítási kapacitása ma már sokszorosan meghaladja a mai legnagyobb szuperszámítógépek teljesítményét is. Aki tehát bányászatra adná a fejét, inkább keressen magának más kihívást, mert e mellett a számítási kapacitás mellett szinte nulla az esélye, hogy valaha is nyerjen. Belegondolni is rossz, hogy ez a hatalmas számítási kapacitás és az ehhez szükséges komoly mennyiségű energia vacak lottóra megy el, mikor akár rákkutatásra is fordíthatnánk. Ugyanakkor van az éremnek egy másik oldala is. A bányász gépek nagy tömege egyben a bitcoin rendszer zsoldos hadserege is. Ha valaki meg akarja támadni a rendszert, ezzel a hadsereggel kell megküzdenie. Egy komolyabb bitcoin tranzakció esetén a fogadó fél általában 1 órát vár, mire elfogadja a tranzakciót hitelesnek. Ez 10 perces blokkokkal számolva 6 blokkot jelent. Ha valaki meg akar hamisítani egy ilyen tranzakciót, annak 6 blokkot kell meghamisítania, vagyis 6x nyernie kell a lottón, ahol az egész bitcoin hálózat az ellenfele. Ehhez hatalmas számítási kapacitás kell (minél nagyobb a hálózat összes számítási kapacitása, annál nagyobb). Olyan nagy, hogy egyszerűen nem éri meg megtámadni a rendszert, főleg ha figyelembe vesszük, hogy 6 nyeréssel majdnem 50 millió forintra tehetünk szert teljesen legálisan.
Azt persze senki nem tudja, hogy mi lesz a bitcoin jövője. Jelenleg szárnyal ugyan, de semmi nem zárja ki azt, hogy kimenjen a divatból és más kriptovaluta vegye át a helyét. Az árfolyamot sem garantálja semmi. Egy hiba a szoftverben, a protokollban, vagy más nem várt esemény letörheti az árfolyamot, stb. Szóval ahogyan más valuta, a bitcoin sem egy életbiztosítás. Minden esetre jelenleg igen stabil és megbízható fizetőeszköznek tűnik. Bárhogy is legyen, egy dolog biztos. A bitcoin és a zseniális Satoshi Nakamoto (bárkit/bárkiket is takarjon a név) örökre beírta magát az Internet történelmébe.
Originally published at lf.estontorise.hu on March 31, 2017.