720 / 736OVFL

Value Overflow Incident

Incident přetečení hodnoty v bloku 74 638

Value Overflow Incident byl kritický konsenzuální incident z 15. srpna 2010: transakce v bloku 74 638 využila přetečení 64bitového součtu, takže dva obrovské výstupy prošly kontrolou a do právě těžené větve přidaly 2^64 satoshi navíc.

Chyba byla v implementaci validačního pravidla, nikoli v kryptografii nebo plánu emise. Každý výstup byl kladný, ale jejich součet přetekl do záporné hodnoty. Rozdíl mezi vstupem a tímto záporným součtem pak vypadal jako poplatek. Verze 0.3.10 doplnila horní mez pro jednotlivé výstupy i průběžný součet; po reorganizaci na opravenou větev chybný blok vypadl z aktivní historie.

Dne 15. srpna 2010 upozornil vývojář Jeff Garzik na podivný blok 74 638. Transakce 1d5e512a9723cbef373b970eb52f1e9598ad67e7408077a82fdac194b65333c9 utratila jediný vstup 0,50 BTC a vytvořila dva obří výstupy. Dobový výpis printblock uvádí každý z nich jako 92 233 720 368,54275808 BTC. Autor exploitační transakce nebyl spolehlivě určen; veřejný záznam dokládá její data, nikoli identitu nebo motiv člověka, který ji vytvořil. [1]

Bitcoin tehdy počítal částky jako podepsaná 64bitová celá čísla v satoshi. Celočíselná hodnota každého výstupu, doložená i hexadecimálním zápisem 0x7ffffffffff85ee0, byla kladná a těsně pod maximem int64. Součet 18 446 744 073 708 551 616 satoshi však překročil rozsah a přetočil se na −1 000 000 satoshi. Stará validace tento záporný součet považovala za přípustný při porovnání se vstupem. Šlo o aritmetickou chybu, nikoli o prolomení podpisů. První JSON výpis v diskusi má jiné poslední desetinné číslice; pro přesný výpočet zde vycházíme z celočíselné hodnoty, kterou potvrzuje printblock i hexadecimální zápis. [1]

Záporný součet výstupů −0,01 BTC proti vstupu 0,50 BTC vytvořil zdánlivý poplatek 0,51 BTC. Těžař proto v coinbase vybral 50,51 BTC místo základní odměny 50 BTC. Po odečtení utraceného vstupu a započtení nadbytečné části coinbase zvýšily dva obří výstupy nabídku chybné větve přesně o 18 446 744 073 709 551 616 satoshi, tedy 2^64 satoshi neboli 184 467 440 737,09551616 BTC. Toto číslo proto není pouhým součtem obou výstupů. [2]

Komunita reagovala veřejně a pod časovým tlakem. Lfm označil chybu za závažnou, Gavin Andresen navrhl rychlou kontrolu jednotlivého výstupu proti 21 milionům BTC a Satoshi Nakamoto zveřejnil rozšířenou variantu: odmítnout záporný či příliš vysoký výstup a po každém přičtení odmítnout i příliš vysoký průběžný součet. Satoshi současně požádal těžaře, aby dočasně přestali těžit, aby nová validní větev mohla chybnou větev rychleji dohnat a nahradit. [2]

Satoshi oznámil verzi 0.3.10 dne 15. srpna 2010 ve 23:48 podle času fóra, přibližně pět hodin a čtyřicet minut po Garzikově hlášení. Aktualizované uzly začaly považovat exploitační transakci a blok 74 638 za neplatné a stavěly na posledním společném validním bloku. Dobové oznámení později uvádělo, že správná větev už chybnou předstihla, takže po upgradu se klient automaticky reorganizoval bez ručního mazání blockchainových souborů. [3]

Nedošlo k editaci starého bloku v jedné centrální databázi. Existovaly dvě soupeřící historie: staré uzly přijímaly blok podle původních pravidel, zatímco opravené uzly jej odmítaly a akceptovaly pouze práci nad validním předkem. Teprve když opravená větev získala více Proof of Work, síť ji následovala a blok s inflací vypadl z aktivní historie; rozhodující byla instalace nových pravidel uživateli a těžaři i následná práce, nikoli příkaz jednoho administrátora. [3]

Ochrana zavedená tehdy zůstává čitelná v dnešním Bitcoin Core. CheckTransaction odmítá záporný výstup, výstup nad MAX_MONEY a také průběžný součet mimo MoneyRange; kontrola po každém sčítání brání tomu, aby se nebezpečný součet nejprve přetočil a teprve potom porovnával. Komentář ve zdroji výslovně odkazuje na CVE-2010-5139, zatímco zvláštní kontrola duplicitních vstupů připomíná odlišný incident CVE-2018-17144. [4]

Incident ukazuje, že limit 21 milionů není kouzelná konstanta chráněná samotným hashem: vynucuje jej sada přesných validačních pravidel a jejich správná implementace. Audit proto musí sledovat rozsahy jednotlivých hodnot, bezpečné sčítání, coinbase a poplatky, pořadí kontrol, testovací vektory na hranicích i shodu nezávislých implementací. Historie současně dokládá schopnost rané komunity chybu rychle opravit i tehdejší vysokou závislost na několika vývojářích, těžařích a ruční koordinaci. [5]

Pro nejúplnější obraz čtěte toto heslo společně s Bitcoin Core, Konsensuální pravidla, Transakce, UTXO, Reorg, Soft Fork.

01Existovalo někdy v platném Bitcoinu 184 miliard BTC?

Krátce existovaly na tehdy těžené chybné větvi jako výsledek exploitačního bloku. Opravené uzly tuto větev odmítly a validní větev ji reorganizovala, takže obří výstupy nejsou součástí dnešního aktivního blockchainu ani dnešní sady UTXO. Historický incident však nelze popřít: blok a dobová reakce jsou zdokumentované.

02Porušil incident navždy limit 21 milionů?

Ne v dnes přijímané historii, protože opravená konsenzuální pravidla chybný blok odmítla a jeho výstupy zmizely při reorganizaci. Událost ale ukázala, že limit závisí na bezchybné validaci a na tom, jaký software účastníci skutečně provozují; samotné tvrzení v dokumentaci nabídku nevynutí.

DOC · 001BitcoinTalk — Strange block 74638Primární zdroj DOC · 002BitcoinTalk — overflow bug SERIOUSPrimární zdroj DOC · 003BitcoinTalk — Version 0.3.10, block 74638 overflow patchPrimární zdroj DOC · 004Bitcoin Core — current CheckTransaction overflow checksDokumentace DOC · 005CVE — CVE-2010-5139Dokumentace
Revidováno: Primární zdroje · Nejde o investiční doporučení