Coinbase je konsenzuální typ transakce, nikoli firma Coinbase ani běžná platba. Uzel spolu s blokem ověřuje nulový outpoint, výšku podle BIP34, strop odměny, pozici nula, zralost a případný SegWit commitment. Samostatně se do mempoolu nepřijímá.
Blok musí obsahovat alespoň jednu transakci a coinbase smí být pouze první. Bitcoin Core ji pozná podle přesné struktury: jediný vstup s 32 nulovými bajty v hashi předchozího výstupu a indexem 0xffffffff. Vstup neodemyká existující UTXO, proto nemá běžný podpis ani hodnotu prevoutu. Transakce přesto může mít více výstupů, běžnou verzi i locktime a vlastní txid. [Bitcoin Developer Reference — Coinbase input] [Bitcoin Developer Reference — Block chain] [Bitcoin Core — transaction.h (IsCoinBase)]
Součet výstupů coinbase nesmí překročit GetBlockSubsidy pro danou výšku plus poplatky všech ostatních platných transakcí v bloku. Nové satoshi vytváří pouze nově emitovaná složka odměny; poplatky převádějí už existující satoshi. Těžař může nárokovat méně a rozdíl navždy zanikne, ale jediný satoshi nad limitem zneplatní celý blok. Konsenzus neurčuje rozdělení mezi pool, těžaře či více skriptů. [Bitcoin Core — validation.cpp] [Bitcoin Core — miner.cpp]
Od BIP34 musí scriptSig coinbase začínat aktuální výškou bloku jako minimálně zakódované číslo CScript. Celý scriptSig má 2 až 100 bajtů. Zbytek může nést extra nonce, značku poolu či závazek merged miningu, ale není mimo pravidla: chybná výška nebo délka blok zneplatní a vložené podpisové opkódy mohou spotřebovat sigop limit. [Bitcoin Developer Reference — Coinbase input] [BIP 34 — Block height in coinbase]
ASIC mění nonce v hlavičce, jenže 32bitový prostor rychle vyčerpá. Těžební software proto mění extra nonce v coinbase; tím změní její txid, Merkle root transakcí a následně hlavičku bloku, takže získá nový prostor hashů. Poolové protokoly rozdělují tento prostor mezi workery, aby nekolidovaly jejich share. Extra nonce je koordinační údaj, nikoli další emise. [Bitcoin Core — miner.cpp] [BIP 22 — getblocktemplate] [Stratum V2 — Mining Protocol specification]
Výstupy coinbase používají běžné zamykací skripty a lze je rozdělit mezi několik adres či politik. Pool může platit na sběrnou adresu, rozdělit výnos hned nebo vyhradit výstup provozovateli. Uzel však ověřuje částky a skripty, ne smlouvy ani skutečné vlastníky. Prahy výplat, PPS, FPPS, PPLNS a pozdější výběry jsou mimoprotokolová pravidla poolu. [Bitcoin Core — miner.cpp] [BIP 22 — getblocktemplate]
Obsahuje-li blok witness transakce, BIP141 vyžaduje v jednom výstupu coinbase witness commitment: OP_RETURN začínající 6a24aa21a9ed a 32bajtový závazek. Witness vstupu coinbase obsahuje jedinou 32bajtovou rezervovanou hodnotu. Je-li odpovídajících výstupů více, konsenzus bere nejvyšší index. Tento výstup zavazuje witness Merkle root; není odměnou těžaři. [BIP 141 — Segregated Witness commitment]
Výstup coinbase je v UTXO sadě označen zvláštním příznakem a smí být utracen, až když rozdíl výšky utrácejícího a vytvářejícího bloku dosáhne COINBASE_MATURITY, dnes 100. Odměnu z výšky H lze tedy poprvé utratit v bloku H+100. Peněženka může ukazovat zdánlivý rozdíl o jednu konfirmaci, protože vytvářející blok počítá jako první. Zralost není konečná finalita. [Bitcoin Core — consensus.h (COINBASE_MATURITY)]
Vypadne-li vytěžený blok při reorganizaci z aktivního řetězce s nejvíce prací, jeho coinbase výstupy zmizí z aktivní UTXO sady. Neplatné mohou být i navazující transakce, které už zralou odměnu utratily. Prodleva 100 bloků omezuje škody krátkých reorganizací, ale nezaručuje nezměnitelnost. Pool musí zvlášť sledovat aktivní řetězec, zralost a své závazky k těžařům. [Bitcoin Core — validation.cpp] [Bitcoin Core — consensus.h (COINBASE_MATURITY)]
Full node při validaci vyžaduje coinbase na pozici nula, odmítne další coinbase, zkontroluje délku scriptSig a výšku BIP34, spočítá poplatky ostatních transakcí a odmítne odměnu nad novou emisi plus poplatky. Ověřuje také rozsahy hodnot, weight, witness commitment a pozdější zralost utrácení. Samostatná coinbase bez kontextu výšky a bloku do mempoolu nepatří. [Bitcoin Core — transaction.h (IsCoinBase)] [Bitcoin Core — validation.cpp] [BIP 141 — Segregated Witness commitment]
V raných blocích mohly vzniknout stejné txid coinbase, protože výška ještě nebyla povinná. BIP30 brání přepsání neutracených výstupů starší transakce a BIP34 činí moderní coinbase běžně jedinečnou výškou. Genesis je historická výjimka: jeho coinbase je v serializovaném bloku, ale inicializační kód její výstup nikdy nevložil do utratitelné UTXO databáze. Proto slavných 50 BTC nelze utratit. [BIP 30 — Duplicate transactions] [BIP 34 — Block height in coinbase] [Bitcoin Core — chainparams.cpp (genesis construction)]
Pro nejúplnější obraz čtěte toto heslo společně s Blok, Odměna za blok, Transakční poplatky, Těžba, Block Template, Bitcoin. Opačným směrem na něj odkazují také Odměna za blok, Potvrzení, Nonce.