Transação Coinbase
A primeira transação de um bloco, que cria novos bitcoins
Uma transação coinbase é a primeira transação de um bloco.
Ela é colocada lá pelo minerador quando ele constrói o bloco candidato, para poder reivindicar a recompensa do bloco (subsídio do bloco + taxas) se conseguir minerar o bloco.
É um tipo especial de transação que tem uma única entrada em branco. Em outras palavras, as saídas das transações coinbase são a fonte de novos bitcoins.
Requisitos
O que tem de diferente em uma transação coinbase?
Uma transação coinbase tem a mesma estrutura básica de uma transação normal, mas com alguns requisitos especiais:
- Precisa ser a primeira transação do bloco.
- Precisa conter apenas uma entrada:
- O TXID precisa ser todo zeros.
- O VOUT precisa ser o valor máximo.
- BIP 34: o início do ScriptSig precisa conter a altura do bloco atual em que ela está incluída.
- BIP 141: se o bloco contém transações segwit, o campo witness precisa conter um valor reservado de testemunha de 32 bytes.
- Pode conter múltiplas saídas (como o normal):
- O valor total das saídas não pode ser maior que a soma da recompensa do bloco (subsídio do bloco + taxas das transações).
- BIP 141: se o bloco contém transações segwit, uma das saídas precisa conter o compromisso de wTXID.
Então, basicamente, uma transação coinbase só tem uma entrada em branco e, em seguida, trava a recompensa do bloco em uma nova saída.
Ao longo do tempo, alguns requisitos adicionais foram colocados na transação coinbase devido a atualizações, mas a estrutura básica da transação permaneceu a mesma.
- Os mineradores são livres para colocar dados personalizados no campo ScriptSig. Como não precisam destravar nada de fato, costumam usar esse campo para a sua própria "etiqueta" de minerador (para identificar quem minerou o bloco) ou, às vezes, para algum tipo de mensagem.
- A recompensa do bloco pode ser enviada para vários lugares. Por exemplo, a transação coinbase do bloco 829.513 dividiu a recompensa do bloco em 17 saídas.
Exemplos
Como é uma transação coinbase?
Aqui estão alguns exemplos de transações coinbase típicas que você encontra na blockchain.
1. Básica
Altura: 0 a 227.835
Esta é a transação coinbase do bloco 150.007:
01000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0804233fa04e028b12ffffffff0130490b2a010000004341047eda6bd04fb27cab6e7c28c99b94977f073e912f25d1ff7165d9c95cd9bbe6da7e7ad7f2acb09e0ced91705f7616af53bee51a238b7dc527f2be0aa60469d140ac00000000 {
"version": "01000000",
"inputcount": "01",
"inputs": [
{
"txid": "0000000000000000000000000000000000000000000000000000000000000000",
"vout": "ffffffff",
"scriptsigsize": "08",
"scriptsig": "04233fa04e028b12",
"sequence": "ffffffff"
}
],
"outputcount": "01",
"outputs": [
{
"amount": "30490b2a01000000",
"scriptpubkeysize": "43",
"scriptpubkey": "41047eda6bd04fb27cab6e7c28c99b94977f073e912f25d1ff7165d9c95cd9bbe6da7e7ad7f2acb09e0ced91705f7616af53bee51a238b7dc527f2be0aa60469d140ac"
}
],
"locktime": "00000000"
} Transação: 18a16d322b235f636ab90e62e79a9f20a0b9c14e8da51e9dc0974f99f82ee444
Como você pode ver, ela só tem uma entrada em branco. O TXID é todo zeros e o VOUT é o valor máximo 0xffffffff. Esse é o requisito básico de toda transação coinbase.
O minerador é livre para colocar qualquer dado que quiser no ScriptSig (porque não há nada a destravar). Estes bytes não decodificam para nenhum texto ASCII em particular, então o minerador provavelmente estava só usando esse campo como um ExtraNonce (e não para armazenar uma etiqueta ou mensagem).
Há apenas uma saída, e ela tem um valor de 5000350000 sats:
- O subsídio do bloco era de 5.000.000.000 sats (50 BTC).
- Os outros 350.000 sats eram as taxas coletadas das outras 10 transações incluídas no bloco.
Em seguida, travaram essa saída na sua própria chave pública usando um script de travamento P2PK (que é o script de travamento típico usado para transações coinbase no início da blockchain).
2. Altura na Coinbase
Altura: 227.836+ (BIP 34)
Esta é a transação coinbase do bloco 400.021:
01000000010000000000000000000000000000000000000000000000000000000000000000ffffffff1b03951a0604f15ccf5609013803062b9b5a0100072f425443432f200000000001ebc31495000000001976a9142c30a6aaac6d96687291475d7d52f4b469f665a688ac00000000 {
"version": "01000000",
"inputcount": "01",
"inputs": [
{
"txid": "0000000000000000000000000000000000000000000000000000000000000000",
"vout": "ffffffff",
"scriptsigsize": "1b",
"scriptsig": "03951a0604f15ccf5609013803062b9b5a0100072f425443432f20",
"sequence": "00000000"
}
],
"outputcount": "01",
"outputs": [
{
"amount": "ebc3149500000000",
"scriptpubkeysize": "19",
"scriptpubkey": "76a9142c30a6aaac6d96687291475d7d52f4b469f665a688ac"
}
],
"locktime": "00000000"
} Transação: 2844c6f512f5609705c90c1603e9258779a0fe5e200664b0c1a1abad33da637e
Mais uma vez, esta transação coinbase tem uma entrada em branco.
Além disso, devido à BIP 34, a partir da altura 227.836 os mineradores são obrigados a colocar a altura do bloco atual no início do ScriptSig. Este é o ScriptSig decodificado:
OP_PUSHBYTES_3
951a06
OP_PUSHBYTES_4
f15ccf56
OP_PUSHBYTES_9
013803062b9b5a0100
OP_PUSHBYTES_7
2f425443432f20 03951a0604f15ccf5609013803062b9b5a0100072f425443432f20
Script
Esse ScriptSig contém quatro pushes de dados separados:
951a06– É a altura do bloco atual em ordem de bytes little-endian. Convertendo para big-endian temos061a95e, convertendo de hexadecimal para decimal, obtemos 400021.Little Endian
f15ccf56– Desconhecido. Estes bytes não decodificam para nenhum texto ASCII específico, então pode ter sido um ExtraNonce.013803062b9b5a0100– Desconhecido. Estes bytes não decodificam para nenhum texto ASCII específico, então pode ter sido um ExtraNonce.2f425443432f20– São os bytes codificados em ASCII do texto "/BTCC/", que é a etiqueta do minerador.ASCII
Apenas o primeiro push de dados, com a altura do bloco atual, era obrigatório. Depois disso, o minerador era livre para incluir qualquer dado que quisesse no ScriptSig.
Há também apenas uma saída, com um valor de 2501166059 sats:
- O subsídio do bloco era de 2.500.000.000 sats (25 BTC).
- Os outros 1.166.059 sats eram as taxas coletadas das outras 45 transações incluídas no bloco.
Esta saída foi então travada usando um script de travamento P2PKH.
Então, a única mudança real entre esta transação coinbase e uma básica é a altura no início do ScriptSig.
A razão de incluir a altura na transação coinbase é evitar TXIDs duplicados.
3. SegWit
Altura: 481.824+ (BIP 141)
Esta é a transação coinbase do bloco 538.403:
010000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff2503233708184d696e656420627920416e74506f6f6c373946205b8160a4256c0000946e0100ffffffff02f595814a000000001976a914edf10a7fac6b32e24daa5305c723f3de58db1bc888ac0000000000000000266a24aa21a9edfaa194df59043645ba0f58aad74bfd5693fa497093174d12a4bb3b0574a878db0120000000000000000000000000000000000000000000000000000000000000000000000000 {
"version": "01000000",
"marker": "00",
"flag": "01",
"inputcount": "01",
"inputs": [
{
"txid": "0000000000000000000000000000000000000000000000000000000000000000",
"vout": "ffffffff",
"scriptsigsize": "25",
"scriptsig": "03233708184d696e656420627920416e74506f6f6c373946205b8160a4256c0000946e0100",
"sequence": "ffffffff"
}
],
"outputcount": "02",
"outputs": [
{
"amount": "f595814a00000000",
"scriptpubkeysize": "19",
"scriptpubkey": "76a914edf10a7fac6b32e24daa5305c723f3de58db1bc888ac"
},
{
"amount": "0000000000000000",
"scriptpubkeysize": "26",
"scriptpubkey": "6a24aa21a9edfaa194df59043645ba0f58aad74bfd5693fa497093174d12a4bb3b0574a878db"
}
],
"witness": [
{
"stackitems": "01",
"0": {
"size": "20",
"item": "0000000000000000000000000000000000000000000000000000000000000000"
}
}
],
"locktime": "00000000"
} Transação: 31e9370f45eb48f6f52ef683b0737332f09f1cead75608021185450422ec1a71
Novamente, esta transação coinbase contém uma entrada em branco.
Este é o ScriptSig decodificado dessa entrada:
OP_PUSHBYTES_3
233708
OP_PUSHBYTES_24
4d696e656420627920416e74506f6f6c373946205b8160a4
OP_PUSHBYTES_37
6c0000946e0100 03233708184d696e656420627920416e74506f6f6c373946205b8160a4256c0000946e0100 Esse ScriptSig contém três pushes de dados separados:
233708– Contém a altura do bloco 538403 em ordem de bytes little-endian.4d696e656420627920416e74506f6f6c373946205b8160a4– Contém a string ASCII "Mined by AntPool79F [`".6c0000946e0100– Provavelmente era um ExtraNonce.
Little Endian
ASCII
A testemunha (witness) desta entrada contém o valor reservado de testemunha obrigatório de 32 bytes. Ele era todo zeros, pois não foi usado para comprometer nenhum dado extra ao bloco:
0000000000000000000000000000000000000000000000000000000000000000 Esta transação coinbase contém, então, duas saídas:
A primeira saída foi usada para reivindicar a recompensa do bloco de 1250006517 sats.
- O subsídio do bloco era de 1.250.000.000 sats (12,5 BTC).
- Os outros 6.517 sats eram as taxas coletadas das outras 3 transações incluídas no bloco.
A segunda saída foi usada para o compromisso de wTXID obrigatório. Para calculá-lo, você começa reunindo todos os wTXIDs das transações incluídas no bloco:
0000000000000000000000000000000000000000000000000000000000000000
6440ffe0a58cbec4692d075bc74877cdf7554a25eee5a02fa6ff3bb55dbb0802
9e4fa066c9587e65845065a6b5ad02cbec6cfdad8b0158953dcee086ff420ffd
57661a181f4762861fc2bc5c6001c27b54e26992e845b4742a6f0f867609b2c2 A raiz da testemunha (a raiz de Merkle de todos os wTXIDs) deste bloco era, portanto:
8a8cc0634b8847eb38e7e884970deda26c2dfeefd923c4eba08ca11d110bb6e3
Raiz de Merkle
Ao calcular a raiz da testemunha, o wTXID da transação coinbase precisa ser definido como todo zeros para evitar uma referência circular.
Se você concatenar e fizer o HASH256 da raiz da testemunha com o valor reservado de testemunha, obtém o compromisso de wTXID:
faa194df59043645ba0f58aad74bfd5693fa497093174d12a4bb3b0574a878db
HASH256
Isso foi então colocado no ScriptPubKey da segunda saída:
OP_RETURN
OP_PUSHBYTES_36
aa21a9edfaa194df59043645ba0f58aad74bfd5693fa497093174d12a4bb3b0574a878db 6a24aa21a9edfaa194df59043645ba0f58aad74bfd5693fa497093174d12a4bb3b0574a878db Se olhar com atenção, verá que o compromisso de wTXID está no fim do push de dados. Ele é prefixado com o cabeçalho de compromisso aa21a9ed para que saibamos que esse ScriptPubKey contém o compromisso de wTXID.
Esse ScriptPubKey também começa com OP_RETURN, o que significa que essa saída é não gastável — mas tudo bem, pois ela não contém nenhum satoshi e serve apenas para o compromisso de wTXID.
Então, basicamente, todas as transações coinbase desde a atualização segwit precisam incluir um valor reservado de testemunha no campo witness da entrada e, então, usá-lo junto com uma raiz da testemunha para colocar um compromisso de wTXID no ScriptPubKey de uma das saídas da transação.
Tudo isso é só parte de comprometer ao bloco os dados extras das transações segwit.
Se o bloco não contém nenhuma transação segwit, a coinbase não precisa incluir o valor reservado de testemunha no witness nem colocar um compromisso de wTXID em uma das saídas. O bloco 526.637 é um exemplo.
Maturidade da Coinbase
Quando você pode gastar uma transação coinbase?
As saídas de uma transação coinbase só podem ser gastas depois de a transação estar 100 blocos de profundidade na blockchain.
Por quê? Porque, se um minerador gastasse a saída da coinbase imediatamente e houvesse uma reorganização da cadeia que removesse da blockchain o bloco que incluía aquela transação coinbase, então essa transação e todos os seus descendentes se tornariam inválidos.
Isso é ruim, porque todas essas transações-filhas dependem daquela única transação coinbase.
Se aquela transação coinbase for removida da blockchain, não há como essa mesma transação coinbase reentrar na blockchain depois (porque ela contém a altura, e mudar a altura mudaria o seu TXID). Portanto, todas essas transações-filhas se tornam permanentemente inválidas, o que seria irritante.
Então, esperando 100 blocos, você pode ter confiança de que a transação coinbase está cravada, e é quase impossível que uma transação coinbase seja removida da blockchain depois de estar 100 blocos de profundidade (reorganizações da cadeia normalmente têm só 1 ou 2 blocos de profundidade).
A configuração de maturidade da coinbase pode ser encontrada em consensus.h.
A transação coinbase poderia ser removida após 100 blocos por causa de um ataque de 51%. No entanto, a regra dos 100 blocos de maturidade da coinbase serve apenas para proteger dos problemas causados por reorganizações típicas da cadeia.
Exemplo
A transação coinbase do bloco 400.000 foi gasta na primeira oportunidade, no bloco 400.101:
- a8d0c0184dde994a09ec054286f1ce581bebf46446a512166eae7628734ea0a5 – Transação coinbase no bloco 400.000.
- db3aa6d43629953a5af092a480259eab383b2f86c13fb559eb49ff92c3a43a6d – Saída da coinbase gasta no bloco 400.101.
Notas
- Moedas podem ser perdidas para sempre se um minerador não reivindicar a recompensa completa do bloco. Por exemplo, o subsídio do bloco 526.591 era de 12,5 BTC, mas o minerador só enviou 6,25 BTC para si na saída da transação coinbase, então efetivamente perdeu 6,25 BTC. Não há razão para um minerador querer fazer isso, mas mostra que moedas podem ser perdidas para sempre se um minerador não construir a sua transação coinbase corretamente para coletar todo o subsídio do bloco e as taxas das transações incluídas no bloco.