Transação

Os dados que destravam e travam lotes de bitcoins

Diagrama da estrutura de uma transação de bitcoin mostrando as entradas e as saídas.

Uma transação de bitcoin é só um monte de dados que destrava e trava lotes de bitcoins.

Mais precisamente, uma transação:

  1. Seleciona lotes existentes de bitcoins (entradas) e os destrava.
  2. Cria novos lotes de bitcoins (saídas) e coloca novas travas neles.

Você pode ter várias entradas e saídas em uma única transação.

Então você pode pensar em uma transação como sendo parte de uma cadeia de saídas: uma transação cria uma saída, e uma transação futura seleciona essa saída (como entrada) e a destrava para criar novas saídas.

Diagrama mostrando uma cadeia de transações em que as novas transações gastam as saídas das transações anteriores.

O mecanismo de travar e destravar envolve um pouco de criptografia. A trava de uma saída normalmente contém uma chave pública e, se você quiser destravá-la, precisará da chave privada correspondente àquela chave pública para criar uma assinatura digital para ela.

Diagrama mostrando uma chave pública sendo colocada na saída de uma transação. Diagrama mostrando uma chave privada sendo usada para criar uma assinatura digital que destrava a entrada de uma transação.
Uma moeda digital contém a chave pública do seu dono. Para transferi-la, o dono assina a moeda junto com a chave pública do próximo dono. Qualquer um pode verificar as assinaturas para confirmar a mudança de propriedade.
Satoshi Nakamoto, satoshi.nakamotoinstitute.org

Essa criptografia não foi inventada pelo Bitcoin; sistemas de assinatura digital já existiam, e o Bitcoin utiliza um deles para que as pessoas possam "ter" e enviar quantidades de bitcoin umas às outras.

Mas, embora isso seja interessante, não precisamos saber dessa criptografia subjacente se só queremos entender a estrutura das transações de bitcoin e como elas funcionam, que é o tema desta página.

Ícone Ferramenta Separador de Transação

Separador de Transações

Cole uma transação bruta (hexadecimal) para dividi-la nos seus campos individuais.

Ícone Ferramenta Construtor de Transação

Construtor de Transações

Monte os dados brutos de uma transação.

Tipo

Versão

0d
Transação Básica

Entradas (1)

Saídas (1)

Locktime

0d
Altura de Bloco

Dados Brutos da Transação

0 bytes 0 vbytes

Estrutura

Como é uma transação bruta de bitcoin?

Uma transação bruta de bitcoin é formada por campos, cada um contendo bytes de dados.

Todas as transações de bitcoin têm a mesma estrutura básica, então, para decodificá-las, você só precisa saber o tamanho de cada campo e em que formato os dados estão.

Transação
CampoExemploTamanhoFormatoDescrição
Versão020000004 bytesLittle-EndianO número da versão da transação. Usado para habilitar novos recursos.
Marker001 byte Usado para indicar uma transação segwit. Precisa ser 00.
Flag011 byte Usado para indicar uma transação segwit. Precisa ser 01 ou maior.
Contagem de Entradas01variávelCompact SizeIndica o número de entradas.
Entrada(s)
CampoExemploTamanhoFormatoDescrição
TXID[TXID]32 bytesOrdem Natural de BytesO TXID da transação que contém a saída que você quer gastar.
VOUT010000004 bytesLittle-EndianO número de índice da saída que você quer gastar.
Tamanho do ScriptSig6bvariávelCompact SizeO tamanho em bytes do ScriptSig seguinte.
ScriptSig[script]variávelScriptO código de destravamento da saída que você quer gastar.
Sequencefdffffff4 bytesLittle-EndianDefine se a transação pode ser substituída ou quando pode ser minerada.

Esta estrutura se repete para cada entrada.

Contagem de Saídas02variávelCompact SizeIndica o número de saídas.
Saída(s)
CampoExemploTamanhoFormatoDescrição
Valore99e0600000000008 bytesLittle-EndianO valor da saída em satoshis.
Tamanho do ScriptPubKey19variávelCompact SizeO tamanho em bytes do ScriptPubKey seguinte.
ScriptPubKey[script]variávelScriptO código de travamento desta saída.

Esta estrutura se repete para cada saída.

Testemunha
CampoExemploTamanhoFormatoDescrição
Itens da Pilha02variávelCompact SizeO número de itens a empilhar como parte do código de destravamento.
Tamanho47variávelCompact SizeO tamanho do item de pilha seguinte.
Item304...b01variávelBytesO dado a ser empilhado.

