Bitcoin pod kapotou

V létě 2011 napsal Jan Hrach pro server abclinuxu.cz výborný článek popisující vnitřní principy fungování bitcoinové sítě. I po téměř dvou letech tento článek považuji za jeden z nejlepších studijních materiálů v češtině, proto jsem se ho rozhodl s laskavým svolením autora publikovat i zde.

Bitcoin je měnový systém. Na rozdíl od ostatních dnešních měnových systémů ale nemá žádnou centrální autoritu, centrální banku, která by Bitcoiny vydávala, spravovala a starala se o ně. Veškeré finanční operace probíhají v P2P síti a jsou chráněny silnou kryptografií (konkrétně SHA256 a ECDSA). Odtud název kryptoměna (cryptocurrency).

Síť byla spuštěna na začátku roku 2009, pak bylo chvíli ticho a od začátku roku 2011 začala hodnota Bitcoinu narůstat přímo raketovým tempem.

Obsah

Potřebujeme Bitcoin?

 

Autor Bitcoinu, kterého mimohodem nikdo nezná a nikdo ho nikdy neviděl, byl nespokojený s „normálními“ penězi. Autor článku není ekonom, ale podívejme se stručně, jaké jevy se v současné ekonomice vyskytují.

  • Nekontrolovaná inflace. Instituce spravující měnu (ČNB u koruny, FED u dolaru) se může rozhodnout, že vytiskne hromadu papírků, a tím klesne hodnota měny.
  • Důvěra v centrální autoritu. Na ni lze působit pomocí různých tlaků například ze strany státu a provést veselosti jako měnovou reformu v roce 1953. Centrální autorita tak může peníze znehodnotit nebo vzít. U Bitcoinu by to v podstatě jít nemělo, například proto, že nikdo neví, kolik peněz vlastně máte a kolik vám tedy má sebrat :-).
  • Chargeback. Nevím, jak tady, ale v USA se stává, že někdo zaplatí v e-shopu kartou, potom se vyhlásí krádež karty a platba se stáhne zpátky. Pokud ale vykonanou službu nelze vrátit, nastává tahanice mezi e-shopem a bankou. V síti Bitcoin je zrušení jednou provedené transakce již po pár minutách velmi těžko proveditelné a po hodině už to v podstatě nejde. V původní studii o síti (PDF, vřele doporučuji prolítnout) je to označeno jako „non-reversible payments for non-reversible services“.
  • Anonymita. O sledovatelnosti plateb kreditkou snad nikdo nepochybuje, papírky jsou na tom trochu lépe, ale můžete si povšimnout, že například na českých bankovkách je vytištěné jakési unikátní ID. Zlí jazykové tvrdí, že pokaždé, když bankovka projde bankou, ID se naOCRkuje a kamsi uloží. Bitcoin není anonymní, ale spíš pseudonymní. Sice každý vidí, která adresa které co poslala, ale je netriviální přiřadit k adrese 19kPDYubVp6ykeEQqrSgb5L84e45wJtUe5 jméno (tedy pokud to zrovna někdo nevydá ve článku a nepodepíše se). Adres si ale můžete generovat neomezené množství a požívat jich víc.

K poslednímu bodu se ještě váže článek v LN Peníze podporují zločin. Švédové vážně uvažují o jejich zákazu o rušení anonymních bankovek ve Skandinávii. Kdo nedělá nic špatného, nemá se přece čeho bát.

A teď jak to tedy funguje

Transakce

Předně je třeba říct, že když řeknu, že mám 1 Bitcoin, neznamená to, že bych měl někde na disku uložený nějaký soubor s Bitcoinem, ale že všichni ostatní v síti vědí, že mám právo převést ho někomu dalšímu.

Převádění Bitcoinů se děje v takzvaných trasakcích. Transakce jsou uspořádané v jakémsi řetězu. Vypůjčím si vysvětlující obrázek z bitcoin.org:

bitcoin-transactions

Řekněme, že jsem člověk č. 1, a podívejme se na levé políčko Transaction. Řekněme, že všichni klienti v síti nějak vědí, že mám právo manipulovat s obsahem této transakce. Teď ji chci poslat člověku 2. Vezmu veřejný klíč člověka 2 a levou transakci, oboje to zahashuji SHA256, podepíšu a broadcastem pošlu do sítě. Všichni klienti si teď můžou snadno ověřit můj podpis a uvnitř vidí, že s transakcí může manipulovat člověk 2, protože tam je jeho veřejný klíč. Ten ji zase může poslat někomu dalšímu. A tak dále, a tak dále.

