wTXID

Como um TXID, mas incluindo os dados de testemunha

Um wTXID é como um TXID, mas inclui os dados de testemunha de uma transação.

Por exemplo:

Um wTXID é o HASH256 de todos os dados da transação, incluindo o marker, o flag e a witness:

Diagrama mostrando o wTXID sendo calculado a partir dos dados brutos da transação, incluindo o marker, o flag e a testemunha.

wTXID

Crie um wTXID a partir dos dados de uma transação bruta.

0 bytes 0 bytes

Também conhecido como o "hash" da transação nos comandos do bitcoin-cli

0 bytes

Enquanto um TXID é o HASH256 de todos os dados da transação exceto o marker, o flag e a witness:

Diagrama mostrando o TXID sendo calculado a partir dos dados brutos da transação, excluindo o marker, o flag e a testemunha.

TXID

Crie um TXID a partir dos dados de uma transação bruta.

0 bytes

Bytes da transação efetivamente usados no hash (sem marker, flag nem testemunha):

Usado internamente dentro dos dados da transação bruta

0 bytes

Usado externamente ao buscar transações em exploradores de blocos

0 bytes

Os diagramas acima não mostram os campos marker e flag.

Exemplos

Como você cria um wTXID?

De uma perspectiva técnica, um wTXID é calculado fazendo o hash dos seguintes campos de uma transação bruta serializada:

wTXID = HASH256([version][marker][flag][inputs][outputs][witness][locktime])

Transação SegWit

Aqui estão os dados brutos de uma transação segwit. Destaquei os novos campos segwit:

01000000000101438afdb24e414d54cc4a17a95f3d40be90d23dfeeb07a48e9e782178efddd8890100000000fdffffff020db9a60000000000160014b549d227c9edd758288112fe3573c1f85240166880a81201000000001976a914ae28f233464e6da03c052155119a413d13f3380188ac024730440220200254b765f25126334b8de16ee4badf57315c047243942340c16cffd9b11196022074a9476633f093f229456ad904a9d97e26c271fc4f01d0501dec008e4aae71c2012102c37a3c5b21a5991d3d7b1e203be195be07104a1a19e5c2ed82329a56b431213000000000

O TXID é o HASH256 de todos os dados da transação exceto o marker, o flag e a witness:

c06aaaa2753dc4e74dd4fe817522dc3c126fd71792dd9acfefdaff11f8ff954d

O wTXID é, então, apenas o HASH256 de todos os dados da transação incluindo o marker, o flag e a witness:

f12d56f2234e809129dbf59392961bbe7a89b6250651f6aea7852cc00ced63ff

Você pode conferir isso você mesmo passando os dados pelo HASH256 manualmente:

HASH256

SHA-256 dupla. Usada para fazer o hash de cabeçalhos de bloco, dados de transação e de praticamente qualquer coisa que precise ser hasheada no Bitcoin.

0 bytes
SHA-256
SHA-256

SHA-256(SHA-256(dados))

0 bytes

Inverter Bytes

Inverte a ordem dos bytes de um valor hexadecimal (útil para converter entre big-endian e little-endian).

0 bytes 0 bytes
Bytes
Invertidos

Ordem de Bytes. Não esqueça que TXIDs e wTXIDs são exibidos em ordem de bytes invertida, então o resultado inicial do HASH256 estará em ordem natural (o que significa que ele parece "ao contrário" no início).

Transação Legada

Uma transação não-segwit terá o mesmo TXID e wTXID.

Por exemplo, aqui estão os dados brutos de uma transação legada:

0100000001ba1e48633efb7397536c3b45582cb763b1903b1364865f6de0f53387d306c87d010000006b483045022100df50e78ee42725165eceed6e6e1c534936015d3ef9e410d301de682a3655012f02203d21199bc19d982926fcf6bfe26773f4a0b2befdabb742542469f04e739764cb012103668b0f35effa223f001fb1c39d61bde513d5c6291b84227e84fd3e7daf0e3a6afeffffff02ce6d6002000000001976a9144ccb1bfd0099bf5ba2e2799a9f444f9583a74ce088ac35102408000000001976a914e5555373c7d95bb6a2cfcf7e9ffb3fcb5a305ba988ac711a0600

Este é o TXID:

25346687d5d10239c25a88193c97228327826a4ff66a36c4ba7e038f3e2ae9ed

E, já que uma transação legada não inclui marker, flag nem witness, ela terá o mesmo wTXID:

25346687d5d10239c25a88193c97228327826a4ff66a36c4ba7e038f3e2ae9ed

HASH256

SHA-256 dupla. Usada para fazer o hash de cabeçalhos de bloco, dados de transação e de praticamente qualquer coisa que precise ser hasheada no Bitcoin.

0 bytes
SHA-256
SHA-256

SHA-256(SHA-256(dados))

0 bytes

Inverter Bytes

Inverte a ordem dos bytes de um valor hexadecimal (útil para converter entre big-endian e little-endian).

0 bytes 0 bytes
Bytes
Invertidos

Você pode encontrar o wTXID de uma transação rodando bitcoin-cli getrawtransaction <txid> 1. O wTXID será igual ao campo "hash", já que esse "hash" é o HASH256 de todos os dados da transação (em ordem de bytes invertida), que atualmente é igual ao wTXID.

Compromisso de wTXID

Comprometendo os dados de testemunha ao bloco

Diagrama mostrando os dados segwit sendo comprometidos ao bloco por meio do compromisso de wTXID no scriptpubkey da transação coinbase.

Os wTXIDs são usados para comprometer os novos dados das transações segwit ao bloco, por meio de uma raiz da testemunha (witness root hash).