Esta estrutura se repete para cada item de pilha e para cada entrada.

Locktime000000004 bytesLittle-EndianDefine um tempo ou altura após o qual a transação pode ser minerada.

Nota: As linhas destacadas em azul são campos usados em transações segwit.

Versão

Ícone Ferramenta Little Endian

Little Endian

Converta um número entre as ordens de bytes big-endian e little-endian.

0d
0x
0 bytes
0x
0 bytes
Tamanho do Campo

O campo versão permite habilitar novos recursos de transação.

Uma transação básica tem número de versão 1, mas a maioria das transações modernas de bitcoin agora usa número de versão 2.

Marker & Flag (Opcional)

Os dois bytes seguintes podem ser usados para indicar uma transação segregated witness.

Esses bytes só são necessários se você estiver destravando entradas que tenham uma trava P2WPKH, P2WSH ou P2TR (ou seja, que exigem o uso do campo testemunha no fim da transação).

Marker

Defina como 00 para indicar que esta é uma transação segregated witness. Precisa ser sempre 00.

Flag

Defina como 01 para uma transação segregated witness. No futuro, esse byte pode ser incrementado para indicar estruturas de transação mais novas.

Softwares Bitcoin antigos que não foram atualizados para usar transações segregated witness vão interpretar esses bytes marker e flag como indicando que a transação tem 0 entradas e 1 saída, o que tornaria a transação inválida. Porém, os nós antigos não recebem de fato esses bytes quando a transação lhes é enviada.

Contagem de Entradas

Ícone Ferramenta Compact Size

Compact Size

Converta entre um número e sua codificação compact size (o varint usado no Bitcoin).

0d
0 bytes
Prefixo

O primeiro byte indica quais bytes codificam o inteiro:

Nota: os bytes que codificam o inteiro estão em little endian.

O campo de contagem de entradas indica o número de entradas seguintes na transação.

Entrada(s)

Diagrama da estrutura de uma entrada de transação.

Cada entrada de uma transação tem a sua própria estrutura interna. Mas, basicamente, tudo o que você faz é selecionar uma saída de uma transação anterior e fornecer o código de destravamento para ela.

Para cada entrada, basta repetir o seguinte conjunto de campos:

TXID

Ícone Ferramenta TXID

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
Diagrama mostrando como uma entrada é selecionada referenciando o TXID e o VOUT de uma transação anterior.

Este é o TXID da transação que criou a saída que você quer gastar.

O TXID que você usa para referenciar uma transação anterior nos dados brutos da transação está em ordem natural de bytes, que é, na verdade, a ordem invertida dos bytes que você vê nos exploradores de blocos. É só uma peculiaridade do bitcoin.

Um TXID é criado fazendo o hash dos dados da transação. Toda transação tem o seu próprio TXID único.

VOUT

Ícone Ferramenta Little Endian

Little Endian

Converta um número entre as ordens de bytes big-endian e little-endian.

0d
0x
0 bytes
0x
0 bytes
Tamanho do Campo

Este é o número de índice da saída na transação que você acabou de referenciar.

Uma transação pode criar várias saídas, então você precisa especificar qual saída da transação você quer gastar. Essa combinação de TXID:VOUT é chamada de outpoint, que serve como identificador único para cada lote individual de bitcoins dentro da blockchain. A saída que você quer gastar não pode ter sido gasta em uma transação anterior.

A primeira saída de uma transação está no índice número 0.

VOUT é a abreviação de "Vector Output" (saída de vetor). Um "vetor" é basicamente um termo de programação para uma lista numerada de itens. É uma estrutura comum em C++, a linguagem em que o Bitcoin foi originalmente programado.

Tamanho do ScriptSig

Ícone Ferramenta Compact Size

Compact Size

Converta entre um número e sua codificação compact size (o varint usado no Bitcoin).

0d
0 bytes
Prefixo

O primeiro byte indica quais bytes codificam o inteiro:

Nota: os bytes que codificam o inteiro estão em little endian.

Indica o tamanho seguinte do código de destravamento desta entrada.

O código de destravamento pode variar de comprimento dependendo do tipo de trava usada, e é por isso que precisamos especificar o tamanho do código de destravamento seguinte, para sabermos quantos dados precisamos ler.

ScriptSig (Opcional/Legado)

