Mastering Bitcoin
7. Transacciones » Estructura de una Transacción » Añadiendo Comisiones a Transacciones
Página 44 de 98
Estructura de una Transacción
Una transacción es una estructura de datos que codifica una transferencia de valor de una fuente de fondos, llamada entrada (input), a un destinatario, llamado una salida (output). Las entradas y salidas de una transacción no se encuentran relacionadas a cuentas ni identidades. En cambio debes pensar en ellas como montos de bitcoin —trozos de bitcoin— asegurados con un secreto específico que solo su dueño, o persona que conoce el secreto, puede liberar. Una transacción contiene un número de campos, como se detalla en La estructura de una transacción.
Tabla 1. La estructura de una transacción

Tiempo de Bloqueo de una Transacción
El tiempo de bloqueo (Locktime), también conocido como nLockTime por el nombre de variable utilizado para en el cliente de referencia, define el tiempo más cercano en que una transacción será válida y puede ser transmitida a la red e incluida en la cadena de bloques. En la mayoría de las transacciones su valor se establece en cero para indicar propagación y ejecución inmediatos.
Si el tiempo de bloqueo no es cero y por debajo de 500 millones, se interpreta como una altura de bloque, lo cual significa que la transacción no es válida y no es transmitida ni incluida en la cadena de bloques antes de alcanzar la altura de bloque especificada. Si se encuentra por encima de los 500 millones es interpretada como un sello de tiempo Unix Epoch (segundos transcurridos desde el 1 de enero de 1970) y la transacción no se considera válida antes del tiempo especificado. Las transacciones con tiempo de bloqueo referenciando un tiempo o bloque futuros deben ser conservadas por el sistema originario y transmitidas a la red bitcoin únicamente luego de volverse válidas. El uso del tiempo de bloqueo es equivalente a fechar en el futuro un cheque en papel.
Entradas y Salidas de una Transacción
La pieza fundamental de una transacción bitcoin es una salida de transacción no gastada (unspent transaction output), o UTXO. Las UTXO son trozos indivisibles de moneda bitcoin atados a un propietario específico, registrados en la cadena de bloques y reconocido como unidades de moneda por toda la red. La red bitcoin monitoriza todas las UTXO, actualmente estimadas en millones. Cuando un usuario recibe bitcoins, ese monto es registrado en la cadena de bloques como una UTXO. Por lo tanto, los bitcoins de un usuario pueden estar dispersados como UTXOs entre cientos de transacciones y cientos de bloques. De hecho, no existe tal cosa como un saldo almacenado de una dirección bitcoin o una cuenta; tan solo hay UTXOs dispersados, asignados a propietarios específicos. El concepto de saldo de bitcoins de un usuario es una construcción creada por la aplicación de cartera. La cartera calcula el saldo del usuario escaneando la cadena de bloques y sumando todos los UTXOs pertenecientes a ese usuario.
No existe cuentas o saldos en bitcoin; solo salidas de transacciones sin gastar (UTXO) dispersados en la cadena de bloques.
Una UTXO puede tener un valor arbitrario denominado como un múltiplo de satoshis. Tal como los dólares pueden ser divididos hasta dos cifras decimales en centavos, los bitcoins pueden ser divididos hasta ocho cifras decimales en satoshis. Aunque una UTXO puede ser de cualquier valor arbitrario, una vez creada es indivisible tal como una moneda que no puede ser partida a la mitad. Si una UTXO es mayor que el valor deseado de la transacción, aún debe ser consumida por completo y debe generarse cambio en la transacción. En otras palabras, si tienes una UTXO de 20 bitcoins y quieres pagar 1 bitcoin, tu transacción debe consumir la UTXO de 20 bitcoins entera y producir dos salidas: una pagando 1 bitcoin al destinatario deseado y otra pagando 19 bitcoins de cambio de regreso a tu cartera.
Como resultado la mayoría de las transacciones bitcoins generarán cambio.
Imagina una consumidora comprando una bebida de $1,50, abriendo su cartera para buscar una combinación de monedas y billetes que cubran el costo de $1,50. La consumidora elegirá el cambio exacto de estar disponible (un billete de un dólar y dos monedas de 25 centavos), o una combinación de denominaciones menores (seis monedas de 25 centavos), o, de ser necesario, una unidad mayor como un billete de cinco dólares. Si paga al vendedor con un valor mayor, digamos $5, ella esperaría recibir $3,50 de cambio, los cuales regresarán a su cartera y los tendrá disponibles para futuras transacciones.
De forma similar, una transacción bitcoin debe ser creada a partir de las UTXOs del usuario en cualquier combinación de denominaciones que el usuario tenga disponible. Los usuarios no pueden partir una UTXO a la mitad de la misma forma que un billete de un dólar no puede ser cortado a la mitad y aún ser usado como moneda. La aplicación de cartera del usuario usualmente seleccionará de entre las UTXOs del usuario varias unidades para componer un monto mayor o igual al de la transacción deseada.
Al igual que en la vida real, una aplicación bitcoin puede usar varias estrategias para satisfacer el monto de la compra: combinar varias unidades más pequeñas, encontrar el cambio exacto, o usar una única unidad mayor al valor de la transacción y generar cambio. Todo este complejo montaje de UTXOs es calculado por la cartera del usuario automáticamente y es invisible al usuario. Solo es relevante si estás construyendo transacciones en crudo a partir de UTXOs escribiendo código de programación.
Las UTXOs consumidas por una transacción se llaman entradas de transacción (inputs), y las UTXOs creadas por la transacción se llaman salidas de transacción (outputs). De esta forma, trozos de valor en bitcoin son movidos de un dueño al siguiente en una cadena de transacciones consumiendo y generando UTXOs. Las transacciones consumen UTXOs al liberarlas con la firma del propietario corriente y crean UTXOs al asignarlas a la dirección bitcoin del nuevo propietario.
La excepción en la cadena de salidas y entradas es un tipo especial de transacción llamada transacción coinbase, la cual es la primera transacción en cada bloque. Esta transacción es colocada allí por el minero «ganador» y crea nuevos bitcoins asignados a dicho minero como recompensa por el minado.
Así es como la masa monetaria de bitcoin es creada durante el proceso de minado, como veremos en el capítulo 10.
¿Qué estuvo primero? ¿Entradas o salidas, el huevo o la gallina? Hablando en sentido estricto, las salidas están primero porque las transacciones coinbase, las cuales generan nuevos bitcoins, no poseen entradas y generan salidas de la nada.
Salidas de Transacción
Toda transacción bitcoin crea salidas, las cuales son registradas en el libro de transacciones bitcoin. Casi todas estas salidas, con una excepción (ver Salida de Datos (OP_RETURN)) crean trozos de bitcoin gastables llamados salidas de transacción sin gastar (unspent transaction outputs) o UTXO, las cuales son reconocidas por toda la red y están disponibles para que el propietario las gaste en transacciones futuras. Enviar bitcoins a alguien significa crear una salida de transacción sin gastar (UTXO) registrada con su dirección y disponible para ser gastadas.
Las UTXOs son monitorizadas por todos los nodos completos de bitcoin como un set de datos conocido como la set UTXO o reserva UTXO, mantenido en una base de datos. Las nuevas transacciones consumen (gastan) una o más de estas salidas del set UTXO.
Las salidas de una transacción consisten en dos partes:
Una cantidad de bitcoins denominada en
satoshis
, la unidad más pequeña de bitcoin.
Un
script de bloqueo
(
locking
script), también conocido como una «obstrucción» que «bloquea» este monto especificando las condiciones que deben ser cumplidas para gastar esta salida El lenguaje de
scripting
de transacciones, usado por el script de bloqueo mencionado anteriormente, es analizado en detalle en Scripts de Transacción y Lenguaje de Script. La estructura de una salida de transacción muestra la estructura de una salida de transacción.
Tabla 2. La estructura de una salida de transacción