Compromissos (commitments) são usados para vincular uma parte a um valor, de modo que ela não possa se adaptar a outras mensagens para obter algum tipo de vantagem indevida.
cryptography.fandom.com

Por exemplo, todos os dados das transações legadas são comprometidos ao cabeçalho do bloco por meio da criação de uma raiz de Merkle de todos os TXIDs do bloco.

Porém, os TXIDs não incluem os dados de marker, flag e witness. Então, para todos os blocos desde a atualização Segregated Witness, também criamos uma raiz de Merkle de todos os wTXIDs e a comprometemos ao bloco criando uma raiz da testemunha.

Essa raiz da testemunha passa pelo HASH256 junto com o valor reservado de testemunha para criar um compromisso de wTXID. Ele é colocado dentro do ScriptPubKey de uma das saídas da transação coinbase.

Então, agora há um compromisso para todos os novos dados das transações segwit colocado dentro do bloco. Assim, se alguém tentar alterar o conteúdo dos dados de testemunha de qualquer transação do bloco, isso não vai mais bater com o compromisso de wTXID, e o bloco será inválido.

Os wTXIDs servem, em última análise, para impedir que alguém edite os novos dados de testemunha (segregated witness) incluídos no bloco.

Exemplo

O bloco na altura 553.724 contém as seguintes 4 transações:

As três primeiras são transações segwit, então contêm dados de testemunha que não serão comprometidos ao cabeçalho do bloco apenas pelos seus TXIDs.

Estes são os wTXIDs de cada uma das transações:

Ao calcular a raiz da testemunha, o wTXID da transação coinbase precisa ser definido como todo zeros. Isso porque ela acabará contendo o compromisso dentro dela, então isso evita uma referência circular.

A última transação é não-segwit, então o seu wTXID é igual ao seu TXID.

Se criarmos uma raiz de Merkle de todos esses wTXIDs, obtemos a raiz da testemunha:

witness root hash: dbee9a868a8caa2a1ddf683af1642a88dfb7ac7ce3ecb5d043586811a41fdbf2

Merkle Root

Calcule a raiz de Merkle a partir de uma lista de TXIDs.

Bloco

Uma lista de TXIDs separados por espaços, vírgulas ou novas linhas. Aspas e colchetes são ignorados.

Os TXIDs devem ser inseridos na ordem de byte invertida (como aparecem nos exploradores), mas são convertidos para a ordem de byte natural antes de calcular a raiz de Merkle.

TXIDs (0)

A ordem dos bytes como sai da função de hash

A ordem dos bytes como mostrada nos exploradores

Agora, se olharmos dentro da entrada da transação coinbase, encontramos o valor reservado de testemunha:

valor reservado de testemunha: 0000000000000000000000000000000000000000000000000000000000000000

Por fim, se concatenarmos e passarmos pelo HASH256 a raiz da testemunha e o valor reservado de testemunha, obtemos o compromisso de wTXID:

compromisso de wTXID = HASH256(raiz da testemunha | valor reservado de testemunha)
compromisso de wTXID = 6502e8637ba29cd8a820021915339c7341223d571e5e8d66edd83786d387e715

HASH256

SHA-256 dupla. Usada para fazer o hash de cabeçalhos de bloco, dados de transação e de praticamente qualquer coisa que precise ser hasheada no Bitcoin.

0 bytes
SHA-256
SHA-256

SHA-256(SHA-256(dados))

0 bytes

Esse compromisso de wTXID é colocado no ScriptPubKey de uma das saídas da transação coinbase. Então, se checarmos o ScriptPubKey da saída 1 da transação coinbase deste bloco, encontramos o seguinte script:

OP_RETURN
OP_PUSHBYTES_36
aa21a9ed6502e8637ba29cd8a820021915339c7341223d571e5e8d66edd83786d387e715

Você verá que o compromisso de wTXID está contido nos últimos 32 bytes desse empilhamento de dados.

Todas as transações coinbase desde a atualização segregated witness precisam incluir esse compromisso com os dados de testemunha. Todas elas têm que incluir uma saída com este padrão de script: começando com OP_RETURN, seguido de um OP_PUSHBYTES_36 que contém um cabeçalho de 4 bytes seguido do compromisso de wTXID de 32 bytes.

O compromisso de wTXID pode estar contido dentro de qualquer uma das saídas da transação coinbase. Se houver, por algum motivo, várias saídas com essa estrutura, o número de índice de saída mais alto que contiver essa estrutura de compromisso de wTXID será tomado como o compromisso.

Uso

Como os wTXIDs são usados no Bitcoin?

Os wTXIDs são usados apenas internamente no Bitcoin, para criar um compromisso com os novos campos segwit das transações.

O wtxid só é usado para calcular a raiz de Merkle da testemunha (Witness merkle root), que é comprometida na coinbase.
Pieter Wuille, bitcoin.stackexchange.com

Então você não usaria o wTXID para procurar uma transação na blockchain nem nada do tipo.

Você ainda usa o TXID para procurar transações na blockchain. Um TXID ainda é um identificador único de uma transação, pois ele ainda faz o hash do efeito da transação (mover moedas de saídas existentes para novas saídas), que é sempre único para cada transação. Os dados de testemunha só importam para a validação da transação (destravar as entradas), e isso não torna os dados da transação mais únicos do que já são.

As assinaturas dentro de uma transação, na verdade, não descrevem o efeito de uma transação. Uma transação move moedas, as reatribui. Mas a assinatura só está ali para provar que a transação foi autorizada; ela não muda o seu efeito.
Pieter Wuille, SF Bitcoin Developers

Recursos