O campo scriptsig contém o código de destravamento da saída que você acabou de referenciar. Toda saída tem alguma forma de trava, então você precisa fornecer algum dado que satisfaça as condições da trava.

Este campo usa Script e normalmente contém uma assinatura digital. Essa assinatura é criada assinando os dados da transação atual usando a chave privada que criou a chave pública dentro da trava.

Atualmente, este campo só é usado para destravar saídas com scripts de travamento legados. São eles:

  • É chamado de "ScriptSig" porque é destravado usando Script e normalmente contém uma assinatura (signature).
  • Se você está destravando um script de travamento moderno P2WPKH ou P2WSH, o código de destravamento precisa ser colocado dentro do campo testemunha seguinte. Se for o caso, você deve definir o tamanho do campo scriptsig desta entrada como 00.

Sequence

Ícone Ferramenta Sequence

Sequence

Veja quais recursos (locktime, RBF, locktime relativo) um valor de sequence habilita — ou monte um sequence marcando os recursos.

O sequence como aparece nos dados brutos da transação

0x
4 bytes
0x
4 bytes
Recursos
Tipo do Locktime Relativo
segundos

O campo sequence permite habilitar alguns recursos adicionais para a entrada que você está gastando:

  1. Locktime. Definindo pelo menos uma das sequences como 0xFFFFFFFE ou menor, você habilita o campo locktime seguinte para a transação inteira.
  2. Replace By Fee. Definindo um valor de sequence de 0xFFFFFFFD ou menor, você habilita que esta entrada seja gasta em uma transação diferente com uma taxa maior (se a transação atual ainda estiver na memory pool no momento).
  3. Locktime Relativo. Definindo um valor de sequence menor que 0x80000000, você pode definir um locktime relativo nesta entrada. Isso significa que a transação não pode ser minerada até um ponto específico no tempo — pode ser um número de segundos ou um número de blocos a partir de quando a saída referenciada foi originalmente minerada.

Este campo foi reaproveitado várias vezes desde o seu design original, e é por isso que ele é uma mistura de recursos diferentes em um só.

Uma configuração popular é 0xFFFFFFFD, pois habilita tanto o locktime quanto o replace-by-fee, que costumam ser úteis na maioria das transações.

Contagem de Saídas

Ícone Ferramenta Compact Size

Compact Size

Converta entre um número e sua codificação compact size (o varint usado no Bitcoin).

0d
0 bytes
Prefixo

O primeiro byte indica quais bytes codificam o inteiro:

Nota: os bytes que codificam o inteiro estão em little endian.

O campo de contagem de saídas indica o número de saídas seguintes.

Saída(s)

Diagrama da estrutura de uma saída de transação.

Cada saída cria um novo lote de bitcoins com a sua própria trava. Eu os chamo de "lotes" de bitcoins, mas o termo técnico é "saída" (output).

Assim como uma entrada, uma saída tem a sua própria estrutura interna. Para cada saída, basta repetir o seguinte conjunto de campos:

Valor

Ícone Ferramenta Little Endian

Little Endian

Converta um número entre as ordens de bytes big-endian e little-endian.

0d
0x
0 bytes
0x
0 bytes
Tamanho do Campo
Ícone Ferramenta Conversor de Unidades

Conversor de Unidades

Converta entre as unidades comuns de bitcoin.

bitcoin inteiro
um milésimo de um bitcoin
um milionésimo de um bitcoin
um cem-milionésimo de um bitcoin
Diagrama do campo valor de uma saída de transação.

O campo valor é onde você define o valor da saída em satoshis (1 satoshi = 0,00000001 BTC).

Este campo tem 8 bytes de tamanho, o que significa que você pode colocar até 0xFFFFFFFFFFFFFFFF, ou 18446744073709551615 satoshis, em uma saída. Isso equivale a 184.467.440.737,09551615 BTC, que é mais BTC do que existe.

O valor total das suas saídas não pode exceder o valor total das suas entradas.

Qualquer quantidade de bitcoin restante que não for usada será reivindicada por um minerador como a taxa da transação.

Tamanho do ScriptPubKey

Ícone Ferramenta Compact Size

Compact Size

Converta entre um número e sua codificação compact size (o varint usado no Bitcoin).

0d
0 bytes
Prefixo

O primeiro byte indica quais bytes codificam o inteiro:

Nota: os bytes que codificam o inteiro estão em little endian.

Indica o tamanho seguinte do código de travamento desta saída.

