keresés

2016. október 28., péntek

Hogyan működik a Bitcoin? Technikai részletek II. - A Double Spending probléma, és a Blockchain megoldás

A Bitcoin Rendzser belső működésének technikai összefoglalója, azoknak akiket mélyebben érdekel a rendszer felépítése és működése. I. és III. rész

"Double Spending" avagy a digitális valuta mumusa, melyre a Bitcoin talált megoldást

Ismételjük át mit tudunk eddig a Bitcoin rendszerről. Tudjuk, hogy a Digitális Aláírás miatt, adott tranzakciókat csakis a jogos tulajdonos tud indítani. Tudjuk azt is, hogy a feladónak valóban van-e pénze, hiszen az összes hivatkozott tranzakciót ellenőrizzük, hogy valóban épp nála van-e az a pénz és még nem költötte el másra. De még mindig van egy igen nagy biztonsági rés a rendszeren, ami miatt nem tudjuk feltétlen ellenőrizni, hogy tényleg nem költötte-e el másra azt a pénzt, ez pedig a tranzakciók sorrendje miatt van.

Ha figyelembe vesszük, hogy a tranzakció üzenet gépről-gépre terjed, akkor láthatjuk, hogy egyáltalán nem egyértelmű, hogy a sorrend, amelyben a mi gépünkhöz értek a különböző tranzakciók ugyanaz, mint amilyen sorrendben valójában keletkeztek. A keletkezés idejéről pedig bárki könnyen hazudhat, hiszen nincs központi rendszer amely felvenné a valós keletkezési időpontot (mint pl. Paypal, ahol egy központi számítógép irányítja a tranzakciókat és határozza meg sorrendjüket). Ez pedig könnyen teret adhat csalásnak.

Példa: Anna elindít egy tranzakciót melyben pénzt ad Bélának, megvárja míg Béla feladja a kért csomagot, majd indít egy másik tranzakciót, melyben visszautalja magának ugyanazt a "bemenet"-et. Mivel a tranzakciókat nem minden gép ugyanakkor kapja meg, így lennének olyanok akik Anna második "double-spending" tranzakcióját kapnák meg a Bélához menő előtt, majd mikor megérkezne az első Bélához címzett tranzakció azt érvénytelenként kezelnék, hiszen egy már felhasznált bemenetre hivatkozna. Így Béla elküldte a csomagot, ám nem kapta meg az érte járó pénzt, a hálózatban pedig többé nem tudnák összeegyeztetni a tranzakciós könyvüket a felhasználók, hiszen nincs mód bizonyítani, hogy Annáé vagy Béláé-e jogosan a pénz, nem tudjuk melyik tranzakció jött létre először. Tehát kell valamilyen mód mely szerint az egész hálózat meg tud egyezni a tranzakciók sorrendjében, mely nem egyszerű feladat egy központi irányítást nélkülöző rendszerben. A Bitcoin megoldása egy találékony módja annak, hogy meghatározza és biztosítsa a sorrend hitelességét, egyfajta matematika versenyen keresztül, és nem mellesleg ez a "Double Spending" matematikai probléma megoldása is, mely már jó ideje egyetlen akadályként állt a digitális valuták biztonságának útjában.

The Blockchain, azaz "A Blokklánc" mely sorrendbe rakja a tranzakciókat

A Bitcoin rendszer úgy rakja sorrendbe a különböző tranzakciókat, hogy csoportokba gyűjti őket, melyeket "blokk"-oknak hívunk, ezeket a blokkokat pedig összeköti, ezt nevezzük blockchainnek, azaz blokkláncnak. Ez más mint a korábban említett tranzakciós lánc, hiszen azt arra használjuk, hogy nyomonkövessük, a pénz jelenlegi tulajdonosát, míg a blokklánccal a különböző tranzakciókat rendezzük sorrendbe. Minden új blokk hivatkozik az előtte lévőre, ahogy az a lenti képen látható. Ugyanúgy vissza tudunk menni itt is a legelső blokkig. Azokat a tranzakciókat melyek egy blokkba tartoznak úgy kezeljük mintha azonos időben jöttek volna létre, azokat a tranzakciókat pedig amik még nincsenek blokkokhoz csatolva, azokat "megerősítetlen" tranzakcióknak hívjuk. Bármelyik számítógép mely a hálozatra van csatlakoztatva, összegyűjthet egy blokkot a megerősítetlen tranzakciók közül és ezt az új blokkot közvetítheti a hálózatnak, mint az új láncszemet a blokkláncban. Mivel több gép egyszerre is elkészülhet a saját blokkjával, több lehetőség közül is választani lehet a következő láncszemet illetően, szóval mégis hogyan dönhetjük el melyik legyen a következő? Nem használhatjuk a sorrendet amelyben beérkeztek, hiszen mint azt a tranzakcióknál láttuk, ez más és más pontokhoz más és más sorrendben történhet meg.