Takto by bylo možné posílat pouze celé Bitcoiny nebo nějaké podobné jednotky. Jenže my chceme umět poslat třeba 6,2831853 Bitcoinu. Ve skutečnosti proto každá transakce může obsahovat více veřejných klíčů a více podpisů a k nim přiřazené vstupy a výstupy. Představte si, že mám (já=Jenda) tři účty s následujícími zůstatky – Jenda!1 = 3,14 BTC, Jenda!2 = 2 BTC a Jenda!3 = 3 BTC a chci Pepovi poslat na jeho účet 6,28 Bitcoinu.

bitcoin-inout

Vytvořil jsem si čtvrtý účet Jenda!4 (pochopitelně s nulovým zůstatkem, je čerstvě vytvořený), peníze ze všech třech svých účtů jsem vložil do transakce, Pepovi jsem poslal 6,28 a zbytek jsem si vrátil! Takhle můžete poslat libovolný násobek 0,000 000 01 Bitcoinu (0,01 μBTC). Klient se při posílání peněz snaží účty různě defragmentovat.

Double-spending

Vraťme se k transakcím. Po provedení transakce tak, jak jsem ji popsal výše, by mi nic nebránilo, abych vzal další veřejný klíč, opět zahashoval původní blok, podepsal a poslal takhle ty stejné mince ještě někomu jinému. Tomuto problému se říká double-spending a obecně to není nic pěkného, každý by takhle mohl nekontrolovaně množit peníze. Potřebujeme tedy nějak zajistit, aby se mi po odeslání transakce nějak znemožnilo s těmi stejnými Bitcoiny znovu nakládat.

V jiných elektronických systémech (eGold, Linden dollar) se tohle řeší centrální autritou, která má u každého uživatele napsáno, kolik má peněz, a když je utratí, autorita si je odškrtne. Všichni věří autoritě a odmítají odškrtnuté peníze. Jenže my jsme si na začátku řekli, že autorita je fuj, protože se na ni dá působit, aby odškrtla i peníze, které nebyly utraceny. Musíme to tedy vyřešit nějak jinak.

Řešením je, že si všichni budou držet kompletní databázi provedených transakcí a když se bude někdo snažit utratit ty stejné peníze podruhé, všichni budou vědět, že už je jednou utratil. Teď musíme nějak vyřešit, aby když se do běžící sítě připojí nový klient, mohl si kompletní databázi transakcí z nějakého důvěryhodného zdroje stáhnout.

K čemu důvěryhodný zdroj? Nic mi nebrání utratit nějaké peníze, dostat za ně protislužbu, a pak do sítě připojit milion nodů (třeba virtualizovaných, na jednom počítači), které budou tvrdit, že ta transakce nikdy neproběhla a že já ty peníze tedy pořád mám a prodávající je nedostal. Musíme tedy nějak zařídit, aby většina klientů patřila čestným uživatelům a útočník nebyl schopen zaplavit síť svými zlými klienty.

Nabízí se omezení podle IP adres. To má ale značné nevýhody. Ve světě IPv4 mají počáteční rozsahy /8 alokované neuvěřitelné instituce, vládní i nevládní, zatímco zbytek světa je za NATem. Ty neuvěřitelné instituce tak mají k dispozici obrovské množství IP adres a síť by mohly ovládat. Ve světě IPv6 zase kdekdo dostane prefix /32, má tedy k dispozici 296 adres. A asi největší problém spočívá v tom, že se takto síť váže na IP síť a nemůže být provozována z méně svobodných zemí přes Tor, který operuje až na úrovni TCP. Tudy cesta nevede.

Bitcoin šel jinudy – o zůstatcích se rozhoduje výpočetním výkonem. Kdo má nejvíc výpočetního výkonu, rozhoduje, kdo komu co zaplatil. Předpokládá se, že slušní lidé ovládají většinu HW a útočník nedokáže získat dostatečný výpočetní výkon na to, aby je převálcoval.

Bloky

Jak je to tedy realizováno v praxi? V síti se broadcastují transakce, nody je zachytávají, a ty nody, které se rozhodly pomáhat svým výpočetním výkonem provozu sítě, provozují ještě k tomu takzvaný mining (těžbu). Říkame jim mineři.

bitcoin-sit

Miner poslouchá transakce, které létají kolem, a sestavuje z nich takzvaný blok. Vždycky vezme transakci a zahashuje ji. Potom vezme dva takovéto hashe a zahashuje je. Potom vezme dva takovéto hashe a zahashuje je. Takhle staví strom. Stromu se na počest jeho objevitele říká Merkle Tree.

