‘Selfish mining’ elv a gyakorlatban

A tegnapi cikk kapcsán előkerült a 51% attack és a double spending gyakorlati kérdésköre. Ennek kapcsán gondoltam edukációs célzattal bemutatom az egyik legismertebb módszer lényegét, amit anno 2013-ban még Emin Gun Sirer és Ittay Eyal publikált “Majority is not Enough: Bitcoin Mining is Vulnerable” címmel.

Nézzük az egész témát a gyakorlatban. Ugye így épülnek szépen sorjában a blokkok:

A blokkokat különböző minerek/poolok hozzák létre, majd egyszer csak az egyik pool úgy dönt, hogy double spendelni akar. Ekkor az egyik pool úgy dönt, hogy végrehajt egy 51% attackot. Ehhez persze nem árt, ha az összes hashing power jóval több mint 50%-ával rendelkeznek, de szigorúan matematikai alapon erre úgy egyébként 33,3% is elég, ha a difficulty adjustment nem azonnal reagálja le a fő láncon történő hash elvonódást.

A “Selfish miner” (pirossal jelölt blokkok) elkezd gyártani egy blokkot (piros #1-es), miközben a többi miner gyárt egy blokkot az eredeti #0-ás után. A Selfish miner blokkja persze hamarabb készül el, hiszen több hashing powerrel rendelkezik. Ennek okán a selfish miner lánca lenne a hosszabb lánc, ami miatt a kék #1-es el sem készülhetne, azonban:

A Selfish miner NEM propagálja a blokkot, hanem megtartja azt magának. Így az összes többi miner valójában azt hiszi, hogy az eredeti (kék) lánc a leghosszabb.

Ezt követően a Selfish miner elkészít még egy blokkot (piros #2), mire a többi bányász is propagálja az elkészült (kék #1) blokkját. Itt a támadó már pontosan tudja, hogy olyan mennyiségű hashing power van a kezében, amivel stabilan meg tudja csinálni a támadást. Ekkor:

A támadó előveszi a meglévő – a támadásra félrerakott – coinjait és a főláncon beküldi azt az egyik tőzsdére, majd a továbbra is rejtve bányászott láncon (piros) ugyanazt elküldi egy másik tőzsdére. A rejtett (piros) láncról továbbra sem tud senki a Selfish mineren kívül, mivel ezek a blokkok nem kerülnek propagálásra a hálózat felé!

Ezen a ponton a Selfish minernek tovább kell gyártania a blokkokat a piros láncon, míg a főláncon (kék) megvárja, hogy megtörténjen a 20 confirmation, amíg az exchange elkölthetővé teszi a beküldött coinokat. Amikor ez megtörténik, akkor azonnal eladja a coinokat és az ellenértéket valamilyen gyorsan kiküldhető formában, lehetőleg privacy coinok (zcash, monero, stb.) formájában kimenti a tőzsdéről. Megvárja, amíg a kiküldés is confirmálódik, majd fogja magát és elkezdi szépen lassan propagálni a piros lánc blokkjait:

A propagálás végére a nodeok azt fogják látni, hogy megjelent egy újabb lánc, ami sokkal hosszabb, tehát ezt követően mindenki dropolja az eredeti kék láncot és folytatják a felfedett selfish miner által gyártott láncot. Amint a második láncot elkezdik folytatni a rendes bányászok is valójában nem csak, hogy megtörténik ugyanannak a coin mennyiségnek az elküldése egy másik exchangere (xchg#2), de egyből meg is kapja a 20 confirmation-t, tehát azonnal el is költhető lesz a másik láncon és másik exchangen ugyanaz a coin, ami alig néhány blokkal korábban egyszer már elköltöttek a korábbi (kék) láncon. Természetesen ezt a támadó azonnal el is költi/átváltja.

Hogy ki járt rosszul az egésszel? Természetesen az első exchange (XCHG#1), hiszen a longest chainen valójában meg sem történt az az esemény, amikor beküldésre került hozzá egy adat coin és mégis el lett adva az. Tehát összességében  olyan coinokat adott el, ami valójában sosem kerül az exchangere. Itt nyilván az exchange a lehető leggyorsabban megpróbálja értesíteni a fejlesztőcsapatot és a többi exchanget is. Ám ennek reakcióideje akár extrém hosszú is lehet, így szinte biztos, hogy a támadó minden gond nélkül véghez tudja vinni a támadást és az eladásokat, hiszen valójában a második exchange (XCHG#2) jogosan birtokolta az eladásra került coinokat, mivel az ő általa ismert leghosszabb chainen tényleg hozzá kerültek a coinok.

Persze az exchangek több módon is próbálkoznak védekezni ezen támadás ellen. Pl többször is elfordult már, hogy ha egy kriptopénzből hirtelen tűnik el nagy mennyiségű hashing power, akkor az adott algo összes coinjánál felemelik a confirmation-t. Legutóbb pont a héten bekövetkezett zencash támadásnál emelték fel a tőzsdék 20-ról 120-ra a minimum confirmationt. Hogy mit érnek el ezzel? Nyilván időt nyernek, mely idő alatt esetleg ki tudják hámozni, hogy melyik addressen történt double spending, ehhez persze nagyon hatékony együttműködés szükséges az exchangek között, ami centralizált exchangek esetén még talán létezhet is, de az egyre inkább erősödő decentralizált exchange és atomic swap megoldások tükrében ezen támadások valószínűsége sokkal inkább fog növekedni.

Hogy mi erre a megoldás és ‘ha ennyire bugos, akkor egyáltalán miért nem javítják meg…’ típusú kérdésekre az egyezményes válasz: Nem minden arany ami fénylik. Aki minority hash powerrel rendelkező crypto-t bányászik vagy akár csak tart az legyen felkészülve arra, hogy ilyen támadások bármikor bekövetkezhetnek. Aki pedig szeretné magát ettől megóvni, annak:

  • csak majority hash powerrel bányászott PoW coinokat használj. (Bitcoin, Ethereum, LTC, Zcash, Monero, stb.)
  • vagy használj olyan altcoinokat, amikben a konszenzus egyéb módon (pl. PoS, DPoS) van elérve és van is mögötte akkora mennyiségű validity stake, ami alapján feltételezhető, hogy mindenki tisztességes.