Você pode colocar diferentes tipos de trava na sua saída, e é por isso que precisamos especificar o tamanho do código de travamento seguinte, para sabermos quantos dados precisamos ler.

ScriptPubKey

Ícone Ferramenta Script

Script

Decodifique e codifique um script.

0 bytes

Diagrama do campo scriptPubKey de uma saída de transação.

Este é o código de travamento de fato que estamos colocando na saída.

Há vários padrões diferentes de código de travamento que você pode usar. Aqui estão os exemplos mais comuns:

O código de travamento legado usa a linguagem Script de verdade, completa. Porém, o código de travamento mais novo, das travas P2WPKH e P2WSH, usa apenas uma estrutura fixa.

É chamado de "scriptpubkey" porque é um Script que normalmente contém uma chave pública (pubkey). Nem sempre é o caso, mas é assim que esse campo é comumente chamado.

Testemunha (Opcional)

Diagrama mostrando a localização do campo testemunha em uma transação segwit e como ele é usado para destravar entradas.

A testemunha é a área para o código de destravamento quando você está destravando entradas com scripts de travamento P2WPKH, P2WSH ou P2TR. Você pode pensar nela como a nova localização dos campos ScriptSig em transações segwit. A principal diferença é que ela não usa nenhum opcode, pois é apenas um monte de empilhamentos de dados.

Por exemplo, para destravar um script de travamento P2WPKH típico, você usaria o seguinte campo de testemunha:

O campo de testemunha de cada entrada começa com um campo de itens da pilha indicando o número de itens no campo de testemunha, seguido pelo tamanho de cada item e pelo próprio item. Usando o exemplo acima:

Isso se repete para cada entrada da transação.

Como você pode ver, é mais básico do que usar Script. Porém, embora pareça bem parecido e normalmente contenha o mesmo tipo de dados (ex.: chaves públicas e assinaturas), os dados de testemunha não são Script.

Locktime

Ícone Ferramenta Little Endian

Little Endian

Converta um número entre as ordens de bytes big-endian e little-endian.

0d
0x
0 bytes
0x
0 bytes
Tamanho do Campo
Ícone Ferramenta Unix Time

Unix Time

Converta o número de segundos desde 01/01/1970, 00:00:00 para uma data.

0d

O campo locktime permite especificar uma altura de bloco ou um Unix time após o qual a transação pode ser minerada.

Uma transação com locktime definido no futuro não pode ser minerada em um bloco, nem será aceita nas mempools dos nós da rede. Então, se você criar uma transação com locktime no futuro, pode compartilhá-la com outras pessoas, mas não conseguirá submetê-la à rede com sucesso até que o tempo específico ou a altura de bloco tenham sido ultrapassados.

Em outras palavras, adicionar um locktime a uma transação é como pós-datar um cheque.

Pelo menos um dos campos sequence precisa estar definido como 0xFFFFFFFE ou menor para o locktime ser habilitado. Se todas as sequences estiverem no seu máximo de 0xFFFFFFFF, a transação é considerada "final" e o recurso de locktime fica desabilitado.

Gif

Aqui está um gif horrível que fiz em 2015 mostrando o que cada campo faz nos dados brutos de uma transação (em uma transação legada):

Gif animado mostrando o que cada campo faz nos dados brutos de uma transação.

Exemplos

Aqui estão alguns exemplos típicos de transações brutas reais. Provavelmente é mais útil inspecioná-las no explorador, mas eu as incluí aqui de qualquer forma, pois são bons exemplos da estrutura geral das transações.

Para exemplos mais complexos e interessantes, confira a página de transações do explorador.

1. Transação Legada Básica

