Cómo optimizar los costos por transacciones en Bitcoin (2)

La entrega previa he explicado cómo utilizar SegWit para que tenga el efecto de reducir el costo de las transacciones. Esta vez explicaré acerca del proceso de transacciones en “batch” cuyo efecto final es el mismo.

Este mecanismo ha estado presente desde los orígenes de Bitcoin y es utilizado ampliamente, principalmente por operadores de billeteras “hot” o casas de cambio. ¿Cómo sabemos que lo utilizan? Pues muy fácil, si alguna vez has recibido una transacción y has ubicado la misma en algún explorador de la block chain, habrás notado que además de tu dirección o billetera también se enviaron fondos a otras más que no son tuyas.

La idea principal es sencilla. Imagina que estas en un restaurante, que acepta Bitcoin, por supuesto; y tu cuenta es 0.002 BTC. Como has tenido un buen servicio deseas dar 10% de propina al mesero. Existen dos maneras de hacer este pago. Primero, efectuar el envío de los 0.002 BTC a la billetera del negocio, pagando la comisión de transacción del momento, y luego enviar 0.0002 BTC a la billetera del mesero, pagado comisión de transacción nuevamente. Ambas transacciones tienen una entrada y dos salidas (como he explicado previamente una de ellas es el “cambio”), así que el tamaño de cada una debe bordear los 226 bytes.

La otra manera es utilizar el mecanismo de “batch”. Este mecanismo consiste simplemente en añadir otra salida adicional a la transacción. Donde se tendría una entrada, tus fondos; y tres salidas por el pago de la cuenta, la propina y el cambio. El añadir una nueva salida solo incrementa en 34 bytes el tamaño de la transacción, la cual será de 260 bytes aproximadamente; logrando el mismo objetivo que efectuar transacciones a cuenta individuales.

Cómo usarlo

Para utilizar este esquema en el cliente gráfico de Bitcoin, simplemente se tiene que utilizar la opción “Añadir destinatario” o “Add Recipient” y colocar el monto y dirección del mismo. En otras billeteras el sistema es similar.

Para el caso de las transacciones a través de la interfaz RPC, desde programas, se debe utilizar la orden sendmany. Ejemplo:

bitcoin-cli -testnet sendmany \
  "cuentaLibre" \
  '''
    {
      "mjSk1Ny9spzU2fouzYgLqGUD8U41iR35QN": 0.002,
      "mgnucj8nYqdrPFh2JfZSB1NmUThUGnmsqe": 0.0002
    } ''' \
  6       \
  "Pago de cuenta y propina. Estuvo buenazo."

La orden sendmany recibe 5 parámetros. El nombre de cuenta, las direcciones y montos en formato de objeto JSON, el mínimo de confirmaciones, un comentario y eventualmente una dirección de donde pagar la comisión por la transacción.

Los números

Partimos con los siguientes supuestos:

  • Costo por transacción: 100 satoshi por byte
  • Precio de mercado: USD 14000

Luego tenemos en el caso tradicional dos transacciones cada una pesando 226 bytes, lo que resulta en 452 bytes acumulado, y en el segundo, una sola transacción que pesa 260 bytes. Un ahorro de 192 bytes o USD 2.69. Es decir:

  • Esquema 1: 226 * 100 * 2 = 45200, resultando en USD 6.33 de comisión
  • Esquema 2: 260 * 100 = 26000, resultando en USD 3.64 de comisión.

Se observa de que a medida de que se añadan más direcciones de salida el ahorro es mucho mayor. Es decir, es proporcionalmente inverso al número de direcciones.

Fuente de gráficos: David A. Harding

1 me gusta