txn=tranzakció

A Bitcoin megoldása erre a kérdésre az, hogy minden érvényes blokknak meg kell válaszolnia egy bonyolult matematikai problémát. Az újonnan létrejött blokk összes adata (tehát minden ami a fejlécben szerepel, a blokk létrejöttének időpontja, az előző blokk azonosítója, a benne lévő tranzakciók és egy random szám) átmegy egy kritográfiai hash függvényen, amely ad a blokknak egy egyedi azonosítót. A blokk akkor lesz érvényes, hogyha ez az azonosító egy bizonyos érték alatt van. A hash függvény lényege röviden, hogy tetszőleges karakterszámból, fix karakterszámú azonosítót csinál, mely független az eredeti karakterektől.

.
Láthatjuk, hogy az adott hash akár egyetlen karakter megváltoztatásával is drasztikusan más lesz. Teljesen kiszámíthatatlan, hogy adott bemenetnek mi lesz a kimeneti értéke, így az egyetlen lehetőségünk az, hogy egyszerűen megpróbáljuk eltalálni mi lehet az a random szám az adott blokk fejlécében, amivel az adott érték alatti hash függvényt kapunk. Talán könnyebb elképzelni ha úgy gondolunk rá, mint egy kódos zár, aminek nem tudjuk a kombinációját, de találgatás útján egyszer ki fogjuk tudni nyitni, tehát megkapjuk a helyes hash függvényt. Talán szerencsénk van és sikerül az első próbálkozásra, de valószínűleg sokszor újra kell próbálkoznunk, sőt ami azt illeti, egy mai modern számítógépnek több évre lenne szüksége ahhoz, hogy megtalálja a helyes számot. A Bitcoin rendszer egy megadott nehézségi szám által úgy van kalibrálva, hogy a hálózatnak nagyjából 10 percbe teljen mire valaki megtalálja a megoldást. Az első helyes megoldó közvetíti saját blokkját a többieknek, mint a következő láncot a blokkláncban.

A hash függvény véletlenszerűsége miatt kevés a valószínűsége annak, hogy két számítógép pontosan ugyanakkor találjon megoldást a saját blokkjára. Ha ez mégis megtörténik olyankor két, vagy több ágon folyik tovább a következő láncszem keresése, mindenki arra a láncra épít, amelyet először kapott meg. Ez az egymásmellettiség akkor törik meg amikor megtaláljuk a következő láncszemet, ilyenkor az az ág lesz követítve mindenkinek a hálózaton, amelyiket az a gép használt ami megtalálta a következő láncszemet, aki pedig más ágakra épített, azoknak a láncszemei felbomlanak, a bennük lévő tranzakciók pedig visszakerülnek a megerősítetlen tranzakciók közé, hogy később újabb blokkba kerüljenek. Általános szabály, hogy mindig a leghosszabb blokkláncot használjuk, tehát amint megszületik egy hosszabb a többinél, mindenki automatikusan arra vált, így a sorrend mindenkinél ugyanaz marad.

Double Spending a Blockchainben

Az előbb ismertetett egymás mellett épülő ágak miatt a lánc végénél lévő tranzakciók biztonságát illetően kételyek merülhetnek fel. Például ha a mi tranzakciónk épp egy olyan ágban volt, melyet felbontottunk, hiszen egy másik ágban korábban találták meg a következő láncszemet, akkor a tranzakciónk visszakerül a megerősítetlen tranzakciók közé. Ám ez pont az eddig megszüntetni kívánt Double Spendnek ad teret. Tegyük fel, hogy Anna pénzt küld Bélának, Béla megvárja míg a tranzakció megerősítést nyer, tehát bekerül egy blokkba, és elküldi a csomagot amit Anna vásárolt. Mivel a hálózaton lévő számítógépek mindig arra az ágra váltanak ahol a leghosszabb a lánc, ezért ha Anna létre tud hozni egy hosszabb láncot, melyben kicseréli a Bélához küldött tranzakciót egy másikkal amiben önmagának küldi el ugyanazokat a bitcoinokat, akkor Béla soha nem fogja megkapni a pénzét, hiszen az ő tranzakciója vissza lett dobva a megerősítetlenek közé, és mire bekerülne egy blokkba, addigra Anna tranzakciója lenne az érvényes, melyben ugyanazokat a bemeneteket használta, amiket Bélának küldött volna el.