010000000110ddd830599b17cc690535f7df28a84466eaca3c22f0d55b79023b6570f4fbc5010000008b483045022100e6186d6f344ce4df46b2e15d87093d34edbf5b50462b6b45f9bd499a6a62fbc4022055f56a1c4a24ea6be61564593c4196b47478a25cf596c1baf59f5a9a229b637c014104a41e997b6656bc4f5dd1f9b9df3b4884cbec254d3b71d928587695b0df0a80417432f4ca6276bc620b1f04308e82e70015a40f597d8260912f801e4b62ab089effffffff0200e9c829010000001976a9146f34d3811aded1df870359f311c2a11a015e945388ac00e40b54020000001976a91470d6734de69c1ac8913892f2df9be0e738d26c2d88ac00000000
{
  "version": "01000000",
  "inputcount": "01",
  "inputs": [
    {
      "txid": "10ddd830599b17cc690535f7df28a84466eaca3c22f0d55b79023b6570f4fbc5",
      "vout": "01000000",
      "scriptsigsize": "8b",
      "scriptsig": "483045022100e6186d6f...e4b62ab089e",
      "sequence": "ffffffff"
    }
  ],
  "outputcount": "02",
  "outputs": [
    {
      "amount": "00e9c82901000000",
      "scriptpubkeysize": "19",
      "scriptpubkey": "76a9146f34d3811aded1df870359f311c2a11a015e945388ac"
    },
    {
      "amount": "00e40b5402000000",
      "scriptpubkeysize": "19",
      "scriptpubkey": "76a91470d6734de69c1ac8913892f2df9be0e738d26c2d88ac"
    }
  ],
  "locktime": "00000000"
}

Transação: 251490baffd0d3d5175b77bf334ba866c4fd416fcc686a1001e188fba83b4ccb

Esta é uma transação legada típica. Ela seleciona uma única entrada com uma trava P2PKH e cria duas novas saídas com novas travas P2PKH.

A entrada é destravada colocando a chave pública original e a assinatura no campo ScriptSig dessa entrada.

As assinaturas são grandes e representam uma parcela significativa do tamanho total da transação.

A segunda saída normalmente é usada para enviar "troco" de volta a um endereço que você possui. Isso acontece quando a quantidade de satoshis na entrada é maior do que a quantidade que você quer enviar.

2. Transação SegWit Básica

010000000001013c735f81c1a0115af2e735554fb271ace18c32a3faf443f9db40cb9a11ca63110000000000ffffffff02b113030000000000160014689a681c462536ad7d735b497511e527e9f59245cf120000000000001600148859f1e9ef3ba438e2ec317f8524ed41f8f06c6a024730440220424772d4ad659960d4f1b541fd853f7da62e8cf505c2f16585dc7c8cf643fe9a02207fbc63b9cf317fc41402b2e7f6fdc1b01f1b43c5456cf9b547fe9645a16dcb150121032533cb19cf37842556dd2168b1c7b6f3a70cff25a6ff4d4b76f2889d2c88a3f200000000
{
  "version": "01000000",
  "marker": "00",
  "flag": "01",
  "inputcount": "01",
  "inputs": [
    {
      "txid": "3c735f81c1a0115af2e735554fb271ace18c32a3faf443f9db40cb9a11ca6311",
      "vout": "00000000",
      "scriptsigsize": "00",
      "scriptsig": "",
      "sequence": "ffffffff"
    }
  ],
  "outputcount": "02",
  "outputs": [
    {
      "amount": "b113030000000000",
      "scriptpubkeysize": "16",
      "scriptpubkey": "0014689a681c462536ad7d735b497511e527e9f59245"
    },
    {
      "amount": "cf12000000000000",
      "scriptpubkeysize": "16",
      "scriptpubkey": "00148859f1e9ef3ba438e2ec317f8524ed41f8f06c6a"
    }
  ],
  "witness": [
    {
      "stackitems": "02",
      "0": { "size": "47", "item": "30440220...a16dcb1501" },
      "1": { "size": "21", "item": "032533cb19...2c88a3f2" }
    }
  ],
  "locktime": "00000000"
}

Transação: f8c24461e0a08ede06539433affaba93e303ca9929c300cfc00a8929e8025a80

Esta é uma transação segwit típica. A presença dos bytes marker+flag 0001 indica que é uma transação segwit e que ela usa uma seção de testemunha.

Ela seleciona uma única entrada com uma trava P2WPKH e cria duas novas saídas com novas travas P2WPKH.

Esta transação é funcionalmente igual à de cima. Ela só usa um campo de testemunha para destravar a entrada, em vez do campo ScriptSig legado.

O que torna esta uma transação "segwit" é o fato de que ela gasta uma saída P2WPKH de uma transação anterior.

3. Transação com Entradas Legadas e SegWit

