Transacción

De Bitcoin Wiki
Saltar a: navegación, buscar
Mapa de bytes de las transacciones con cada tipo de entrada y salida TxIn y TxOut

Una transacción es una sección de datos con firma digital que se transmite a la red y se almacena en los bloques. Este conjunto de datos incluye una referencia a una transacción anterior e indica una cantidad de bitcoins que pasan a estar disponibles para una dirección Bitcoin de destino. Al igual que el resto de datos que se almacenan en la cadena de bloques, la información no está cifrada.

Un explorador de la cadena de bloques es un sitio web en el que se pueden visualizar todas las transacciones incluidas en los bloques. Esto resulta muy útil para ver los detalles técnicos de la transacción y para poder verificar los pagos.

Ejemplo de transacción Bitcoin

Datos

Input:
Previous tx: f5d8ee39a430901c91a5917b9f2dc19d6d1a0e9cea205b009ca73dd04470b9a6
Index: 0
scriptSig: 304502206e21798a42fae0e854281abd38bacd1aeed3ee3738d9e1446618c4571d10
90db022100e2ac980643b0b82c0e88ffdfec6b64e3e6ba35e7ba5fdd7d5d6cc8d25c6b241501

Output:
Value: 5000000000
scriptPubKey: OP_DUP OP_HASH160 404371705fa9bd789a2fcd52d2c580b65d35549d
OP_EQUALVERIFY OP_CHECKSIG

Explicación

La entrada (input) de esta transacción transfiere 50 BTC desde la salida (output) #0 de la transacción f5d8... La salida de esta transacción asigna esos 50 BTC a una dirección Bitcoin (expresada aquí en notación hexadecimal 4043... en lugar del formato base58 habitual). Cuando el receptor quiera gastar esos bitcoins, tendrá que utilizar la salida #0 de esta transacció como entrada de una nueva transacción.

Entrada

Una entrada (input) es una referencia a una salida de otra transacción existente. Cada transacción puede tener múltiples entradas, sumándose los valores de cada salida. El valor total de las entradas es la suma máxima disponible para las salidas. El valor Previous tx es un hash de una transacción anterior. Index es el índice de la salida concreta en la transacción de origen. ScriptSig es la primera parte de un script, que se explica más adelante.

El script consta de dos componentes: una firma y una clave pública. La clave pública pertenece al propietario de la transacción de origen cuya salida se utiliza como entrada y demuestra que el creador de la transacción está autorizado para gastar la suma de esas salidas de la transacción previa. El otro componente es una firma digital ECDSA (algoritmo de firma digital con curvas elípticas) aplicada a un hash de una versión simplificada de la transacción. Esa firma digital basada en criptografía asimétrica de curvas elípticas, junto a la clave pública, permite verificar que la transacción ha sido generada por el auténtico propietario de la dirección en cuestión (en definitiva, cualquiera que tenga la clave privada con la que se generaron la clave pública y la dirección Bitcoin). Hay además varios parámetros que definen cómo simplificar la transacción y que permiten crear diferentes tipos de pago.

Salida

Una salida (output) contiene las instrucciones para enviar la suma de bitcoins. Value es el número de satoshis (1 BTC = 100 000 000 satoshis) que la salida pone a disposición del destinatario. ScriptPubKey es la segunda mitad de un script (explicado más adelante). Puede haber más de una salida, de modo que todas ellas se reparten el valor combinado de las entradas. Debido a que una salida solamente puede conectarse a una entrada única, todo el valor neto de las entradas tendrá que enviarse a través de alguna salida si no se desea perderlo. Si, por ejmplo, la entrada es de 50 BTC, pero solamente se desean enviar 25 BTC, se tendrán que crear dos salidas con valor de 25 BTC: uno para el destinatario y otro que vuelva a una dirección del pagador (a estas cantidades que se envían a uno mismo se las denomina "el cambio"). La diferencia que pueda haber entre la suma de bitcoins de las entradas y las salidas se considerará una comisión de transacción y se asignará a la direcciñón en la que se genere el bloque que registra la transacción.

