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.