bitcoin-strom

Výsledný hash vezme a vytvoří takzvaný blok. Blok obsahuje hash předchozího bloku, hash špičky stromu [merkle-root] a tzv. nonce.

bitcoin-blok

Vsuvka: proof-of-work

To, že máme (my, slušní lidé, vládci sítě) většinu výpočetního výkonu, dokážeme tak, že vyřešíme nějaký složitý výpočetní problém. Představte si, že chci Pepovi dokázat, že mám hodně výpočetního výkonu. Vyberu si nějaký řetězec, třeba AbcLinuxu, a zvolím si nějaký target, třeba 2256-8. Teď vezmu ten řetězec, přidám náhodnou nonce (třeba 0) a zahashuju to.

~> echo -n „AbcLinuxu0“ | sha256sum 
b9b9ffb6618884c3a612c910e12ec35059de47763642802df756bd5da866d3d2  -

Porovnám, jestli je výsledek nižší než target. Vidím, že není, protože výstup SHA256 je 256b číslo, a k tomu, aby bylo nižší než 2256-8, musí být jeho první bajt nulový, tedy v hexazápisu první dvě číslice musí být 0. Nezbývá mi, než zkoušet měnit nonce, až se mi to jednou povede. Protože nejsem lama, ubastlím si na to automat:

~> i=0; while ! (echo -n „AbcLinuxu$i“ | sha256sum | tr -d „\n“; echo " (nonce=$i)„)|grep -E “^00"; do let i++; done
(chvíle počítání)
00e4586488b2eba2d660ce6b2d972767195bcbff0fa043cd3659db13f43dad16  – (nonce=184)

Pepovi řeknu „Nonce je 184“, on si to už snadno ověří (udělá echo -n „AbcLinuxu184“ | sha256sum a zjistí, že na začátku jsou dvě nuly) a uzná, že mám dostatek výkonu na vyřešení takového problému. Target můžeme snižovat a problém se tak stává stále složitějším.

Mining

Miner tedy vždycky změní nonce, zahashuje a podívá se, jestli je hash menší než číslo, které si právě teď síť zvolila jako target (vulgárně řečeno, jestli je na začátku dost nul). A když se mu to povede, říkáme, že našel blok. Blok vypublikuje v síti, ostatní mineři zahodí transakce, co v tom bloku jsou (už v jednom bloku jsou, nemusí být v dalším), ze sítě si stáhnou transakce, co se ještě do žádného bloku nedostaly, a jedou odznova.

Bloky na sebe navazují a tvoří řetěz bloků, blockchain.

bitcoin-blockchain

Řetěz bloků byl počat 3. 1. 2009 tzv. Genesis blokem. Jeho hash je natvrdo zakódovaný v klientovi (+ v něm jsou hashe některých pozdějších bloků, aby procházení řetězu netrvalo tak dlouho) a klient mu věří. Když se klient poprvé spustí, stáhne si všechny bloky ze sítě. Obvykle obdrží řetěz, který vypadá zhruba takto:

bitcoin-forked

Příčinou větvení řetězce bloků [blockchain fork] může být buď to, že si někdo hrál (útočil), nebo že dva mineři našli blok ve stejný okamžik (+/- sekunda) a nějakou dobu se nevědělo, který blok se bude uznávat.

Klient načte všechny tyto bloky, vyhledá řetěz, který je nejdelší a má nejvyšší složitost (hashe v něm mají na začátku nejvíc nul), a začne transakcím v něm věřit. Do tvorby nejdelšího řetězce totiž bylo investováno nejvíc výpočetního výkonu a proto je nejdůvěryhodnější.

Pokud by si teď někdo řekl, že v bloku 3 je nějaká transakce, která se mu nelíbí, a chce ji zrušit, musí blok 3 změnit a pak rychle vyřešit 6 následujících bloků s alespoň stejnou složitostí, jako má původní řetěz, a tím se dostane dopředu a klienti mu začnou věřit. Jenže řešení 6 bloků v řádu minut je se současným HW nemožné. Transakce uložené v blocích, které jsou dostatečně hluboko, jsou tedy navždy pohřbeny a nikdo je nemůže změnit.

Motivace pro mining

Co motivuje minery k pálení elektřiny a výpočetního výkonu kromě pocitu, že zabezpečují síť? Je to finanční odměna. Pokud miner vyřeší blok, pak:

  • si do něj může přidat transakci za 25 BTC, která směřuje „odnikud“ na jeho účet
  • dostane poplatky za transakce obsažené v bloku

Odměna za nalezení bloku byla dříve 50 BTC. Na podzim 2012 ale klesla na 25 BTC, za další 4 roky klesne na 12,5 BTC a tak dále. Počáteční vysoké odměny jsou jednak motivací pro minery, aby těžili, i když sítí ještě neteče příliš mnoho placených transakcí, druhak řeší distribuci peněz, když nemáme žádnou centrální autoritu, která by je mohla vydávat.

Transaction fee (poplatek za transakci) je přebytek, který můžete dobrovolně nechat v transakci tím, že dovnitř pošlete o trochu víc než ven. Transakce pak bude vypadat třeba takhle:

bitcoin-fee

Po zahrnutí transakcí do bloku všechny jejich přebytky vypadnou na minera a ten si je může nechat. Transaction fees jsou jednak motivací pro minery, aby těžili, a druhak plní funkci ochrany před DoS útokem – pokud dojde k DoS útoku, nastaví se poplatek za transakci třeba na 0,1 BTC a útočníkovi brzy dojdou peníze.

Nutno podotknout, že placení poplatků za transakce je zcela dobrovolné. Stejně, jako vy můžete poslat velkou transakci bez poplatku, tak si miner může říct, že velké transakce bez poplatku do svých bloků nebude přidávat. Předpokládá se, že v budoucnu bude část minerů poplatky chtít a část ne. Pokud tedy za transakci zaplatíte, dostane se už do příštího bloku. Pokud ne, budete muset počkat, až najde blok nějaký miner, který poplatky nevyžaduje. Tj. buď s poplatkem a hned, nebo bez poplatku až za chvíli.

Hurá, jdeme minovat!

Na výkonnějším vícejádrovém procesoru vytěžíte za den v přepočtu jednu korunu, což se extrémně nevyplatí, pokud zrovna nemáte botnet. Situace s grafickou kartou, která umí OpenCL (neboli akceleraci výpočtů), je o něco lepší. Na jednu lepší grafiku to vychází asi na 30 Kč za den, takže i po započítání spotřeby elektřiny by si na sebe mohla vydělat. Autor ale žádnou takovou grafiku nevlastní, takže přes noc vypočítal desetník.

Pooled mining

Šance, že najdete blok a získáte odměnu 25 BTC, je extrémně nízká, protože těží spousta lidí a blok se nachází v průměru jednou za 10 minut. S procesorem najdete blok průměrně jednou za 100 let, s grafickou kartou jednou do roka. Jenže statistika je mrcha, takže klidně můžete smažit grafiku pět let a nenajdete a nenajdete. Proto chytří lidé vymysleli pooled mining (český překlad není, těžba v bazénu? :-) ). Spousta lidí se domluví a těží spolu v tzv. poolu, a když někdo najde blok, o odměnu se podělí podle toho, kdo kolik vypočítal. Aby nepodváděli, zvolí si vyšší target než je v síti a admin poolu pak rozděluje odměnu podle spočítaných bloků s tímto vyšším targetem.

