Pular para o conteúdo
buybitcoinsmart

Glossário / Protocolo e atualizações

Dados de testemunha

Outros nomes: Testemunha.

O que são os dados de testemunha?
Os dados de testemunha são o material de assinatura que uma transação SegWit carrega em uma seção separada, descontado a uma unidade de peso por byte e excluído por completo do txid.

Especificação no BIP-144.

Cada entrada recebe a sua própria testemunha: uma pilha de itens, na maioria das vezes uma assinatura e uma chave pública. A seção fica depois das saídas, atrás de um marcador e um indicador de dois bytes que avisam ao software que a transação está no formato mais novo. Um nó que executa software anterior à atualização de 2017 nunca a pede e nunca a vê.

Como funciona

Os dados de testemunha têm seu próprio lugar na estrutura de bytes de uma transação, definido pelo BIP-144.

Uma transação serializada no formato mais novo se lê assim: a versão, o byte marcador 0x00, o byte indicador 0x01, as entradas, as saídas, depois uma pilha de testemunha por entrada, na mesma ordem, e por último o locktime. O marcador é onde está o truque de compatibilidade, porque um valor de zero significaria zero entradas para o analisador antigo, o que não faz sentido, então o software antigo que recebe o formato novo sabe de imediato que não é para ele, e os pares legados simplesmente nunca a recebem.

Dois identificadores saem disso. O txid é um SHA-256 duplo da transação sem o marcador, o indicador e as testemunhas, e por isso nada dentro de uma testemunha pode alterá-lo. O wtxid, em vez disso, é o hash da serialização completa. Cada bloco fixa uma raiz de Merkle de seus wtxids dentro de uma saída coinbase, uma saída OP_RETURN cujo script tem pelo menos 38 bytes e começa pela etiqueta de quatro bytes 0xaa21a9ed, de modo que os dados ficam protegidos mesmo vivendo fora do compromisso mais antigo.

O custo é onde o desconto aparece. Tudo o que fica fora da testemunha é cobrado a quatro unidades de peso por byte e tudo o que fica dentro é cobrado a uma, contra um teto de 4.000.000 unidades de peso por bloco. Divida o peso por quatro e você obtém bytes virtuais, que é a unidade em que as taxas por vB são cotadas.

Onde você vê isso

Abra qualquer transação em um explorador de blocos e o tamanho, o tamanho virtual e o peso aparecerão lado a lado. Quando eles não coincidem, a diferença é a testemunha. Um pagamento sem nenhuma testemunha mostra um tamanho igual ao seu vsize; um pagamento Taproot pode mostrar um vsize de apenas um quarto do seu tamanho bruto.

Ao expandir uma única entrada em um explorador moderno, você vê a própria pilha. Em um pagamento feito de um endereço que começa com bc1q são dois itens, uma assinatura de cerca de 71 ou 72 bytes e uma chave pública comprimida de 33 bytes, e em um gasto por caminho de chave Taproot é um único item de exatamente 64 bytes. Essa contagem é toda a razão pela qual gastar a partir dos tipos de saída mais novos sai mais barato.

O campo também aparece nos arquivos que sua carteira de hardware manipula. Uma transação de bitcoin parcialmente assinada tem, por entrada, um registro de UTXO de testemunha e um registro de testemunha final, que é o que um aplicativo coordenador fica passando de um lado para o outro enquanto uma transação de multiassinatura reúne assinaturas.

Dados de testemunha vs script de testemunha

Os dados de testemunha são a pilha inteira; um script de testemunha é um item dentro dela. Em um gasto P2WSH, o último item da pilha é o script cujo hash a saída fixou, e tudo o que vem antes existe para satisfazer esse script. A relação copia exatamente o padrão antigo, em que um script de resgate é o último item de um script de assinatura P2SH. Assim, todo script de testemunha é dado de testemunha, enquanto a maioria dos dados de testemunha, incluindo os de qualquer gasto comum de uma só chave, não contém nenhum script de testemunha.

Não confundir com

Perguntas frequentes

Por que o tamanho da minha transação é diferente do seu tamanho virtual?

A diferença são os dados de testemunha. O tamanho virtual é o peso dividido por quatro, e os bytes da testemunha contam uma unidade de peso cada um em vez de quatro, então qualquer transação que gaste entradas SegWit tem um tamanho virtual menor que sua contagem de bytes brutos.

É possível descartar os dados de testemunha depois que a transação é confirmada?

Não por um nó que pretenda validar o histórico por conta própria, porque cada bloco fixa uma raiz de Merkle de identificadores de testemunha. Um nó podado descarta dados antigos de blocos de todo tipo, mas verificou as testemunhas antes de fazê-lo.

Termos relacionados

Mais em Protocolo e atualizações

Ler esta página em inglês