VOUT
O número de índice de uma saída de 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.
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:
- 4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b:0 — A saída de 50 BTC da transação gênese.
- a1075db55d416d3ca199f55b6084e2115b9345e16c5cf302fc80e9d5fbf5d48d:0 — A saída de 10.000 BTC da transação da pizza.
- 3fbc296deb570c1c4f9b067644233e10a7b3435b49df6069bfb3e21d8e400b7a:964 — Uma saída aleatória de uma transação com 976 saídas.
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:
- TXID:
9344205e8904b78e4451eadc6120d9304c570f6697d074793c188b7dbdd74cf9 - VOUT:
03000000
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.
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. Ov, em particular, significa "vector". Entãovinevoutsignificam "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.
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.