Glossário / Protocolo e atualizações
Compromisso de testemunha
- O que é o compromisso de testemunha?
- O compromisso de testemunha é um hash de 32 bytes em uma saída da transação coinbase que liga cada wtxid de um bloco à árvore de Merkle já existente no cabeçalho.
Especificação no BIP-141.
O Segregated Witness precisava registrar uma segunda raiz de Merkle sem tocar no cabeçalho do bloco, e o BIP-141 o coloca em uma saída coinbase para que a mudança pudesse ser lançada como um soft fork. O script deve ter pelo menos 38 bytes e começar com 0x6a24aa21a9ed. O compromisso vincula as assinaturas que autorizam seus bitcoins ao bloco que os minerou, já que um txid deixa os dados de testemunha de fora por definição.
Como funciona
O BIP-141 especifica o compromisso de testemunha até o nível do opcode, e um nó recalcula o valor antes de aceitar o bloco.
Os nós constroem uma segunda árvore de Merkle sobre o bloco, usando wtxids como folhas no lugar dos txids e combinando-os da mesma forma que a própria árvore do cabeçalho é construída. A folha da própria transação coinbase não é seu wtxid real: o BIP-141 supõe que esse valor seja 32 bytes zero, porque o número sendo calculado está dentro dessa mesma transação e nada pode calcular o hash de si próprio. O que é escrito na saída é um SHA-256 duplo do hash da raiz de testemunha unido a um valor reservado de testemunha de 32 bytes, e esse valor reservado tem que aparecer como o único item no próprio campo de testemunha da entrada coinbase.
Byte a byte, o script da saída lê-se assim: um byte de OP_RETURN (0x6a), um byte que empilha os 36 seguintes (0x24), um cabeçalho de compromisso de quatro bytes (0xaa21a9ed) e, depois, o hash de 32 bytes. Isso soma 38 bytes, e tudo a partir do 39º byte são dados opcionais sem significado de consenso.
Duas regras de limite impedem que o padrão seja manipulado ou aplicado em excesso. Quando várias saídas coincidem, conta a de maior índice de saída, de modo que um chamariz colocado antes não pode deslocar o valor real. E quando nenhuma transação de um bloco carrega dados de testemunha, o compromisso é opcional. A regra foi lançada por meio dos bits de versão do BIP9 com o nome segwit no bit 1, com uma janela de sinalização na mainnet da meia-noite de 15 de novembro de 2016 UTC até a meia-noite de 15 de novembro de 2017 UTC.
Onde você o vê
Um compromisso de testemunha aparece em um explorador de blocos como uma saída da transação coinbase cujo script começa com OP_RETURN.
Abra a primeira transação de qualquer bloco recente e as saídas se dividem em dois tipos: as que pagam ao pool e a seus clientes, e uma cujo script em hexadecimal começa com 6a24aa21a9ed. Os 32 bytes após esse prefixo são o próprio compromisso, e tudo além dos primeiros 38 bytes é espaço livre.
O software de mineração encontra esse campo com mais frequência do que qualquer outra pessoa. O valor é um hash sobre cada wtxid do bloco, então ele precisa ser recalculado sempre que o conjunto de transações candidatas muda, e reescrito na coinbase antes mesmo de o cabeçalho ser submetido ao hash.
O valor reservado é a parte que vale a pena observar. O BIP-141 não lhe dá nenhum significado de consenso hoje e o guarda de propósito, para que um futuro soft fork possa aninhar um novo compromisso dentro do existente calculando primeiro o hash do novo valor junto com o valor reservado. O documento proíbe que usos alheios ao consenso, como a mineração combinada, ocupem esse espaço, e nomeia para o que ele está sendo guardado: árvores de soma sobre as taxas, contadores de tamanho de bloco e de sigops, e ligações de retorno às saídas que uma transação gasta. Juntos, eles dariam a um cliente leve uma prova curta de que um bloco é inválido, em vez do próprio bloco.
Compromisso de testemunha vs raiz de Merkle
O compromisso de testemunha e a raiz de Merkle são as raízes de duas árvores separadas, e apenas uma delas ocupa um lugar no cabeçalho do bloco.
A raiz de Merkle é um campo do cabeçalho cujas folhas são txids, e um txid exclui os dados de testemunha por definição. O compromisso de testemunha vive em uma saída de transação, suas folhas são wtxids, que incluem esses dados, e sua folha coinbase é zerada. O aninhamento é todo o truque. A transação coinbase está na árvore mais antiga como uma folha qualquer, então editar o compromisso muda a coinbase, muda a raiz de Merkle do cabeçalho e quebra o bloco até para o software que nunca ouviu falar de Segregated Witness.