1315. srpna 2010
Den, kdy vzniklo 184 miliard bitcoinů
Jedna transakce obešla kontrolu částek a vytvořila číslo mnohonásobně větší než plánovaná zásoba Bitcoinu. Oprava přišla během hodin, ale ukázala, že měnová pravidla jsou jen tak pevná jako kód, který je vynucuje.
V neděli 15. srpna 2010 upozornil Jeff Garzik na nově vytěžený blok 74 638 a částku, která neměla existovat. Jediná transakce vytvořila dva výstupy, každý přes 92 miliard BTC. Součet převyšoval plánovanou zásobu Bitcoinu téměř devěttisíckrát. Garzik v 18:08:49 UTC založil na fóru vlákno s názvem „Strange block 74638“ a vložil data bloku. Během několika minut bylo zřejmé, že nejde o chybu průzkumníku ani špatně umístěnou desetinnou čárku. Síť přijala blok porušující vlastní ekonomické pravidlo. Pokud chtěli uživatelé dál věřit, že mince nelze libovolně vyrábět, museli nejprve najít chybu, opravit software a přesvědčit dost účastníků, aby pokračovali po jiné větvi historie.
Podivný blok 74 638
Garzikův příspěvek byl krátký a věcný. Ukázal hash transakce a dva obří výstupy. Následný výpis printblock v téže diskusi uváděl jejich přesnou hodnotu: každý obsahoval 92 233 720 368,54275808 BTC. Blok zahrnoval také samostatnou coinbase transakci s odměnou 50,51 BTC pro těžaře. Vedle obvyklé základní odměny padesát bitcoinů působily ony dva výstupy absurdně: někdo právě vytvořil více než 184 miliard jednotek.
Za transakcí nestálo známé jméno ani veřejné vysvětlení. Dochovaný řetězec říká, co se stalo, ale ne kdo chybu využil a s jakým cílem. Označit autora za konkrétního hackera by znamenalo doplnit příběh o údaj, který prameny nemají. Jisté je pouze to, že transakce byla sestavena tak, aby zasáhla slabé místo validace.
Síť ji přijala, protože starý kód kontroloval jednotlivé výstupy a potom jejich součet. Každý z obřích výstupů se vešel do použitého číselného typu, ale při sčítání společně překročily jeho horní mez. Číslo se přetočilo do záporné oblasti a následná kontrola chybně usoudila, že se nevytváří nepovolená kladná hodnota.
Nešlo tedy o padělání podpisu, změnu starší transakce ani převzetí většiny hashratu. Útočník využil způsob, jakým konkrétní implementace zacházela s celými čísly. Matematické pravidlo „nevydávej víc, než vstupuje“ bylo správné; program jej kvůli přetečení neprovedl tak, jak lidé zamýšleli.
Blok byl už součástí nejlepšího řetězce. Každý uzel používající chybnou verzi jej považoval za platný a další těžaři na něm mohli stavět. Samotné veřejné odhalení proto nestačilo. Komunita musela reagovat rychleji, než se vadná historie rozšíří a obří výstupy začnou putovat dál.
Chyba mezi pravidlem a strojem
Limit 21 milionů se často popisuje jako neměnný zákon Bitcoinu. Incident ukázal přesnější obraz. Limit je soubor konsenzuálních pravidel, která jednotlivé programy a každý plný uzel musí bez chyby provést. Pokud všechny rozšířené uzly sdílejí stejnou chybnou implementaci, mohou na čas přijmout stav, který záměru odporuje.
Přetečení celého čísla je starý programátorský problém. Počítačový registr nemá nekonečný rozsah; po překročení mezní hodnoty může další aritmetika skončit na úplně jiné straně číselné osy. V účetním systému je taková drobnost zásadní. Součet musí být kontrolován nejen po výpočtu, ale už během něj a každá částka musí zůstat v povoleném rozsahu.
Dnešní Bitcoin Core proto provádí několik oddělených kontrol. Výstup nesmí být záporný, nesmí překročit maximální peněžní zásobu a průběžný součet se po každém přičtení znovu ověřuje. Tyto řádky nevznikly jako abstraktní opatrnost. Nesou paměť události, při které jedna chybějící ochrana dovolila síti zapsat ekonomicky nemožnou transakci.
Chyba zároveň ukazuje rozdíl mezi specifikací a společenským očekáváním. Nikdo ve fóru vážně netvrdil, že obří mince jsou legitimní jen proto, že je starý software přijal. Účastníci se shodovali, že jde o porušení zamýšleného pravidla. Tato shoda ale potřebovala technický prostředek: novou verzi, která vadný blok odmítne.
Právě zde se potkávají kód a lidé. Kód rozhoduje deterministicky, jaký blok uzel přijme. Lidé rozhodují, jaký kód nainstalují, když odhalí rozpor se zamýšlenými pravidly. Incident nebyl hlasováním o nové emisi; byl závodem o obnovení pravidla, které už komunita považovala za základ systému.
Přetečení je zrádné právě tím, že stroj nevidí absurdnost, kterou člověk pozná okamžitě. Procesor pracuje s číslem uloženým v omezeném prostoru; překročí-li výpočet jeho hranici, výsledek se může převrátit do jiné části rozsahu. Starý kód kontroloval jednotlivé výstupy, ale při sčítání nedržel průběžný součet v bezpečných mezích. Transakce proto prošla přes několik lokálně rozumných podmínek, a přesto porušila jejich celkový smysl. Oprava musela být konkrétní: nestačilo do komentáře napsat, že bitcoinů nikdy nebude víc než 21 milionů. Každý uzel potřeboval pravidlo, které tuto větu dokáže v každém výpočtu skutečně vynutit.
Oprava pod tlakem
Po oznámení se na fóru objevilo doporučení přestat přijímat transakce a dočasně netěžit. Každý nový blok nad vadnou transakcí by zvětšil množství práce, které bude nutné opustit. V síti bez centrálního vypínače nemohl Satoshi těžbu zastavit. Mohl pouze vydat opravu a přesvědčit provozovatele, aby ji spustili.
Verze 0.3.10 zavedla správné kontroly částek a odmítala blok 74 638. Opravené uzly se vrátily k poslednímu společnému platnému bodu a těžaři začali stavět alternativní větev bez inflační transakce. Dvě historie po určitou dobu soupeřily podle vložené práce.
Satoshi následně oznámil, že dobrý řetězec špatný předběhl. Aktualizovaný software provedl reorganizaci řetězce a vadný blok zmizel z aktivní historie. Transakce z větve, které nebyly samy neplatné, se mohly vrátit do čekárny a být později zahrnuty znovu; obří výstupy však podle nových kontrol existovat nemohly.
Tato náprava měla cenu. Těžaři na opuštěné větvi přišli o odměny a uživatelé museli přijmout, že několik hodin historie nebude pokračovat. V roce 2010 byla síť malá a koordinace rychlá. Stejný zásah v mnohem větším ekosystému by znamenal více ekonomických účastníků, software variant i sporů o to, kde přesně leží hranice opravy.
Rychlost reakce bývá líčena jako Satoshiho zázračný zásah. Ve skutečnosti ji tvořila řada pozorovatelných kroků: Garzik problém zveřejnil, další lidé analyzovali přetečení, vývojáři připravili změnu, provozovatelé nainstalovali novou verzi bitcoinového klienta a těžaři dodali práci správné větvi. Autor mohl navrhnout opravu, ale síť ji musela skutečně přijmout.
Nejtvrdší pravidlo potřebuje nejpokornější vývoj
Po opravě se počet platných bitcoinů vrátil do zamýšleného rámce a vadné miliardy nebylo možné utratit v pokračujícím řetězci. Incident proto neskončil trvalou inflací. Přesto není pouhou kuriozitou z beta verze. Je připomínkou, že peněžní jistota nevychází z hesla, ale z opakovaně ověřovaného programu.
Bitcoin bývá stavěn proti systémům, v nichž centrální autorita mění nabídku rozhodnutím. Ani zde však lidé nezmizeli. Vývojáři píší implementace, recenzenti hledají chyby, provozovatelé volí verze a těžaři vytvářejí pořadí bloků. Rozdíl je v tom, že zásah je veřejný a každý uzel může sám odmítnout pravidla, s nimiž nesouhlasí.
Událost také vysvětluje opatrnost, s jakou se dnes mění konsenzuální kód. Malá optimalizace aritmetiky může mít měnový důsledek. Testy, více implementačních kontrol a pomalá recenze nejsou byrokracie navíc; jsou obranou proti opakování chvíle, kdy několik bitů obrátilo miliardy z nepřípustného čísla na zdánlivě platné.
Jeff Garzik neučinil síť bezpečnou jedním fórovým příspěvkem, ale ukázal výhodu veřejné účetní knihy. Každý mohl podivný blok vidět, znovu spočítat jeho výstupy a kontrolovat nápravu. Chyba nebyla ukryta v interní databázi provozovatele. Ležela před celou komunitou i s důkazem, že ji staré uzly přijaly.
Limit nabídky tedy incident přežil jinak, než naznačuje slovo „neměnný“. Ne proto, že software nemohl selhat, ale protože selhání bylo viditelné, existovalo sdílené pravidlo, k němuž se dalo vrátit, a dost účastníků provedlo opravu. Příběh 184 miliard bitcoinů není popřením pevné nabídky. Je historií toho, co její udržení skutečně vyžaduje.
Událost také připomíná, že veřejnost kódu sama o sobě chybu neodstraňuje. Otevřený zdroj umožnil lidem problém dohledat, porovnat a opravit bez čekání na jediného dodavatele, ale rozhodující byla pozornost konkrétních účastníků. Někdo si musel všimnout nemožných čísel, někdo najít vadnou podmínku a provozovatelé museli přijmout aktualizaci. Transparentnost vytvořila možnost kontroly; teprve jednání ji proměnilo v obranu sítě. Proto je příběh důležitý i po letech: bezpečnost Bitcoinu neleží v představě dokonalého původního programu, nýbrž v kombinaci přesných pravidel, nezávislého ověřování a schopnosti reagovat na chybu bez jejího utajení.
Postavy a pojmy v Atlasu
Prameny a hranice příběhu
- 01BitcoinTalk — Strange block 74638
Původní upozornění Jeffa Garzika, přesné výstupy, rozbor přetečení a časová osa reakce.
- 02BitcoinTalk — overflow bug SERIOUS
Dobová vývojářská koordinace, oprava validační chyby a přechod na opravený řetězec.
- 03Bitcoin Core — transaction consensus checks
Současná implementace kontrol rozsahu jednotlivých výstupů a jejich součtu.