VOUT

O número de índice de uma saída de transação

Diagrama mostrando os VOUTs como números de índice das saídas em uma transação.

Um VOUT é um número de índice para uma saída de transação.

Uma transação pode ter várias saídas, então cada uma recebe um número para que possa ser referenciada individualmente depois.

Em programação, começamos a contar do zero. Então a primeira saída de uma transação tem um VOUT de 0.

Uso

Para que serve o VOUT?

Você usa um VOUT em combinação com um TXID para ajudar a selecionar uma saída para gastar como entrada em uma transação.

Diagrama mostrando uma saída sendo selecionada como entrada de uma transação usando o número VOUT da saída anterior.

Então, ao adicionar entradas a uma transação, você começa encontrando a transação que criou a saída (pelo seu TXID) e então seleciona a saída específica que quer gastar usando o número VOUT da saída.

Toda saída na blockchain pode ser referenciada usando a combinação única de TXID:VOUT. Isso é chamado de "outpoint".

Por exemplo, aqui estão alguns outpoints específicos da blockchain:

Exemplo

Você encontra o VOUT dentro das entradas dos dados brutos de transação:

010000000001019344205e8904b78e4451eadc6120d9304c570f6697d074793c188b7dbdd74cf90300000017160014ceb587f907d67075247ddf52fb343625fd8f5a3bffffffff028c6e0000000000001976a9149e17484e1be011be7587d4f678df1123080fb5bc88acf5370100000000001976a914c1d3ab2c1c8c9f6b838c9bf25afe1454fbac22fe88ac0247304402201de904432601e724f281f97d68448cbf0610a91f32700ab5e82b88ef7ae08645022002ff2aa61254c401332648d43144887b3671b6a1ae95b11fd51dcfbd5966b4f40121029d66a6d49a1f936dc74ba588a1b693a62851159ddab4a7b3915c3ffca5e2e53000000000
{
  "version": "01000000",
  "marker": "00",
  "flag": "01",
  "inputcount": "01",
  "inputs": [
    {
      "txid": "9344205e8904b78e4451eadc6120d9304c570f6697d074793c188b7dbdd74cf9",
      "vout": "03000000",
      "scriptsigsize": "17",
      "scriptsig": "160014ceb587f907d67075247ddf52fb343625fd8f5a3b",
      "sequence": "ffffffff"
    }
  ],
  "outputcount": "02",
  "outputs": [
    {
      "amount": "8c6e000000000000",
      "scriptpubkeysize": "19",
      "scriptpubkey": "76a9149e17484e1be011be7587d4f678df1123080fb5bc88ac"
    },
    {
      "amount": "f537010000000000",
      "scriptpubkeysize": "19",
      "scriptpubkey": "76a914c1d3ab2c1c8c9f6b838c9bf25afe1454fbac22fe88ac"
    }
  ],
  "witness": [
    {
      "stackitems": "02",
      "0": { "size": "47", "item": "304402201de904...5966b4f401" },
      "1": { "size": "21", "item": "029d66a6d4...ca5e2e530" }
    }
  ],
  "locktime": "00000000"
}

Transação: bcf91802a2aaa7de085759488b187fadf87a448f4f24f92cb38bb03285e2d8f9

Esta transação tem 1 entrada contendo a seguinte referência:

O VOUT nas transações brutas é um campo de 4 bytes em little-endian. Então, se convertermos 03000000 para big-endian, obtemos 00000003.

Então esta transação está selecionando a saída 3 (a quarta saída) da transação f94cd7bd7d8b183c7974d097660f574c30d92061dcea51448eb704895e204493 para gasto. Se você conferir essa saída específica, verá que ela tem um valor de 109243 satoshis.

Coinbase

Qual é o VOUT de uma transação coinbase?

A entrada de uma transação coinbase não referencia nenhuma saída existente, então o VOUT é simplesmente definido com o valor máximo de 0xFFFFFFFF (4294967295):

01000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0704b3936a1a017cffffffff01403d522a01000000434104563053b8900762f3d3e8725012d617d177e3c4af3275c3265a1908b434e0df91ec75603d0d8955ef040e5f68d5c36989efe21a59f4ef94a5cc95c99794a84492ac00000000
{
  "version": "01000000",
  "inputcount": "01",
  "inputs": [
    {
      "txid": "0000000000000000000000000000000000000000000000000000000000000000",
      "vout": "ffffffff",
      "scriptsigsize": "07",
      "scriptsig": "04b3936a1a017c",
      "sequence": "ffffffff"
    }
  ],
  "outputcount": "01",
  "outputs": [
    {
      "amount": "403d522a01000000",
      "scriptpubkeysize": "43",
      "scriptpubkey": "4104563053b8...794a84492ac"
    }
  ],
  "locktime": "00000000"
}

Transação: 5b75086dafeede555fc8f9a810d8b10df57c46f9f176ccc3dd8d2fa20edd685b

Terminologia

Por que se chama VOUT?

O termo VOUT é abreviação de vector output (vetor de saída).

Um "vetor" é apenas outro nome para uma lista ou um array de itens. O Satoshi programou o Bitcoin em C++, e arrays de tamanho dinâmico nessa linguagem são chamados de "vectors".