01000000000102f11271713fb911ebdb7daa111470853084c5b4f6ad73582517a73b1131839d71000000006a473044022001187384d8b30020a0ad6976805f0676da8e5fd219ffec084f7c22d2acd4838f0220074e3195a6e624b7ac5cb8e072d77f3b6363968040fc99f268affd4c08e11ac7012103510f10304c99bd53af8b3e47b3e282a75a50dad6f459c4c985898fd800a9e9a8fffffffff11271713fb911ebdb7daa111470853084c5b4f6ad73582517a73b1131839d710100000000ffffffff021027000000000000160014858e1f88ff6f383f45a75088e15a095f20fc663f2c1a0000000000001976a9142241a6c3d4cc3367efaa88b58d24748caef79a7288ac0002473044022035345342616cb5d6eefbbffc1de179ee514587dd15efe5ca892602f50336e30502207864061776e39992f317aee92dcc9595cc754b8f13957441d5ccd9ebd1b5cc0c0121022ed6c7d33a59cc16d37ad9ba54230696bd5424b8931c2a68ce76b0dbbc222f6500000000
{
  "version": "01000000",
  "marker": "00",
  "flag": "01",
  "inputcount": "02",
  "inputs": [
    {
      "txid": "f11271713fb911ebdb7daa111470853084c5b4f6ad73582517a73b1131839d71",
      "vout": "00000000",
      "scriptsigsize": "6a",
      "scriptsig": "473044022001187384...800a9e9a8",
      "sequence": "ffffffff"
    },
    {
      "txid": "f11271713fb911ebdb7daa111470853084c5b4f6ad73582517a73b1131839d71",
      "vout": "01000000",
      "scriptsigsize": "00",
      "scriptsig": "",
      "sequence": "ffffffff"
    }
  ],
  "outputcount": "02",
  "outputs": [
    {
      "amount": "1027000000000000",
      "scriptpubkeysize": "16",
      "scriptpubkey": "0014858e1f88ff6f383f45a75088e15a095f20fc663f"
    },
    {
      "amount": "2c1a000000000000",
      "scriptpubkeysize": "19",
      "scriptpubkey": "76a9142241a6c3d4cc3367efaa88b58d24748caef79a7288ac"
    }
  ],
  "witness": [
    { "stackitems": "00" },
    {
      "stackitems": "02",
      "0": { "size": "47", "item": "3044022035...d1b5cc0c01" },
      "1": { "size": "21", "item": "022ed6c7d3...bc222f65" }
    }
  ],
  "locktime": "00000000"
}

Transação: 846c308dc8ba79e9fc21985b1c10563d72ddff4a0ffb0e9c01d7db51fb7829ce

Esta é uma transação um pouco mais complexa. Ela seleciona duas entradas:

  1. A primeira entrada tem uma trava legada P2PKH.
  2. A segunda entrada tem uma trava P2WPKH.

Em seguida, ela cria duas novas saídas:

  1. A primeira tem uma trava legada P2PKH.
  2. A segunda tem uma trava P2WPKH.

Como resultado, a primeira entrada usa o campo ScriptSig, e a segunda usa o campo testemunha.

Toda entrada em uma transação segwit precisa ter o seu próprio campo de testemunha. Se a entrada não precisar usá-lo, basta definir o seu campo de testemunha como 00 (ou seja, zero itens de pilha).

TXID

Diagrama mostrando como um TXID é construído a partir dos dados brutos da transação (sem incluir os dados de testemunha).
Ícone Ferramenta TXID

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

Toda transação tem o seu próprio número de referência único. Ele é conhecido como ID de Transação (TXID).

Um TXID é criado fazendo um SHA256 duplo (double-SHA256) dos seguintes campos dos dados brutos da transação:

TXID = HASH256([versão][entradas][saídas][locktime])

Isso cria um resultado de hash de 32 bytes completamente único para cada transação.

Você usa esses TXIDs ao procurar uma transação em um explorador de blocos ou quando quer gastar a saída de uma transação em uma nova transação.

Os TXIDs das transações também são hasheados juntos para criar uma raiz de Merkle para o cabeçalho do bloco. Isso basicamente cria uma "impressão digital" das transações incluídas no bloco; então, se alguma transação mudar, a impressão digital também muda.

Os TXIDs que você usa ao procurar transações em exploradores de blocos estão, na verdade, em ordem de bytes invertida em relação ao que sai da função de hash. É só uma peculiaridade do Bitcoin.

wTXID

Diagrama mostrando como um wTXID (Witness TXID) é construído a partir dos dados brutos da transação (incluindo os dados de testemunha).
Ícone Ferramenta wTXID

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

Toda transação também tem um TXID de testemunha (wTXID).

Um wTXID é criado fazendo um SHA256 duplo dos dados da transação, mas desta vez incluindo os campos adicionais de uma transação segwit:

