Vrátili jsme se k tomu jedinému problému. Teď už máš všechny díly, takže se dá rozebrat pořádně: proč se nedá vyřešit podpisy, proč potřebuješ shodu na pořadí a proč z toho nutně plyne, že nic není nikdy úplně definitivní.
Podpisy nestačí
Alice má jednu minci. Podepíše převod Bobovi. Podepíše taky převod Evě, té samé mince.
Oba podpisy jsou platné. Oba projdou ověřením, oba jsou matematicky v pořádku. Kryptografie umí říct „tenhle převod podepsal držitel klíče", ale neumí říct „a tenhle byl první".
Potřebuješ tedy něco, co určí pořadí. A to je přesně to, co blockchain vyrábí. Ne důvěru, ne bezpečnost v obecném smyslu, jen shodu na tom, co se stalo dřív.
Proč je pořadí těžké
V jednom počítači je pořadí triviální: co přišlo dřív, to je dřív. V síti stovek počítačů rozházených po světě to triviální není:
- Zprávy chodí různě dlouho, takže „dřív" nemá jednoznačný smysl.
- Hodiny na jednotlivých strojích se liší a útočník může svoje libovolně nastavit.
- Nedá se hlasovat podle počtu účastníků, protože účty se dají vyrábět zdarma. Tomu se říká Sybil útok a je to důvod, proč demokracie v anonymní síti nefunguje.
Proof of work řeší všechny tři naráz jedním trikem: hlasuje se prací, a ta se vyrobit zdarma nedá. Kdo chce mít vliv, musí něco spálit.
Jak to nakonec funguje
Bloky určí pořadí a práce určí, který řetěz bloků platí. Když Alice pošle oba převody, mineři je uvidí oba, ale do bloku se dostane jen jeden, protože ten druhý utrácí už spotřebovaný vstup a uzly ho odmítnou.
Pořád ale platí, že to není definitivní. Kdyby vznikl delší řetěz, ve kterém je místo Bobova převodu Evin, přepsalo by se to. Proto se ochrana neměří kvalitativně („je to zapsané"), ale kvantitativně: kolik práce by musel útočník udělat, aby to změnil.
To je zásadní posun v uvažování. V databázi je transakce buď zapsaná, nebo ne. V blockchainu je zapsaná s určitou jistotou, která roste s každým dalším blokem a nikdy nedosáhne stoprocentní.
Kolik potvrzení stačí
Změřeno v kapitole podvrhni si blockchain:
| Potvrzení | Útočník s 10 % | s 30 % | s 45 % |
|---|---|---|---|
| 0 | 100 % | 100 % | 100 % |
| 1 | 11,1 % | 42,9 % | 81,8 % |
| 3 | 0,1 % | 7,9 % | 54,8 % |
| 6 | 0,0002 % | 0,6 % | 30,0 % |
Praktické pravidlo tedy nezní „čekej šest potvrzení", ale „zvol počet potvrzení podle hodnoty transakce a podle toho, jak koncentrovaný je mining v dané síti". U velkých sítí je šest hodně, u malé sítě, kde si hodinu výkonu koupíš za pár tisíc, nestačí ani padesát.
Kde se to v praxi zneužívá
Dvojí utracení není teorie. U menších sítí s levným výkonem k němu opakovaně došlo: útočník si pronajal těžební výkon, poslal prostředky na burzu, vyměnil je za jinou měnu, vybral, a pak zveřejnil delší řetěz, ve kterém původní vklad neexistoval. Burza přišla o peníze, útočník odešel s výměnou.
Obrana burz je proto přímočará: čím levnější je výkon dané sítě, tím víc potvrzení se čeká, a u některých sítí se vklady omezují nebo ruší úplně.
Cvičení
- Proč nejde dvojí utracení vyřešit tím, že se do transakce dá časová značka?
- Burza přijímá vklady po jednom potvrzení. Kdy je to bezpečné a kdy hazard?
- Proč se ochrana v blockchainu vyjadřuje pravděpodobností a ne jistotou?
Náčrt řešení: rozbal, až si cvičení zkusíš sám
- Protože značku si píše odesílatel a může do ní napsat cokoli. Nikdo nemá jak ověřit, že je pravdivá, a hodiny účastníků se navíc liší. Potřeboval bys důvěryhodný zdroj času, což je zase ta třetí strana. Blockchain proto čas nepoužívá k určení pořadí; pořadí určuje zařazení do bloku a značka slouží jen k regulaci obtížnosti, navíc s omezenou tolerancí.
- Bezpečné je to u malých částek na velké síti, hazard u velkých částek nebo malé sítě. Rozhoduje poměr mezi hodnotou vkladu a cenou přemínování jednoho bloku. Pokud je vklad výrazně levnější než hodina pronajatého výkonu, útok se nevyplatí. Jakmile je vklad srovnatelný nebo vyšší, jedno potvrzení je pozvánka.
- Protože vždycky může přijít delší řetěz. Neexistuje okamžik, po kterém by přepis byl matematicky nemožný; je jen čím dál dražší. Jistota je tedy asymptotická: s každým blokem se blíží jedné, ale nikdy jí nedosáhne. Je to zásadní rozdíl proti databázi, kde je zápis buď proveden, nebo ne.
Shrnutí
- Podpisy prokážou pravost převodu, ale ne jeho pořadí. Oba konfliktní převody jsou platné.
- Potřebuješ shodu na pořadí, a to je jediné, co blockchain skutečně vyrábí.
- Hlasování podle počtu účastníků nefunguje kvůli Sybil útoku, proto se hlasuje prací.
- Ochrana není kvalitativní, ale kvantitativní: měří se v ceně přepisu, ne v tom, zda je zapsáno.
- Počet potvrzení se volí podle hodnoty transakce a ceny výkonu v dané síti.
Proč nestačí ke stanovení, který převod platí, ověřit podpisy?
Protože oba konfliktní převody mohou být podepsané správně. Kryptografie prokáže, že je podepsal držitel klíče, ale neřekne nic o tom, který vznikl dřív. Potřebná je shoda na pořadí, a tu vyrábí až blockchain zařazením transakce do bloku.
Co je Sybil útok a proč kvůli němu nejde hlasovat počtem účastníků?
Vytvoření libovolného množství falešných identit, což je v anonymní síti zdarma. Hlasování podle hlav by proto ovládl každý, kdo si vyrobí dost účtů. Proof of work místo toho váže vliv na prokázanou práci, kterou vyrobit zdarma nelze, a proof of stake ho váže na vložený kapitál.
Proč není transakce v blockchainu nikdy stoprocentně definitivní?
Protože pravidlem je, že platí řetěz s největší prací, a takový řetěz může kdykoli vzniknout znovu. Přepis se s každým dalším blokem prodražuje, takže pravděpodobnost úspěšného útoku klesá geometricky, ale na nulu se nedostane. Jistota je proto asymptotická, nikoli absolutní.