Hogyan lehetséges mégis, hogy a blokklánc rendszer megakadályozza Annát abban, hogy átverje Bélát? Ahhoz hogy ezt megértsük kicsit jobban, el kell mélyednünk a korábban említett kriptográfiai hash függvény rejtelmeiben. Mint az már tudjuk, ahhoz hogy létrehozzunk egy blokkot, meg kell oldanunk azt a matematikai problémát, mely szerint a blokk fejlécébe tartozó adatok hash függvényének eredménye egy bizonyos érték alatt kell legyen, ezt pedig a fejléc végén lévő véletlenszerű számok próbálgatásával tudjuk megoldani (a kódos zár). Amikor megtaláljuk az eredményt, ez a hash lesz az adott blokk azonosítója. Hogyha csak egyetlen karaktert is megváltoztatnánk a blokkon belül, megváltozna a hash függvény eredménye is (ahogy azt láttuk korábban a kritográfiát bemutató képen), tehát megváltozna a blokk azonosítója. Mivel ezt az eredményt használjuk azonosítónak is ezért a blokkok csakis egymás után lesznek megoldhatóak.

Így néz ki egy blokk kriptográfiai hash függvénye

Ezért van az, hogy Anna nem tud előre létrehozni egy hosszabb láncot, hiszen csak a már létrejött blokkokra tud építkezni, amiknek tudjuk az azonosítóját. Csak akkor tudja elkezdeni készíteni a saját láncát, mikor az előtte levő blokk elkészült, és tudjuk az azonosítóját, hogy azt beleírhassa az ő saját blokkjába. Így Annának az egész hálózatnál kell gyorsabban készítenie egy hosszabb láncot, addig a pillanatig amíg Béla el nem küldi neki a csomagot amiért állítólag fizetett. Mint arról beszéltünk korábban, egy mai modern számítógépnek akár évekbe is tellhet mire egyedül létre tud hozni egy blokkot. De mi van akkor hogyha Annának nem egy, hanem 10 vagy 100 számítógép áll rendelkezésére? Annának lehetne akár 1000 számítógépe is, akkor is csekély esélyekkel indulna, hiszen a teljes hálózat ellen kell versenyeznie. Ha egyfajta lottóként gondolunk a dologra akkor mondhatjuk azt, hogy Anna vett 1000 lottószelvényt, de még így is sokkal nagyobb esély van arra, hogy valaki más lesz az aki nyerni fog és nem ő. Ahhoz, hogy Annának reális esélye legyen arra, hogy valaki más előtt készítsen új blokkot, a teljes hálózat számítási teljesítményének több mint 50%-ával kéne rendelkeznie. Ahhoz pedig sokkal többel, hogy több egymás utáni blokkot tudjon létrehozni.

Tehát a blokkláncban lévő tranzakciók egyfajtai matematikai verseny által vannak védve a rosszindulatú felhasználókkal szemben, melyben az egész hálózatot kéne legyőzniük. A láncok egymásutániságának eredménye, hogy azok a tranzakciók amelyek hátrébb vannak a láncban biztonságosabbak mint amik elöl, hiszen ahhoz, hogy egy hátrébb lévő tranzakciót le tudjon cserélni egy rosszindulatú felhasználó, sokkal hosszabb ideig kell, hogy nagyobb számítási teljesítménnyel rendelkezzen mint a teljes Bitcoin hálózat. Ezért ajánlott várni nagyjából 6 blokkot a mi tranzakciónkat tartalmazó után (1 blokk létrehozásának ideje=10 perc, 6 blokk=1óra), mielőtt 100%-osan biztosnak tekinthetjük a tranzakciót.

Források:

Nincsenek megjegyzések:

Megjegyzés küldése