46 / 736STALE

Stale Block

Um bloco válido fora da cadeia principal

Um Stale Block é um bloco Bitcoin válido que ficou num ramo secundário. Pode acontecer sem fraude: dois mineradores encontram blocos quase ao mesmo tempo e a rede acaba por continuar apenas num desses ramos.

Um Stale Block respeita as regras do Bitcoin, mas não pertence à cadeia ativa — o histórico que um nó, um computador que verifica blocos e transações, usa para contar confirmações e determinar os fundos disponíveis para gastar. A escolha depende do trabalho de mineração acumulado pelos ramos válidos. Para quem recebe um pagamento, isso pode significar perder uma confirmação e voltar a esperar, não perder automaticamente os seus bitcoins.

Imaginemos dois mineradores, Anna e Pavel. Ambos trabalham no sucessor do mesmo último bloco. Anna encontra um novo bloco, mas antes de a notícia chegar a Pavel, ele também encontra o seu. Ambos podem ser válidos, embora incluam conjuntos de transações ligeiramente diferentes. Os nós que verificam blocos e transações recebem a informação sobre os blocos por ordens diferentes. Durante algum tempo, seguem extremos diferentes da cadeia. Assim que um ramo válido acumula mais trabalho e os nós o verificam, passam a segui-lo. Ao bloco que ficou no ramo abandonado chamamos Stale Block. [1]

O Bitcoin precisa de um único histórico para impedir que os mesmos fundos sejam gastos duas vezes com sucesso. Por isso, não basta verificar que cada bloco cumpre as regras isoladamente. O nó também tem de escolher qual dos ramos válidos vai seguir. São questões diferentes: a validade do bloco e a seleção da cadeia. Um Stale Block pode ter uma prova de trabalho correta (Proof of Work), transações e assinaturas válidas e, mesmo assim, não pertencer ao histórico escolhido. Isso não o torna defeituoso ou fraudulento. [1] [2]

Suponhamos que o bloco de Pavel incluía o seu pagamento e que a carteira mostrava uma confirmação. Se o ramo de Anna vencer, o resultado depende do que contém. A mesma transação pode estar também nesse ramo e continuar confirmada. Caso contrário, pode regressar ao Mempool, a lista local de transações não confirmadas de um nó, e esperar por outro bloco. O regresso não é garantido: a transação tem de continuar a ser admissível e não pode contradizer o novo histórico. Se este já contiver outra transação que gaste os mesmos fundos, o pagamento original não pode ser confirmado nele ao mesmo tempo. [2]

Um pagamento normal é diferente da Coinbase Transaction, a primeira transação do bloco, que atribui a recompensa ao minerador. Esta inclui bitcoins recém-emitidos e taxas das transações. Se o bloco de Pavel ficar fora da cadeia ativa, a sua recompensa coinbase não pode ser gasta nesse histórico. Não passa para o Mempool como um pagamento normal. Entretanto, Pavel não recupera a eletricidade consumida. Por isso, os mineradores preocupam-se tanto em encontrar um bloco como em dar a notícia aos outros rapidamente. [1] [2]

Alguns artigos e exploradores de blocos usam Orphan Block como outro nome para Stale Block. Os termos são frequentemente tratados como sinónimos, mas o seu significado mais preciso difere. Um Orphan Block é um bloco cujo antecessor o nó ainda não conhece, pelo que ainda não o consegue ligar à cadeia. Num Stale Block, o antecessor pode ser conhecido e o bloco válido; apenas está fora do ramo escolhido. A palavra orphan também se aplica a transações quando faltam ao nó transações anteriores necessárias para verificar as suas entradas. Importa, por isso, perceber em que sentido cada fonte a utiliza. [1]

Se um nó já utilizava o bloco de Pavel e depois o substitui pelo ramo de Anna, realiza um Reorg: altera parte do histórico que considera ativo. É por isso que o número de confirmações na carteira pode mudar. Uma corrida breve como a do exemplo pode surgir com mineração honesta. Contudo, um atacante pode tentar aproveitar a alteração do histórico para um Double Spend: fazer aceitar outro pagamento com os mesmos fundos. Um Stale Block não demonstra, por si só, essa intenção. É preciso analisar a sequência dos acontecimentos e eventuais transações em conflito. [1] [2]

A notícia de um novo bloco não chega instantaneamente a todo o mundo. Quanto mais demorar, mais tempo outros mineradores poderão continuar, sem saber, a trabalhar sobre o mesmo antecessor. Contam a velocidade de transmissão, as ligações entre nós e o tempo de propagação em relação ao intervalo entre blocos. Stale Rate é a proporção dos blocos válidos encontrados que não ficam na cadeia ativa. Não é uma percentagem fixa estabelecida pelas regras do Bitcoin. Ao comparar números, também importam o período observado e os blocos que o observador efetivamente detetou. [1] [3]

A especificação BIP152 descreve Compact Block Relay. Um nó conhece frequentemente, através do seu Mempool, a maioria das transações de um novo bloco. Não é necessário voltar a enviar todo o conteúdo: identificadores curtos permitem reconstruir o bloco com os dados disponíveis e pedir as transações em falta. Isso poupa largura de banda e, em condições adequadas, permite conhecer novos blocos mais depressa. Melhora a transmissão sem alterar as regras de validade. Não pode impedir totalmente que dois blocos sejam encontrados quase ao mesmo tempo. [3]

O trabalho acumulado de um ramo chama-se tecnicamente chainwork. Não mede a eletricidade realmente consumida nem conta votos pelo número de computadores. Cada bloco contribui com um valor derivado da dificuldade do seu Proof of Work, a prova do trabalho de mineração. Por isso, «vence a cadeia mais longa» é menos preciso do que «vence o ramo válido com mais chainwork». O nó tem de verificar as regras: nem uma grande quantidade de trabalho torna válidas transações inválidas. Além disso, stale descreve a relação de um bloco com o histórico que um nó específico escolheu naquele momento. [1] [2]

Um explorador de blocos oferece uma visão útil, mas mostra a perspetiva do seu serviço. O seu próprio Full Node, um nó que verifica as regras, permite consultar o histórico que aceitou de forma independente. Se o nó conservar os dados do bloco, getblock do Bitcoin Core devolve confirmations: -1 para um bloco fora da cadeia ativa. Se os dados estiverem em falta, por exemplo por terem sido eliminados para poupar espaço durante o pruning, o comando devolve um erro. Esse valor, por si só, não demonstra que o bloco passou todas as verificações de validade. Para o situar com precisão, examine também o hash — o seu identificador —, o antecessor, a altura (o número de blocos anteriores) e o chainwork; verifique separadamente o destino de cada pagamento. Dois blocos podem ter a mesma altura e hashes diferentes. [4] [5]

Para ter uma visão mais completa, leia este verbete junto com Reorg, Confirmação, Block, Block Header, Proof of Work, Mineração. Também há referências a este verbete em Reorg, Mining Pool, Hashrate, Selfish Mining.

DOC · 001Bitcoin Developer Guide — Block ChainDocumentação DOC · 002Bitcoin Core v29.0 — chain activation and mempool reconciliationFonte primária DOC · 003BIP 152 — Compact Block RelayEspecificação DOC · 004Bitcoin Core v29.0 — getblockDocumentação DOC · 005Bitcoin Core v29.0 — block RPC implementationFonte primária
Revisto em: Fontes em primeiro lugar · Não é recomendação de investimento