En Un script que llama a la API de blockchain.info para encontrar la UTXO relacionada a una dirección usamos la API de blockchain.info para encontrar las salidas sin gastar (UTXO) de una dirección específica.
Ejemplo 1. Un script que llama a la API de para encontrar la UTXO relacionada a una dirección
# get unspent outputs from blockchain API
import json
import requests
# example address
address = '1Dorian4RoXcnBv9hnQ4Y2C1an6NJ4UrjX'
# The API URL is https://blockchain.info/unspent?active=<address>
# It returns a JSON object with a list "unspent_outputs", containing UTXO, like this:
#{ "unspent_outputs":[
# {
# "tx_hash":"ebadfaa92f1fd29e2fe296eda702c48bd11ffd52313e986e99ddad9084062167",
# "tx_index":51919767,
# "tx_output_n": 1,
# "script":"76a9148c7e252f8d64b0b6e313985915110fcfefcf4a2d88ac",
# "value": 8000000,
# "value_hex": "7a1200",
# "confirmations":28691
# },
# …
#]}
resp = requests.get('https://blockchain.info/unspent?active=%s' % address) utxo_set = json.loads(resp.text)["unspent_outputs"]
for utxo in utxo_set:
print "%s:%d - %ld Satoshis" % (utxo['tx_hash'], utxo['tx_output_n'], utxo['value'])
Al ejecutar el script vemos una lista de IDs de transacciones, un carácter de dos puntos, el número de índice de la salida de transacción sin gastar (UTXO) específica, y el valor de esa UTXO en satoshis. El script de bloqueo no es mostrado en la salida del siguiente ejemplo:
Ejemplo 2. Ejecutando el script get-utxo.py.
$ python get-utxo.py
ebadfaa92f1fd29e2fe296eda702c48bd11ffd52313e986e99ddad9084062167:1 - 8000000 Satoshis 6596fd070679de96e405d52b51b8e1d644029108ec4cbfe451454486796a1ecf:0 - 16050000
Satoshis
74d788804e2aae10891d72753d1520da1206e6f4f20481cc1555b7f2cb44aca0:0 - 5000000 Satoshis b2affea89ff82557c60d635a2a3137b8f88f12ecec85082f7d0a1f82ee203ac4:0 - 10000000
Satoshis
…
Condiciones de gasto (obstrucciones)
Las salidas de transacción asocian un monto específico (en satoshis) con una obstrucción específica o script de bloqueo que define la condición que debe ser cumplida para gastar ese monto. En la mayoría de los casos el script de bloqueo asignará la salida a una dirección bitcoin específica, de esa forma transfiriendo la propiedad de ese monto a su nuevo dueño. Cuando Alice paga al Café de Bob por su taza de café, su transacción crea una salida de 0,015 bitcoins obstruida o asignada a la dirección bitcoin del café. Esa salida de 0,015 bitcoins fue registrada en la cadena de bloques y se convirtió en parte del grupo de Salidas de Transacción Sin Gastar (UTXO), lo que significa que se mostrará en la cartera de Bob como parte de su saldo disponible. Cuando Bob decide gastar ese monto, su transacción liberará la obstrucción, destrabando la salida al proveer un script de desbloqueo que contenga la firma proveniente de la clave privada de Bob.
Entradas de Transacción
En términos simples, las entradas de transacción son punteros a UTXOs. Apuntan a una UTXO específica referenciando el hash de transacción y número de secuencia donde la UTXO se encuentra registrada en la cadena de bloques. Para gastar una UTXO, una entrada de transacción también incluye scripts de desbloqueo que satisfacen las condiciones de gasto establecidas por la UTXO. El script de desbloqueo es generalmente una firma la cual prueba la pertenencia de la dirección bitcoin que se encuentra en el script de bloqueo.
Cuando los usuarios hacen un pago sus carteras construyen una transacción seleccionando de sus UTXOs disponibles. Por ejemplo, para realizar un pago de 0,015 bitcoins, la aplicación de cartera puede seleccionar una UTXO de 0,01 y otra de 0,005, usando ambas para sumar el monto de pago deseado.
En Un script para calcular cuántos bitcoins serán emitidos en total vemos el uso de un algoritmo «codicioso» para seleccionar de entre los UTXOs disponibles para llegar al monto de un pago específico.
En este ejemplo las UTXOs disponibles son provistas como una cadena de constantes, pero en la realidad las UTXOs disponibles serían pedidas con una llamada a RPC a Bitcoin Core o una API de terceros como se muestra en Un script que llama a la API de blockchain.info para encontrar la UTXO relacionada a una dirección.
Ejemplo 3. Un script para calcular cuántos bitcoins serán emitidos en total
# Selects outputs from a UTXO list using a greedy algorithm.
from sys import argv
class OutputInfo:
def __init__(self, tx_hash, tx_index, value):
self.tx_hash = tx_hash
self.tx_index = tx_index
self.value = value
def __repr__(self):
return "<%s:%s with %s Satoshis>" % (self.tx_hash, self.tx_index, self.value)
# Select optimal outputs for a send from unspent outputs list.
# Returns output list and remaining change to be sent to
# a change address.
def select_outputs_greedy(unspent, min_value):
# Fail if empty.
if not unspent:
return None
# Partition into 2 lists.
lessers = [utxo for utxo in unspent if utxo.value < min_value]
greaters = [utxo for utxo in unspent if utxo.value >= min_value]
key_func = lambda utxo: utxo.value
if greaters:
# Not-empty. Find the smallest greater.
min_greater = min(greaters)
change = min_greater.value - min_value
return [min_greater], change
# Not found in greaters. Try several lessers instead.
# Rearrange them from biggest to smallest. We want to use the least
# amount of inputs as possible.
lessers.sort(key=key_func, reverse=True)
result = []
accum = 0
for utxo in lessers:
result.append(utxo)
accum += utxo.value
if accum >= min_value:
change = accum - min_value
return result, "Change: %d Satoshis" % change
# No results found.
return None, 0
def main():
unspent = [
OutputInfo("ebadfaa92f1fd29e2fe296eda702c48bd11ffd52313e986e99ddad9084062167", 1, 8000000),
OutputInfo("6596fd070679de96e405d52b51b8e1d644029108ec4cbfe451454486796a1ecf", 0, 16050000),
OutputInfo("b2affea89ff82557c60d635a2a3137b8f88f12ecec85082f7d0a1f82ee203ac4", 0, 10000000),
OutputInfo("7dbc497969c7475e45d952c4a872e213fb15d45e5cd3473c386a71a1b0c136a1", 0, 25000000),
OutputInfo("55ea01bd7e9afd3d3ab9790199e777d62a0709cf0725e80a7350fdb22d7b8ec6", 17, 5470541),
OutputInfo("12b6a7934c1df821945ee9ee3b3326d07ca7a65fd6416ea44ce8c3db0c078c64", 0, 10000000),
OutputInfo("7f42eda67921ee92eae5f79bd37c68c9cb859b899ce70dba68c48338857b7818", 0, 16100000),
]
if len(argv) > 1:
target = long(argv[1])
else:
target = 55000000
print "For transaction amount %d Satoshis (%f bitcoin) use: " % (target, target/10.0**8)
print select_outputs_greedy(unspent, target)
if __name__ == "__main__":
main()
Si ejecutamos el script select-utxo.py sin un parámetro intentará construir un juego de UTXOs (y cambio) para un pago de 55.000.000 satoshis (0,55 bitcoins). Si proveemos un pago objetivo como parámetro el script seleccionará UTXOs par a alcanzar el monto de ese pago objetivo. En Ejecutando el script select-utxo.py ejecutamos el script intentando hacer un pago de 0,5 bitcoins o 50.000.000 satoshis.
Ejemplo 4. Ejecutando el script select-utxo.py
$ python select-utxo.py 50000000
Para un monto de transacción de 50000000 Satoshis (0,500000 bitcoins) usa: ([<7dbc497969c7475e45d952c4a872e213fb15d45e5cd3473c386a71a1b0c136a1:0 with 25000000
Satoshis>, <7f42eda67921ee92eae5f79bd37c68c9cb859b899ce70dba68c48338857b7818:0 with 16100000 Satoshis>,
<6596fd070679de96e405d52b51b8e1d644029108ec4cbfe451454486796a1ecf:0 with 16050000
Satoshis>], 'Change: 7150000 Satoshis')
Una vez que las UTXOs son seleccionadas, la cartera produce scripts de desbloqueo conteniendo firmas para cada una de las UTXO, de esa forma haciéndolas gastables al satisfacer las condiciones del script de bloqueo. La cartera añade estas referencias a UTXOs y scripts de desbloqueo como entradas de la transacción. La estructura de la entrada de una transacción muestra la estructura de una entrada de transacción.
Tabla 3. La estructura de la entrada de una transacción

