Pular para o conteúdo
buybitcoinsmart

Glossário / Referência do desenvolvedor

MSG_WITNESS_BLOCK

O que é MSG_WITNESS_BLOCK?
O tipo de inventário de bloco com testemunha é como um nó compatível com segwit pede um bloco na serialização estendida, com todas as assinaturas anexadas em vez de removidas.

Especificação no BIP-144.

Dois nós podem ter o mesmo bloco e discordar sobre quantos bytes ele ocupa. MSG_WITNESS_BLOCK é o código 0x40000002, uma solicitação de bloco comum com o bit de testemunha adicionado, e existe desde que a segregated witness foi ativada no bloco 481.824, em 24 de agosto de 2017. Se você executa seu próprio nó, esta é a solicitação que busca as assinaturas que sua máquina precisa antes de confiar na cadeia.

Como funciona

O Bitcoin Core mantém duas formas de escrever o mesmo bloco e escolhe entre elas conforme quem está pedindo.

O indicador de testemunha é um único bit alto, 0x40000000. Some-o ao tipo de inventário de bloco, que é 2, e você obtém 0x40000002. O BIP144 introduziu tanto esse indicador quanto o bit de serviço NODE_WITNESS, de valor 8, que um nó anuncia em sua mensagem version para dizer que pode fornecer os dados mais completos. O indicador só aparece em uma solicitação getdata. Os anúncios trafegam como inventários de bloco comuns, porque um anúncio é apenas um hash e o hash é o mesmo nos dois casos.

Esse último ponto é a razão pela qual duas serializações podem coexistir. Um cabeçalho de bloco fixa uma raiz de Merkle construída a partir de txids, e um txid é calculado sobre a transação com sua testemunha removida. Remova todas as assinaturas e o bloco ainda gera o mesmo identificador de 32 bytes. Os dados de testemunha são fixados separadamente, em uma saída da transação coinbase cujo script tem pelo menos 38 bytes e começa com a etiqueta de quatro bytes 0xaa21a9ed seguida de uma raiz de Merkle de testemunha de 32 bytes.

O tamanho é onde a diferença pesa. O limite de um bloco é de 4.000.000 unidades de peso, contadas como três vezes o tamanho sem dados de testemunha mais o tamanho completo, o que permite que um bloco carregado de dados de testemunha chegue perto de 4 MB na rede. O bloco 774.628, minerado em 1º de fevereiro de 2023, chegou a aproximadamente 3,96 MB, quase tudo isso uma única inscrição alojada no espaço de testemunha. Aplique essa fórmula de peso ao contrário e um bloco desse tamanho quase não tem nada restante em sua forma sem dados de testemunha. Um par antigo que pedisse a serialização legada teria recebido o esqueleto e nada da carga útil, e é precisamente por isso que tais pares são tratados como incapazes de validar os blocos atuais.

Onde isso aparece

Dois lugares tornam o MSG_WITNESS_BLOCK visível sem ler nenhum código-fonte: os próprios registros de um nó e suas estatísticas de pares.

Inicie o bitcoind com a categoria de depuração net e linhas getdata passam durante toda a sincronização inicial de blocos, todas elas com o indicador de testemunha, porque um nó moderno só busca blocos de pares compatíveis com testemunha. A chamada RPC getpeerinfo detalha os bytes enviados e recebidos por tipo de mensagem, então é fácil ver o tráfego de blocos dominar uma sincronização. O Bitcoin Core 23.0 adicionou o getblockfrompeer, que pede a um par determinado um bloco específico por hash, e ele busca a forma com testemunha.

Nós podados complicam o quadro. Um nó em execução com a poda ativada, cuja configuração mínima permitida é de 550 MiB, anuncia NODE_NETWORK_LIMITED e serve apenas os 288 blocos mais recentes, aproximadamente dois dias de histórico. Peça a ele algo mais antigo e nada volta.

Para quem compra e guarda bitcoin, o significado é direto. Verificar a cadeia por conta própria significa baixar cada assinatura e conferi-la. Uma carteira de celular que consulta um servidor nunca envia esta solicitação, nunca vê uma testemunha e está aceitando a palavra de outra pessoa sobre o saldo na sua tela.

MSG_WITNESS_BLOCK vs MSG_BLOCK

MSG_BLOCK pede o mesmo bloco com as assinaturas removidas, e hoje é uma solicitação legada. Os dois tipos nomeiam um bloco pelo mesmo hash, e ambos são respondidos com uma mensagem block. A diferença está em se os bytes de marcador e indicador e as pilhas de testemunha estão presentes dentro de cada transação. Um nó que pede MSG_BLOCK de um bloco recente não consegue verificar um único gasto segwit nele, então o Bitcoin Core reserva essa forma para pares que nunca sinalizaram NODE_WITNESS.

Não confundir com

Perguntas frequentes

Por que um bloco tem dois tamanhos diferentes?

Porque a segregated witness dividiu a serialização em duas. A forma sem dados de testemunha descarta todas as pilhas de testemunha, a forma estendida as mantém, e as duas geram o mesmo identificador de bloco porque o cabeçalho fixa uma raiz de Merkle construída a partir de txids, e não de hashes de testemunha.

Leia a seguir

Termos relacionados

Mais em Referência do desenvolvedor

Ler esta página em inglês