wTXID = HASH256([versão][marker][flag][entradas][saídas][locktime][testemunha])

Este wTXID não é usado para procurar ou referenciar transações. Ele só é criado para que possamos incluir também uma "impressão digital" de todos os campos extras de dados das transações segregated witness (que vai no campo de testemunha da transação coinbase).

Uma transação legada terá o mesmo wTXID e TXID, porque ela não tem os campos [marker], [flag] ou [witness].

Tamanho

Como você mede o tamanho de uma transação?

Diagrama mostrando como o tamanho de uma transação é calculado em bytes. Diagrama mostrando como o tamanho de uma transação é calculado em unidades de peso. Diagrama mostrando como o tamanho de uma transação é calculado em bytes virtuais.

Uma transação tem 3 medidas de tamanho:

  1. Bytes. É simplesmente o número de bytes brutos da transação. É usado para calcular quanto espaço uma transação ocupa em disco.
  2. Peso (Weight). É o número de bytes da transação multiplicado por 4, exceto o tamanho dos campos marker, flag e testemunha. Essa medida de peso é usada para calcular quantas transações cabem dentro de um bloco, e serve basicamente para darmos um desconto aos dados de testemunha.
  3. Bytes Virtuais. É o peso dividido por 4. É usado nos exploradores de blocos para comparar as taxas (feerates) entre transações legadas (bytes) e transações segwit (peso).

Você provavelmente vai se deparar com a medida de bytes virtuais (vBytes) ao inspecionar transações em exploradores de blocos. É basicamente o tamanho da transação em bytes, exceto que cada byte de dados de testemunha conta como 0,25 de um byte. É a forma mais prática e universal de medir o "tamanho" das transações em termos de quantas transações cabem em um bloco.

Taxa

Diagrama mostrando como a taxa de uma transação é o restante do valor das entradas menos o valor das saídas.

Uma taxa de transação é o restante de uma transação.

Em outras palavras, é a soma das entradas menos a soma das saídas. Por exemplo:

entrada = 600 satoshis
saída   = 300 satoshis
saída   = 200 satoshis

taxa    = 100 satoshis

Então você define uma taxa em uma transação ao não "usar todo" o valor total das entradas que você selecionou.

As taxas de transação são coletadas pelos mineradores se eles conseguirem minerar um bloco. Então a taxa de transação funciona como um incentivo para os mineradores incluírem a sua transação no bloco candidato.

O restante de uma transação é sempre a taxa. Então, se você dimensionar incorretamente as suas saídas ao construir uma transação, pode acidentalmente dar uma taxa enorme ao minerador. Então tome cuidado.

Resumo

É assim que o Satoshi descreve uma transação:

Definimos uma moeda eletrônica como uma cadeia de assinaturas digitais. Cada dono transfere a moeda ao próximo assinando digitalmente um hash da transação anterior e a chave pública do próximo dono, e adicionando isso ao fim da moeda. Um beneficiário pode verificar as assinaturas para verificar a cadeia de propriedade.
Satoshi Nakamoto, Whitepaper do Bitcoin

Mas, no fim das contas, uma transação de bitcoin é apenas um monte de bytes. Se você os decodificar, vai descobrir que eles só destravam lotes de bitcoins e os travam em novos lotes.

É só isso.

É bem legal conseguir decodificar bytes brutos de dados e ver bitcoins sendo movidos de um lugar para outro. Transações brutas podem parecer ilegíveis à primeira vista, mas, se você descobrir o tamanho de cada campo e como eles são formatados, qualquer um consegue decodificá-las para ver o que estão fazendo. E, se você descobrir como decodificar uma transação, consegue decodificar qualquer transação da blockchain.

Você vai notar que transações posteriores a 2016 têm uma estrutura ligeiramente diferente devido à atualização segregated witness, mas isso é apenas a adição de três campos extras, e é bem fácil lidar com eles se você já pegou o jeito de decodificar transações legadas.

Então, se você tem interesse em como o bitcoin funciona, decodificar uma transação bruta é um bom ponto de partida.

Ícone Ferramenta Construtor de Transação

Construtor de Transações

Monte os dados brutos de uma transação.

Tipo

Versão

0d
Transação Básica

Entradas (1)

Saídas (1)

Locktime

0d
Altura de Bloco

Dados Brutos da Transação

0 bytes 0 vbytes

Recursos