Forky a nejdelší řetěz

Reorg, potvrzení a proč není nic nikdy úplně definitivní.

Co se naučíš: Pochopíš forky, reorg a proč není v blockchainu nic nikdy úplně definitivní.

5 min čtení + cvičeníNavazuje na:⛏️ Proof of work

Dva mineři najdou blok ve stejnou chvíli. Kdo vyhraje? A co se stane s transakcemi v tom druhém bloku? Odpověď je jednodušší, než se čeká, a má nepříjemný důsledek: nic není nikdy definitivní.


Fork vzniká úplně běžně

Není to porucha. Bloky se šíří sítí několik sekund, takže když dva mineři najdou blok skoro současně, část sítě uvidí nejdřív jeden a část druhý. Obě části pokračují na tom svém.

Rozhodne se to samo: jakmile na jedné větvi přibude další blok, je delší a všichni na ni přejdou. Ten druhý blok se stane osiřelým a jeho odměna propadá, i když byl vytěžený poctivě.


Pravidlo není „nejdelší", ale „nejvíc práce"

Zjednodušení, které se traduje, je nepřesné a v kapitole podvrhni si blockchain sis změřil proč: větev může vyhrát s menší prací, protože je hledání losování.

Skutečné pravidlo porovnává nasčítanou obtížnost, ne počet bloků. Rozdíl se projeví, když se obtížnost mezi větvemi liší. Kdyby platil počet bloků, mohl by útočník vyrobit dlouhý řetěz s uměle nízkou obtížností a vyhrát s minimem práce.


Co se stane s transakcemi v prohrané větvi

Vrátí se do mempoolu, jako by nikdy nebyly potvrzené. Většinou se dostanou do některého z dalších bloků, protože jsou pořád platné.

Nastat ale může i horší varianta: pokud v nové větvi existuje konfliktní transakce, která utrácí tytéž vstupy, ta původní už se nikdy nepotvrdí. Přesně tohle je dvojí utracení a přesně proto se čeká na potvrzení.


Finalita: čím se to liší u proof of stake

U proof of work je finalita pravděpodobnostní. Nikdy nemáš jistotu, jen čím dál menší pravděpodobnost přepisu.

Řada systémů s proof of stake proto přidává finalitu jako pravidlo: po určitém počtu bloků prohlásí validátoři blok za konečný a přepis by znamenal, že přijdou o vklad. Získáš tím jistotu, ale zaplatíš složitostí a tím, že jistota stojí na ekonomických sankcích, ne na fyzikální ceně práce.

Proof of workProof of stake s finalitou
Finalitapravděpodobnostní, nikdy úplnápo vyhlášení konečná
Čím je vynucenácenou přemínováníztrátou vkladu validátorů
Co se stane při útokupřepis je drahý, ale možnýútočník o vklad přijde

Cvičení

  1. Miner najde blok, ale prohraje fork. Co ztratil?
  2. Proč se porovnává nasčítaná obtížnost a ne počet bloků?
  3. Obchodník přijme platbu po jednom potvrzení a zboží pošle hned. Co se mu může stát i bez útočníka?
Náčrt řešení: rozbal, až si cvičení zkusíš sám
  1. Odměnu za blok i poplatky, tedy celý výnos, a k tomu vynaloženou elektřinu. Práce byla poctivá, blok platný, ale nikdo na něm nepokračoval. Tomuhle riziku se říká osiřelé bloky a je to jeden z důvodů, proč mineři sdružují výkon do skupin: menší miner by jinak měl výnos velmi nepravidelný. Je to zároveň důvod, proč záleží na kvalitě připojení, protože kdo šíří blok pomaleji, prohrává forky častěji.
  2. Aby nešlo vyrobit dlouhý řetěz levně. Kdyby rozhodoval počet bloků, mohl by útočník v izolované větvi snížit obtížnost a nasekat mnoho snadných bloků, které by v součtu znamenaly minimum práce, ale největší délku. Nasčítaná obtížnost měří to, co skutečně chceme: kolik práce za tou historií stojí.
  3. Může přijít reorg i bez útoku. Když v tu chvíli existoval fork a vyhrála druhá větev, jeho transakce se vrátí do mempoolu. Většinou se pak potvrdí v dalším bloku a nic se nestane, ale pokud kupující mezitím poslal konfliktní transakci utrácející tytéž vstupy, obchodník zboží odeslal a platbu nedostane. Jedno potvrzení je proto ochrana proti náhodě, ne proti záměru.

Shrnutí

  • Forky vznikají běžně, protože blok se šíří sítí několik sekund.
  • Vyhrává řetěz s největší nasčítanou obtížností, ne s nejvíc bloky a ne ten první.
  • Poražený blok je osiřelý a jeho odměna propadá, i když byl poctivý.
  • Transakce z prohrané větve se vrací do fronty, pokud neexistuje konfliktní.
  • Finalita u proof of work je pravděpodobnostní; některé systémy s proof of stake ji vyhlašují.
Proč vzniká fork i bez útočníka?

Protože se blok šíří sítí několik sekund, takže dva mineři mohou najít blok skoro současně a část sítě uvidí nejdřív jeden, část druhý. Obě části pokračují na své větvi, dokud jedna nezíská další blok a nestane se tou s větší nasčítanou prací.

Proč se neporovnává jen délka řetězu?

Protože délka nevypovídá o vynaložené práci. Kdyby rozhodoval počet bloků, mohl by útočník v odděleném řetězu uměle snížit obtížnost a nasekat mnoho levných bloků. Porovnává se proto nasčítaná obtížnost, což měří skutečné množství práce za historií.

Co se stane s transakcemi v poražené větvi?

Vrátí se do mempoolu a obvykle se potvrdí v některém z dalších bloků, protože zůstávají platné. Pokud ale ve vítězné větvi existuje konfliktní transakce utrácející tytéž vstupy, původní transakce se nepotvrdí už nikdy. To je přesně mechanismus dvojího utracení.