A envía 100 BTC a C y C genera 50 BTC. C envía 101 BTC a D, y necesita enviarse a sí mismo el cambio. D envía los 101 BTC a otra persona, que aún no los ha gastado (no sale ninguna flecha de su output). Solamente la salida de D (101 BTC) y el cambio que volvió a C (49 BTC) son cantidades disponibles para gastar.
Verificación

Para verificar que las entradas tienen autorización para disponer de los valores de las salidas a las que se hace referencia, Bitcoin utiliza un lenguaje de script similar a Forth. El valor scriptSig de la entrada y la referencia scriptPubKey de la salida se evalúan (en ese orden), de modo que scriptPubKey utiliza los valores que deja scriptSig en la pila. La entrada se autoriza si scriptPubKey retorna un valor true. Mediante este sistema de script, el remitente puede crear condiciones sumamente complejas para que se pueda acceder a las cantidades de salida. Por ejemplo, es posible crear una salida que pueda ser gastada por cualquiera sin ningún tipo de autorización. También es posible exigir que una entrada esté firmada por un número arbitrario de claves o que haya que introducir una contraseña en lugar de firmar con una clave privada.

Tipos de transacción

Bitcoin actualmente solo crea tres pares diferentes scriptSig/scriptPubKey, que se describen a continuación.

Se pueden diseñar variantes más complejas de transacciones y combinarlas como acuerdos criptográficamente garantizados, a los que se denomina contratos.

Transferencia a una dirección IP

scriptPubKey: <pubKey> OP_CHECKSIG
scriptSig: <sig>

El remitente obtiene la clave pública al comunicarse con el receptor por IP. Al gastar monedas enviadas a una dirección IP, el receptor solamente presenta una firma, que se coteja con la clave pública de scriptPubKey.

Proceso de comprobación:

Pila Script Descripción
Vacío. <sig> <pubKey> OP_CHECKSIG Se combinan scriptSig y scriptPubKey.
<sig> <pubKey> OP_CHECKSIG Se añaden constantes a la pila.
true Vacío. Se comprueba la firma de los dos elementos superiores de la pila.

Transferencia a una dirección Bitcoin

scriptPubKey: OP_DUP OP_HASH160 <pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG
scriptSig: <sig> <pubKey>

Una dirección Bitcoin es simplemente un valor hash, por lo que el remitente no puede proporcionar una clave pública completa en scriptPubKey. Cuando se gastan bitcoins que han sido recibidos previamente en una dirección Bitcoin, el remitente proporciona tanto la firma como la clave pública. El script verifica que la clave pública proporcionada tiene el mismo valor hash que el que aparece en scriptPubKey, y comprueba también la firma con la clave pública.

Proceso de comprobación:

Pila Script Descripción
Vacío. <sig> <pubKey> OP_DUP OP_HASH160 <pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG Se combinan scriptSig y scriptPubKey.
<sig> <pubKey> OP_DUP OP_HASH160 <pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG Se añaden constantes a la pila.
<sig> <pubKey> <pubKey> OP_HASH160 <pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG Se duplica el elemento superior de la pila.
<sig> <pubKey> <pubHashA> <pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG Se obtiene el hash del elemento superior de la pila.
<sig> <pubKey> <pubHashA> <pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG Se añade constante.
<sig> <pubKey> OP_CHECKSIG Se comprueba la igualdad entre los dos elementos superiores de la pila.
true Vacío. Se comprueba la firma en los dos elementos superiores de la pila.

Generación

En la generación de nuevos bitcoins como resultado del proceso de minado de un nuevo bloque se crea un tipo de transacción especial que consta de una sola entrada y esta entrada tiene un parámetro "coinbase" en lugar de un scriptSig. Los datos de "coinbase" pueden ser cualquier cosa, ya que no se usa. El programa cliente original de Bitcoin pone ahí el objetivo actual en formato compacto y el número de precisión arbitraria "extraNonce", que se incrementa cada vez que se sale de rango el campo Nonce del encabezado de bloque. Las salidas pueden ser también cualquier cosa a efectos del protocolo de red, pero Bitcoin crea una exactamente igual que las de las transacciones IP.

Véase también