Orphan Block je v přesném smyslu blok, jehož bezprostředního předchůdce daný uzel nezná. Volněji se tak někdy označuje Stale Block, blok mimo aktivní řetězec. Ani jedno označení samo o sobě neznamená podvod nebo vadný blok; nejprve potřebujeme vědět, jaká data uzel má a o kterém významu mluvíme.
Předchozímu bloku se někdy říká rodič. U skutečného Orphan Block jej Janin uzel nezná, a proto nemůže dokončit kontrolu návaznosti. U Stale Block může být rodič známý a celý blok platný; uzel jen sleduje jinou větev jako aktivní historii. Bitcoin Developer Guide tyto významy výslovně rozlišuje. Když Jana v prohlížeči bloků narazí na slovo orphan, ptá se nejprve, zda chybí předchůdce, nebo zda se blok pouze neudržel v hlavním řetězci. [1]
Rozdíl je vidět i v Bitcoin Core, softwaru pro provoz uzlu, který ověřuje bloky a transakce podle pravidel Bitcoinu. V Bitcoin Core 29 funkce AcceptBlockHeader hledá předchůdce podle pole hashPrevBlock, odkazu na jeho identifikační otisk. Nenajde-li ho v indexu, vrátí prev-blk-not-found. Když ho zná a má označený jako neplatný, výsledkem je bad-prevblk. První případ říká „chybí mi podklad“, druhý „navazuješ na neplatný blok“. Dodání chybějícího předchůdce otevře cestu k dalším kontrolám, ale samo ještě nezaručuje přijetí celého bloku. [2]
Blok má hlavičku, krátké záhlaví s údaji pro jeho identifikaci a návaznost, a tělo obsahující transakce. Bitcoin Core 0.10.0 zavedl synchronizaci headers-first: nejdříve se získávají a ověřují hlavičky, potom se bloky mohou stahovat souběžně. Janin uzel tak může znát hlavičku předchůdce, i když ještě nemá celý blok na disku. Chybějící tělo bloku není totéž jako neznámý předchůdce; bez tohoto rozlišení by běžné stahování mohlo vypadat jako záhada. [3]
Příkaz getchaintips v Bitcoin Core 29 pomůže Janě zjistit, jaké konce větví uzel zná. Stav active označuje aktivní řetězec, valid-fork plně ověřenou neaktivní větev. valid-headers znamená, že bloky jsou dostupné, ale zůstávají bez úplného ověření; headers-only říká, že některé bloky chybějí. invalid označuje větev s neplatným blokem. Nejde tedy o jeden seznam stejně problematických výsledků. Ani výraz orphaned branches v nápovědě tyto rozdíly nemaže. [4]
Představme si dva různé bloky A a B ve výšce 900000. Jde o příklad pro vysvětlení, nikoli o popis konkrétní události. Výška je pozice v řetězci, takže ji mohou mít soupeřící bloky stejnou. Jana je rozliší pomocí hash, identifikačního otisku bloku, a previousblockhash, odkazu na předchůdce. Při volbě mezi platnými větvemi rozhoduje kumulovaná práce, nikoli pouhé porovnání výšky. Rozhraní RPC, kterým se programu zadávají příkazy, ji uvádí jako chainwork: souhrnnou očekávanou práci odpovídající obtížnostem bloků. [1] [5]
Když se Jana zeptá příkazem getblock na blok mimo hlavní řetězec, Bitcoin Core 29 může uvést confirmations = -1. Je to zvláštní značka stavu, nikoli běžný počet potvrzení. Není to odpočet a není záporná hloubka změny řetězce. Ani se tím nedokazuje, že předchůdce chybí. Jana musí údaj číst spolu s identitou bloku a stavem větve; její uzel navíc nemusí mít všechny bloky, které kdy viděli ostatní účastníci. [5]
Odměnu za blok vytváří zvláštní úvodní transakce coinbase; s burzou stejného jména nesouvisí. Výstup transakce je záznam určité částky bitcoinů a podmínek, které je nutné splnit pro její utracení. V Bitcoin Core 29 má COINBASE_MATURITY hodnotu 100: výstup vytvořený ve výšce H lze poprvé utratit v platném bloku ve výšce H+100. Počítá se rozdíl výšek, ne minuty. Tato čekací podmínka ale nenahrazuje zařazení do aktivního řetězce. Dokud odměnový blok zůstává na neaktivní větvi, jeho výstup není v aktivní sadě UTXO, evidenci dosud neutracených výstupů. Přibývání bloků jinde mu peníze samo nevrátí. [6] [7] [1] [8]
Jana si uloží hash bloku, jeho předchůdce, stav větve a verzi programu. K tomu připojí výstupy getchaintips a getblock a čas, kdy je pořídila. Ten vede zvlášť od pole time v hlavičce: čas uvedený v bloku není čas, kdy jej její počítač pozoroval. Takový záznam pomůže porovnat další pozorování, ale sám neprokazuje útok, konkrétní závadu sítě ani celosvětový podíl orphan bloků. Nejprve popisuje stav jednoho uzlu v určité chvíli. [4] [5]
Pro nejúplnější obraz čtěte toto heslo společně s Stale Block, Reorg, Block Propagation, Proof of Work, Bitcoin. Opačným směrem na něj odkazují také Stale Block.