En getrawtransaction, ¿cuál es el entero vout en la lista vin?

Estoy trabajando en rastrear las transacciones de bitcoin que ingresan a través de getrawtransaction.

No he podido encontrar la documentación necesaria para describir el entero vout en la matriz vin:

{"txid"=>"0fbf9a6f2172251611a58028bf596c3ace98b19f6f08d2b6581326c58aecda8e",
    "vout"=>0,     <----- THIS
    "scriptSig"=>
     {"asm"=>
       "3045022100a9ba4f0b8ff86e91e622f43f9b76944643a807c0f6c8b43490087a169fe7542f0220258eaa36c96faaaeb41052e8d4aa41f74950df1b1c2835cb677f201c1ee0a33901 0393a2770ce81ddd9cd1e6ef71a282261ef8c03648373db209078f7850b9ab1ad1",
      "hex"=>
       "483045022100a9ba4f0b8ff86e91e622f43f9b76944643a807c0f6c8b43490087a169fe7542f0220258eaa36c96faaaeb41052e8d4aa41f74950df1b1c2835cb677f201c1ee0a33901210393a2770ce81ddd9cd1e6ef71a282261ef8c03648373db209078f7850b9ab1ad1"},
    "sequence"=>4294967295},
{"txid"=>"4983504e9727a5ea73c4a0915da475faba248d0d8da265e2d270563dc3eabbaf",
    "vout"=>1,     <----- THIS
    "scriptSig"=>
     {"asm"=>
       "3045022100ccc460cb0b8777d14f27acb821eacae0b5316de19db03ea707c59364f098d44f0220058a4f9df9a917944299b4c52efe500d50ab28c2fd29bb7b9ff8b75f38abcd4201 03244951ad9d146a635b321816d953e54986c62ce9c92502873335531dada0156c",
      "hex"=>
       "483045022100ccc460cb0b8777d14f27acb821eacae0b5316de19db03ea707c59364f098d44f0220058a4f9df9a917944299b4c52efe500d50ab28c2fd29bb7b9ff8b75f38abcd42012103244951ad9d146a635b321816d953e54986c62ce9c92502873335531dada0156c"},
    "sequence"=>4294967295}

En las transacciones que veo, tiende a salir 0 1 0 1 0 1 en la matriz. ¿Qué representa esto en una transacción? ¿Necesito interpretarlo de una manera específica? ¡Gracias!

Respuestas (5)

La entrada de cada transacción se refiere a la salida de una transacción anterior.

Una entrada no se puede definir solo por el hash de la transacción. Una transacción consta de 1 o más salidas si solo especifica el hash de la transacción, no hay forma de saber qué salida se está gastando.**

Dado que este tipo de preguntas a menudo provienen de un malentendido más grande de cómo "realmente funciona" la red, voy a comenzar con algunas reglas "sencillas" sobre transacciones (tx):

1. A tx consists of one or more inputs and one or more outputs.
2. All tx inputs refer to an unspent output of a prior transaction.
3. The full value of an input is always spent; a tx can not spend part of the value.
4. Likewise all outputs are either spent or unspent, they can't be partially spent.
5. A tx "spends" the outputs which are referenced in the input portion of the tx.
6. A tx creates new spendable "unspent outputs" listed in the output portion of the tx.

Ahora que lo eliminamos, para definir una entrada tx, debe consultar el hash de una transacción anterior Y el índice de salida . El hash tx identifica la transacción, pero la transacción puede tener más de una salida, por lo que el índice se usa para identificar qué salida se "gasta" aquí.

Esto puede parecer confuso porque escuchará declaraciones como "Tengo 20 BTC almacenados en la dirección 1XYZ..." o "Mi billetera tenía 100 BTC", pero esto es realmente una abstracción. El cliente simplemente le muestra la suma de todas las salidas no gastadas para una dirección o la billetera completa.

La red Bitcoin funciona sobre el concepto de entradas y salidas.

La red Bitcoin no considera el "valor" como una dirección al validar txs. Al validar un tx, las salidas se consideran entidades independientes. Gastar una salida para una dirección en particular no tiene efecto en las otras salidas (si las hay) para esa dirección. Una transacción es válida (entre otras cosas) si todas las entradas se refieren a salidas válidas no gastadas de transacciones anteriores (no se pueden gastar monedas dos veces), la suma de las salidas es menor o igual a la suma de las entradas (no se pueden monedas nuevas falsificadas), y las entradas están firmadas por la clave privada correcta (solo el "propietario" de la clave privada puede gastar las monedas).

Ejemplos