El número de secuencia se usa para sobrescribir una transacción previamente a la expiración del tiempo de bloqueo de la transacción, lo cual es una funcionalidad actualmente deshabilitada en bitcoin. La mayoría de las transacciones establecen este valor al máximo valor entero (0xFFFFFFFF) y es ignorado por la red bitcoin. Si la transacción posee un tiempo de bloqueo distinto de cero al menos una de sus entradas debe tener un número de secuencia por debajo de 0xFFFFFFFF para habilitad el tiempo de bloqueo.
Comisiones de Transacción
La mayoría de las transacciones incluyen tarifas de transacción, las cuales compensan a los mineros bitcoin por asegurar la red. La minería y las tarifas y recompensas recolectadas por los mineros son analizadas en mayor detalle en el capítulo 10. Esta sección examina cómo las tarifas de transacción son incluidas en una transacción típica. La mayoría de las carteras calculan e incluyen tarifas de transacción automáticamente. Sin embargo, si estás construyendo transacciones escribiendo código de programación o usando una interfaz de línea de comando, debes tomar en cuenta e incluir estas tarifas manualmente.
Las tarifas de transacción sirven de incentivo para incluir (minar) una transacción en el siguiente bloque y también como desincentivo contra el «spam» de transacciones o cualquier tipo de abuso del sistema, al requerir un pequeño costo en cada transacción. Las tarifas de transacción son recolectadas por el minero que mina el bloque que registra la transacción en la cadena de bloques.
Las tarifas de transacción son calculadas basadas en el tamaño de la transacción en kilobytes, no el valor de la transacción en bitcoins. En general las tarifas de transacción son establecidas basadas en fuerzas del mercado en la red bitcoin. Los mineros priorizan transacciones basados en distintos criterios, incluyendo tarifas y pueden hasta procesar transacciones sin tarifa bajo ciertas circunstancias. Las tarifas de transacción afectan la prioridad de procesado, lo cual significa que una transacción con tarifa suficiente será muy probablemente incluida en el próximo bloque en ser minado, mientras que una transacción con una tarifa pequeña o sin tarifa puede ser demorada, procesada cuando sea posible luego de algunos bloques, o jamás procesada. Las tarifas de transacción no son obligatorias y las transacciones sin tarifa pueden resultar finalmente procesadas; sin embargo, incluir tarifas en transacciones incentiva al procesado prioritario.
Con el tiempo la forma en que las tarifas de transacción son calculadas y el efecto que tienen sobre la priorización ha ido evolucionando. Al principio las tarifas de transacción eran fijas y constante en toda la red. Gradualmente la estructura de tarifas ha sido relajada de forma que pueda ser influenciada por fuerzas del mercado, basadas en la capacidad de la red y el volumen de transacciones. La mínima tarifa de transacción actual está fijada en 0,0001 bitcoin, o una décima parte de un milibitcoin por kilobyte, recientemente reducida de un milibitcoin. La mayoría de las transacciones pesan menos de un kilobyte; sin embargo, aquellas con múltiples entradas o salidas pueden ser mayores. En próximas versiones del protocolo bitcoin se espera que las aplicaciones de cartera usen análisis estadístico para calcular la tarifa más adecuada para cada transacción basadas en promedios de tarifas de transacciones recientes.
El algoritmo actual utilizado por mineros para priorizar transacciones para inclusión en un bloque basados en sus tarifas es examinado en detalle en el capítulo 10.
Añadiendo Comisiones a Transacciones
La estructura de datos de transacciones no posee un campo para tarifas. En cambio, las tarifas están implícitas como la diferencia entre la suma de las entradas y la suma de las salidas. Cualquier monto que sobre luego de que las salidas han sido descontadas de todas las entradas será la tarifa recolectada por los mineros.
Las tarifas de transacción son implícitas como el excedente de entradas menos salidas:
Tarifas = Suma(Entradas) - Suma(Salidas)
Esto es un elemento un tanto confuso de las transacciones y un punto importante a entender, ya que si estás construyendo tus propias transacciones debes asegurarte de no incluir una tarifa muy grande por descuido al gastar las entradas de menos. Esto significa que debes tener en cuenta todas las entradas, de ser necesario creando cambio, ¡o terminarás dándole a los mineros una propina muy grande!
Por ejemplo, si consumes una UTXO de 20 bitcoins para hacer un pago de 1 bitcoin, debes incluir una salida de cambio de 19 bitcoins de regreso a tu cartera. De lo contrario, los 19 bitcoins «sobrantes» serán contados con la tarifa de transacción y serán recolectados por el minero que mine tu transacción en un bloque.
Aunque recibirás procesado prioritario y harás muy feliz a un minero, esto probablemente no sea lo que planeabas hacer.
Si te olvidas de añadir una salida de cambio en una transacción construida manualmente terminarás pagando el cambio como tarifa de transacción. «¡Quédate el cambio!» puede no haber sido tu intención.
Veamos cómo funciona esto en la práctica usando de ejemplo la compra de café de Alice nuevamente.
Alice quiere gastar 0,015 bitcoins para pagar por un café. Para asegurar que esta transacción sea procesada rápidamente ella querrá incluir una tarifa de transacción, digamos que 0,001. Esto significará que el costo total de la transacción será de 0,016 bitcoins o más y, de ser necesario, creará cambio. Digamos que su cartera tiene una UTXO de 0,2 bitcoins disponible. Por lo tanto necesitará consumir esta UTXO, crear una salida para el Café de Bob por 0,015, y una segunda salida con 0,184 bitcoins de cambio de regreso a su propia cartera, dejando 0,001 bitcoins sin distribuir, lo cual será la tarifa implícita para la transacción.
Ahora veamos un caso diferente. Eugenia, nuestra directora de la beneficencia para niños en las Filipinas ha completado una recaudación de fondos para adquirir libros para los niños. Ella ha recibido varios miles de pequeñas donaciones de personas alrededor del mundo, las cuales suman 50 bitcoins, por lo que su cartera está llena de pagos muy pequeños (UTXOs). Ahora ella quiere comprar cientos de libros escolares a una editorial local, pagando en bitcoins.
Ya que la aplicación de cartera de Eugenia intenta construir una única transacción de pago mayor, debe sacar de la reserva de UTXOs disponibles, la cual está compuesta de múltiples montos más pequeños. Esto significa que la transacción resultante usará de fuente más de cien UTXOs de pequeño valor como entradas y solo una salida, pagando a la editorial de libros. Una transacción con tantas entradas será más grande que un kilobyte, quizá resulte de 2 o 3 kilobytes en tamaño. Por lo tanto requerirá una tarifa de transacción mayor a la mínima tarifa de la red de 0,0001 bitcoins.
La aplicación de cartera de Eugenia calculará la tarifa adecuada midiendo el tamaño de la transacción y multiplicándolo por la tarifa por kilobyte. Muchas carteras pagan tarifas más altas de lo necesario para transacciones muy grandes para asegurarse de que la transacción sea procesada rápidamente. La tarifa elevada no es porque Eugenia esté gastando más dinero, sino porque su transacción es más compleja y grande en tamaño. La tarifa es independiente del valor en bitcoins de la transacción.