Em sentido preciso, Orphan Block é um bloco cujo antecessor imediato é desconhecido de um determinado nó. Por vezes, o termo também designa um Stale Block, fora da cadeia ativa. Nenhuma destas designações significa, por si só, fraude ou um bloco defeituoso; primeiro é preciso saber que dados o nó tem e que sentido está a ser usado.
O bloco anterior também é chamado bloco-pai. Num verdadeiro Orphan Block, o nó de Jana não o conhece e não pode terminar a verificação da ligação. Um Stale Block pode ter um pai conhecido e ser inteiramente válido; o nó apenas segue outro ramo como história ativa. Bitcoin Developer Guide distingue expressamente estes sentidos. Quando Jana encontra orphan num explorador, pergunta primeiro se falta o antecessor ou se o bloco apenas não permaneceu na cadeia principal. [1]
A diferença aparece também no Bitcoin Core, software para executar um nó que verifica blocos e transações segundo as regras do Bitcoin. Em Bitcoin Core 29, AcceptBlockHeader procura o antecessor através de hashPrevBlock, a referência à sua impressão identificadora. Se não existir registo no índice, devolve prev-blk-not-found. Se o pai for conhecido e estiver marcado como inválido, devolve bad-prevblk. O primeiro caso diz «falta-me contexto»; o segundo, «estás a construir sobre um bloco inválido». Fornecer o antecessor em falta permite novas verificações, mas não garante, por si só, a aceitação do bloco completo. [2]
Um bloco tem um cabeçalho, um breve conjunto de dados de identificação e ligação, e um corpo com as transações. Bitcoin Core 0.10.0 introduziu a sincronização headers-first: primeiro obtêm-se e verificam-se os cabeçalhos, depois podem descarregar-se blocos em paralelo. Assim, o nó de Jana pode conhecer o cabeçalho do antecessor sem ainda ter o bloco completo no disco. Um corpo de bloco em falta não equivale a um antecessor desconhecido; confundir os dois faria uma transferência normal parecer um mistério. [3]
O comando getchaintips em Bitcoin Core 29 mostra a Jana quais os extremos de ramos conhecidos pelo nó. active indica a cadeia ativa; valid-fork, um ramo inativo totalmente validado. valid-headers significa que os blocos estão disponíveis, mas não foram integralmente validados; headers-only indica que faltam alguns blocos. invalid identifica um ramo com um bloco inválido. Não é, portanto, uma lista de problemas equivalentes. Nem a expressão orphaned branches na ajuda elimina estas diferenças. [4]
Imaginemos dois blocos diferentes, A e B, à altura 900000. É um exemplo nosso, não o relato de um acontecimento concreto. A altura é uma posição na cadeia, que blocos concorrentes podem partilhar. Jana distingue-os através de hash, a impressão identificadora do bloco, e previousblockhash, a referência ao antecessor. Entre ramos válidos, decide o trabalho acumulado, não apenas a altura. A interface RPC, usada para dar instruções ao programa, apresenta-o como chainwork: o trabalho esperado acumulado correspondente às dificuldades dos blocos. [1] [5]
Quando Jana consulta com getblock um bloco fora da cadeia principal, Bitcoin Core 29 pode indicar confirmations = -1. É uma marca especial de estado, não uma contagem normal de confirmações. Não é uma contagem decrescente nem uma profundidade negativa de reorganização. Também não prova que o antecessor esteja em falta. Jana deve ler o valor juntamente com a identidade do bloco e o estado do ramo; além disso, o seu nó pode não possuir todos os blocos alguma vez vistos por outros participantes. [5]
A recompensa do bloco é criada por uma transação inicial especial chamada coinbase, sem relação com a plataforma de negociação do mesmo nome. Uma saída de transação regista uma quantia em bitcoin e as condições que têm de ser cumpridas para a gastar. Em Bitcoin Core 29, COINBASE_MATURITY vale 100: uma saída criada à altura H pode ser gasta pela primeira vez num bloco válido à altura H+100. Conta a diferença de alturas, não os minutos decorridos. Esta espera não substitui a inclusão na cadeia ativa. Enquanto o bloco de recompensa permanecer num ramo inativo, a sua saída não pertence ao conjunto UTXO ativo, o registo das saídas ainda não gastas. Mais blocos noutro ramo não recuperam esse dinheiro automaticamente. [6] [7] [1] [8]
Jana guarda o hash do bloco, o antecessor, o estado do ramo e a versão do programa. Junta as respostas de getchaintips e getblock e a hora em que as obteve. Essa hora é registada separadamente do campo time do cabeçalho: a marca temporal do bloco não é o momento em que o seu computador o observou. O registo ajuda a comparar novas observações, mas não prova sozinho um ataque, uma falha específica de rede ou uma taxa mundial de blocos orphan. Antes de mais, descreve um nó num determinado momento. [4] [5]
Para ter uma visão mais completa, leia este verbete junto com Stale Block, Reorg, Block Propagation, Proof of Work, Bitcoin. Também há referências a este verbete em Stale Block.