Para evitar muchos detalles excesivos, veremos una versión simplificada de las transacciones utilizadas en la red de Bitcoin.

Digamos que existe una transacción anterior (tx hash 1234567890). En esta transacción, tiene una entrada que hace referencia a una salida no gastada de una transacción anterior por valor de 100 BTC. Envía 50 BTC a una dirección, 10 BTC a otra dirección y el cambio (40 BTC) se envía a una nueva dirección en su billetera. Recuerde que no podemos gastar parte de una salida no gastada, por lo que el cambio es necesario porque estamos gastando una entrada de 100 BTC pero solo necesitamos "enviar" 60 BTC.

La pseudotransacción simplificada puede parecerse a esto.

In[0] <lets ignore the input for now but it does have a value of 100 BTC>
Out[0] Bitcoin address=1ABC... Value=50 BTC
Out[1] Bitcoin address=1DEF... Value=10 BTC
Out[2] Bitcoin address=1XYZ... Value=40 BTC

El tx tiene 1 entrada, 3 salidas, todos los índices de entrada/salida están basados ​​en cero y el valor de las salidas es igual al valor de la entrada. Si la(s) salida(s) es menor que la(s) entrada(s), entonces la diferencia es la tarifa pagada al minero. Si las salidas son más que las entradas, entonces el tx no es válido.

Ahora, dado que la dirección de "cambio" es 1XYZ, es otra dirección en nuestra billetera, podemos usarla en nuevas transacciones. Pagaremos a un comerciante 1 BTC y le daremos al minero una tarifa de 0.01 por la inclusión rápida en un bloque. El cambio se enviará a otra nueva dirección en la billetera (1ZZZ....). La transacción resultante puede verse así:

In[0]  Tx hash=1234567890 OutputIndex=2
Out[0] Bitcoin Address=1HIJ... Value=1 BTC
Out[1] Bitcoin Address=1ZZZ... Value=38.99 BTC

La entrada se refiere a la tercera salida (matriz base 0) del tx anterior. Buscando el índice de salida 2 de tx 123456789 podemos ver que el valor es 40.00 BTC. La suma de las salidas es 39,99, lo que significa que el minero del bloque recolectará 0,01 BTC.

Los tx reales se desvían de la versión simplificada que se muestra arriba

Tenga en cuenta que esto no es realmente importante a menos que desee profundizar en el funcionamiento del protocolo. El resultado de las transacciones de Bitcoin son en realidad scripts en lugar de direcciones y valores estáticos que se muestran arriba. Funcionalmente para la mayoría de las salidas funcionan igual, aunque para ahorrar espacio se utiliza el hash de la clave pública y no la dirección en la salida. Todos los bloques tienen un tx requerido llamado base de monedas que no tiene entrada porque la salida es el subsidio del bloque y las tarifas pagadas a los mineros. Todos los valores en la red de Bitcoin son números enteros en Satoshis (1E-8 BTC), por lo que técnicamente todos los números en esta publicación se multiplicarían por 1E8.

Una sola transacción de Bitcoin puede tener muchos resultados. El campo vout le permite especificar qué salida desea gastar.

Mira esta transacción . Suponga que tiene la clave 1EZ5, pero no la clave 199N. Debe aclarar a la red Bitcoin qué salida desea gastar.

No estoy seguro de entender. ¿Por qué no querría gastar una salida incluida en la transacción? ¿Podría proporcionar un ejemplo para demostrar? ¡Gracias!
No es que no quieras gastar la salida, es que no tienes la clave.
Una explicación rápida y directa para aquellos que ya conocen los conceptos básicos del protocolo (en contraste con la respuesta de @DeathAndTaxes). ¡Gracias!

En resumen, vout se refiere al índice de la dirección de salida en cuestión. El índice comienza desde 0. Entonces, por ejemplo, si un tx tiene 10 direcciones de salida, las salidas para las direcciones serían de 0 a 9.

En vin list vout te permite especificar qué salida quieres gastar a quién. Cada vout tiene su propio tx_id. y la suma de los valores de este vout es igual al total de BTC que tenemos para la transacción; Y si

si vout < vin , entonces la diferencia de estos montos debe pagarse al menor.

de lo contrario, vout > vin , entonces tx_id no es válido.

En pocas palabras, vout podría considerarse como un identificador de la salida dentro de una transacción anterior.

tenga en cuenta que la entrada que desea incluir en su transacción son las salidas de una transacción anterior, por lo que vuelve a la transacción recibida y elige qué salida incluir como entrada en su nueva transacción. Sin embargo, si no le importa, el cliente bitcoin lo hará en su lugar.