std::vector é um container de sequência que encapsula arrays de tamanho dinâmico.
cppreference.com

Então é daí que vem o "v" em "vout":

A base de código original do Satoshi usava um estilo de programação chamado "notação húngara", em que os nomes de variáveis são prefixados com letras que indicam o tipo de dado que contêm. O v, em particular, significa "vector". Então vin e vout significam "in vector" e "out vector", e eram (e são) os nomes das variáveis para as entradas e saídas de uma transação.
Pieter Wuille, bitcoin.stackexchange.com

Você pode ver o uso do termo "vout" por toda a versão original do bitcoin criada pelo Satoshi. Então o nome de variável "vout" se origina do estilo de programação do Satoshi, e é um termo que ainda usamos hoje para nos referir a saídas específicas de uma transação.

As entradas de uma transação também são às vezes chamadas de "vin"s.

Comandos

Onde você vê "vin" e "vout"?

Você verá os termos "vout" e "vin" com mais frequência ao olhar transações brutas na linha de comando do Bitcoin Core:

bitcoin-cli getrawtransaction [txid]

Obtém os dados brutos de uma transação pelo TXID.

$ bitcoin-cli getrawtransaction bcf91802a2aaa7de085759488b187fadf87a448f4f24f92cb38bb03285e2d8f9 1

{
  "txid": "bcf91802a2aaa7de085759488b187fadf87a448f4f24f92cb38bb03285e2d8f9",
  "hash": "53fa67b27d94a10e9c4142eb5488292c88c7593aa6821fde73bde33cc17287c8",
  "version": 1,
  "size": 251,
  "vsize": 170,
  "weight": 677,
  "locktime": 0,
  "vin": [
    {
      "txid": "f94cd7bd7d8b183c7974d097660f574c30d92061dcea51448eb704895e204493",
      "vout": 3,
      "scriptSig": {
        "asm": "0014ceb587f907d67075247ddf52fb343625fd8f5a3b",
        "hex": "160014ceb587f907d67075247ddf52fb343625fd8f5a3b"
      },
      "txinwitness": [
        "304402201de904432601e724f281f97d68448cbf0610a91f32700ab5e82b88ef7ae08645022002ff2aa61254c401332648d43144887b3671b6a1ae95b11fd51dcfbd5966b4f401",
        "029d66a6d49a1f936dc74ba588a1b693a62851159ddab4a7b3915c3ffca5e2e530"
      ],
      "sequence": 4294967295
    }
  ],
  "vout": [
    {
      "value": 0.00028300,
      "n": 0,
      "scriptPubKey": {
        "asm": "OP_DUP OP_HASH160 9e17484e1be011be7587d4f678df1123080fb5bc OP_EQUALVERIFY OP_CHECKSIG",
        "hex": "76a9149e17484e1be011be7587d4f678df1123080fb5bc88ac",
        "address": "1FQuf16UEMg91iN39gtXq4rLnn3nrRYxd8",
        "type": "pubkeyhash"
      }
    },
    {
      "value": 0.00079861,
      "n": 1,
      "scriptPubKey": {
        "asm": "OP_DUP OP_HASH160 c1d3ab2c1c8c9f6b838c9bf25afe1454fbac22fe OP_EQUALVERIFY OP_CHECKSIG",
        "hex": "76a914c1d3ab2c1c8c9f6b838c9bf25afe1454fbac22fe88ac",
        "address": "1Jfrz24gk3pHCQq1JJeDUzCRzEHNXxXiNE",
        "type": "pubkeyhash"
      }
    }
  ],
  "hex": "010000000001019344205e8904b78e4451eadc6120d9304c570f6697d074793c188b7dbdd74cf90300000017160014ceb587f907d67075247ddf52fb343625fd8f5a3bffffffff028c6e0000000000001976a9149e17484e1be011be7587d4f678df1123080fb5bc88acf5370100000000001976a914c1d3ab2c1c8c9f6b838c9bf25afe1454fbac22fe88ac0247304402201de904432601e724f281f97d68448cbf0610a91f32700ab5e82b88ef7ae08645022002ff2aa61254c401332648d43144887b3671b6a1ae95b11fd51dcfbd5966b4f40121029d66a6d49a1f936dc74ba588a1b693a62851159ddab4a7b3915c3ffca5e2e53000000000",
  "blockhash": "00000000000000000008b02ce7917dc696fee8175e4f97fe4fe5edd2f7356de1",
  "confirmations": 94154,
  "time": 1631338350,
  "blocktime": 1631338350
}

Adicionar 1 ou true ao final do comando permite ver os dados brutos da transação em formato JSON.

Você notará que o termo "vout" também é usado para se referir à lista inteira de saídas de uma transação; mas, no contexto de selecionar entradas, o "vout" se refere ao número de índice de uma saída.

Para ser justo, seria mais amigável chamá-los apenas de "entradas" e "saídas" em vez de "vin"s e "vout"s, mas é mais curto e mais legal assim — e você acaba se acostumando de qualquer forma. Bem-vindo ao mundo da programação.

Recursos