Bitcoin.cz shodou okolností provozuje jeden z největších poolů. Tzv. „Slushův mining pool“ se v době psaní článku podílí na síti 20 % výkonu. Popis instalace a konfigurace mineru je nad rámec článku a autorova hardwaru, tak možná někdy příště.

Útoky na Bitcoin

Asi nejčastějším problémem je krádež peněženky. Soubor ~/.bitcoin/wallet.dat obsahuje soukromé klíče k vašim penězům. Pokud vám ho někdo ukradne, může si všechny peníze převést. Na Linuxu platí běžná pravidla bezpečnosti – předpokládám, že šifrování disku je samozřejmostí, pravidelně zálohujete, aktualizujete, nespouštíte pod svým uživatelem kdejaký bordel z Internetu atd.

Dalším, zatím spíše teoretickým útokem, je zlomení použité kryptografie. Jak můžete vidět ve stavbě bloku, hashuje se tam o sto šest, a jakmile by někdo citelně oslabil SHA-256, bylo by veselo. Cracknutí ECDSA by zase znamenalo ovládnutí všech cizích účtů. Pokud by oslabování kryptografie přicházelo postupně, šlo by Bitcoin za běhu přemigrovat na nový algoritmus – řeklo by se třeba, že od bloku 460 000 se používá SHA-3.

Double-spending se i přes veškerá opatření může výjimečně povést. Existují určité koncepty využívající souběhu [race-condition], jako co se stane, když někdo vypustí současně dvě transakce a teď ony se propagují sítí různou rychlostí. Pokud si třeba v automatu koupím sušenku, ale 100 ms předtím vypustím transakci popírající koupi sušenky, může se stát, že mi automat stihne vydat sušenku ještě před tím, než k němu ta sporná transakce pomalou sítí doteče. Obranou proti tomu je, že při transakcích malé hodnoty (ta sušenka) před vydáním zboží několik sekund počkáte; při transakcích velké hodnoty (auto, dům, uhelný důl) počkáte třeba hodinu, až bude transakce dostatečně hluboko v řetězu.

Co se týče ovládnutí přes 50 % výkonu sítě, dovedu si představit použití herních grafik v domácích počítačích s Windows, pokud se objeví nějaký hezký remote exploit. Těžko říct, jestli si operátoři velkých mining poolů můžou říct, že teďka budou ďáblové (neznám přesně protokol, jestli klienti v poolu nějak ověřují, co počítají, spíš ne). Předpokládám, že by se to rychle rozkřiklo, klienti by od nich hned odešli a síť by se zase vrátila do normálu.

Cenzura například ze strany vlády je víceméně vyřešena Torem – pokud se povede protunelovat Tor, dá se protunelovat i Bitcoin. Síť architekturou připomíná Skype, takže nody můžou komunikovat, i když na sebe nevidí. Ale pořád musí existovat nějaké supernody. Jak se píše v příručce – BitCoin requires that some country is still free.

Výzvy pro budoucnost

Jednoznačným cílem je stabilizace kurzu. Kurz velmi lítá a to znemožňuje nějaké serióznější použití měny.

Dalším problémem by mohlo být bobtnání blockchainu. Každý klient si drží kompletní transakční historii, a ta může, pokud by se dosáhlo obratu jako má VISA, růst v řádu TB za měsíc. Historii by šlo odlehčovat punktuováním Merkle Tree – když je nějaká transakce už dost hluboko, může se vyškrtnout; pokud se vyšktají vhodně, může vypadnout celá větev stromu. Asi tahkle:

bitcoin-punct

Pokud chceme Bitcoin používat i na mobilech a dalších zařízeních, která si nemohou dovolit provozovat „tlustého“ klienta s celou tou kryptografií kolem, bude potřeba implementovat klient-server model. Skupinka kamarádů si spustí server a přes mobil budou pouze zadávat platební příkazy. Už existují první alfaverze takových klientů, uvidíme, jak to dopadne.

Hlavní výzvou je teď ale pochopitelně větší podpora Bitcoinu v běžném životě. A i kdyby se Bitcoin nijak neujal, je to jednoznačně fascinující experiment a ukázka nových zajímavých algoritmů.

Q&A aneb Co se jinam nevešlo

Kolik Bitcoinů je/bude v oběhu?

Skoro 21 milionů v roce 2140. Těžba ale neprobíhá lineárně, zezačátku se těží mnohem rychleji. Můžete se podívat na graf. Limitovaný počet Bitcoinů může způsobit deflační spirálu. Jde o to, že když hodnota měny roste, lidé ji nechtějí utrácet, protože když si ji nechají, bude jim vydělávat. Nejsem ekonom, takže si netroufám hodnotit, jak je toto riziko významné.

Podle čeho se nastavuje target?

Síť by měla najít blok každých deset minut. Při spuštění sítě se target odhadne a síť se nechá vyrobit 2016 bloků, což by mělo trvat přesně dva týdny. Pokud to trvalo méně než dva týdny, target se sníží, pokud déle, target se zvýší (vyšší target = lehčí hledání). Teď se target většinou snižuje, protože se do sítě připojují nové a nové počítače.

Co je to složitost (difficulty)?

Složitost je inverzní k targetu. Čím nižší target (na začátku hashe musí být víc nul), tím vyšší složitost. Když je target nejvyšší možný, je složitost 1.

Kde najdu nějaké statistiky a aktuální údaje o Bitcoinu?

Na blockchain.info se dají najít všechny dosud provedené transakce a všechny nalezené bloky. V adresáři q se dají získat hodnoty jako aktuální složitost, kolik Bitcoinů je v oběhu atd. Aktuální kurz Bitcoinu je na Mt. Goxu. Hezká statistika i s kalkulačkou je zase tady. Určitě se podívejte na wiki o Bitcoinu.

[author_donate 19kPDYubVp6ykeEQqrSgb5L84e45wJtUe5]

Share Button
1 comments

Post Navigation