Jugando con RBF en regtest

Parte 2 – Probando RBF Si no has leído la primera parte pulsa AQUÍ

Tenemos un entorno de pruebas listo para utilizar, para comprobar si se puede sustituir la dirección de destino a una transacción con RBF primero generaremos una sin marcar como reemplazable y posteriormente una reemplazable (RBF)

Generamos una dirección en nuestro nodo3 con

bitcoin-cli -regtest -rpcuser=node3 -rpcpassword=node3 -rpcport=8336 getnewaddress

nos devuelve esta dirección: 2Myq4pynBLLVi5wfj7ngEEdSm1H3YY8CfMv

Para crear una transacción utilizando el método «createrawtransaction» necesitamos varios datos, entre ellos el UTXO que vamos a utilizar, podemos listarlos con el siguiente comando:

bitcoin-cli -regtest -rpcuser=node1 -rpcpassword=node1 -rpcport=8332 listunspent

Vamos a enviar 1 BTC a la dirección que hemos creado en nuestro nodo3, como he dicho vamos a utilizar el método [url=https://bitcoincore.org/en/doc/0.16.0/rpc/rawtransactions/createrawtransaction/]»createrawtransaction»[/url]. El comando es el siguiente:

bitcoin-cli -regtest -rpcuser=node1 -rpcpassword=node1 -rpcport=8332 createrawtransaction "[{\"txid\":\"60b46a9f9972b7829308e7de9617c91c42518db994a1497d41e7c4527148f448\",\"vout\": 0}]" "{\"2Myq4pynBLLVi5wfj7ngEEdSm1H3YY8CfMv\":1,\"2NDBW6T9y8nr9Xivd6hPRdiEM8jpGtnXPnu\":47.99995616}"

Traducido cojemos un output concreto de una transacción y lo utilizamos como input, enviamos 1 bitcoin de ese input a la dirección de destino de nuestro nodo 3, 47’99995616 volverán a nuestra dirección y lo que queda hasta cubrir el vout completo será la fee.

Este comando nos devolverá una cadena en hexadecimal que contiene el detalle de nuestra transacción. Algo así:

020000000148f4487152c4e7417d49a194b98d51421cc91796dee7089382b772999f6ab4600000000000ffffffff0200e1f5050000000017a9144837402c11ab359d3622aaf868486b24b5d53dd987e01e1a1e0100000017a914daae4bf62e879ba69935f1f1a9aa770af3e599cb8700000000

Ahora tenemos que firmar la transacción, para ello utilizamos el siguiente comando:

bitcoin-cli -regtest -rpcuser=node1 -rpcpassword=node1 -rpcport=8332 signrawtransaction 020000000148f4487152c4e7417d49a194b98d51421cc91796dee7089382b772999f6ab4600000000000ffffffff0200e1f5050000000017a9144837402c11ab359d3622aaf868486b24b5d53dd987e01e1a1e0100000017a914daae4bf62e879ba69935f1f1a9aa770af3e599cb8700000000

Y nos devolverá otra cadena con nuestra transacción firmada, en este caso:

0200000000010148f4487152c4e7417d49a194b98d51421cc91796dee7089382b772999f6ab4600000000017160014235a8e2a35dfddb351160372cb964614db2d40d9ffffffff0200e1f5050000000017a9144837402c11ab359d3622aaf868486b24b5d53dd987e01e1a1e0100000017a914daae4bf62e879ba69935f1f1a9aa770af3e599cb870248304502210088dfda379492eb0c5b2b2240177598c8e7791902da23f90f1e25e1bfae4257360220171611fd07dae7482d2e7eb27f6a62bec6780e52f269115f080392f55434f576012102dcc6343071498b3766a6100d9e623b4c9ae5af0de8125e83450734f622f380bc00000000

Ya tenemos nuestra transacción firmada, ahora hay que propagarla a nuestra red, para ello utilizamos el siguiente comando:

bitcoin-cli -regtest -rpcuser=node1 -rpcpassword=node1 -rpcport=8332 sendrawtransaction 0200000000010148f4487152c4e7417d49a194b98d51421cc91796dee7089382b772999f6ab4600000000017160014235a8e2a35dfddb351160372cb964614db2d40d9ffffffff0200e1f5050000000017a9144837402c11ab359d3622aaf868486b24b5d53dd987e01e1a1e0100000017a914daae4bf62e879ba69935f1f1a9aa770af3e599cb870248304502210088dfda379492eb0c5b2b2240177598c8e7791902da23f90f1e25e1bfae4257360220171611fd07dae7482d2e7eb27f6a62bec6780e52f269115f080392f55434f576012102dcc6343071498b3766a6100d9e623b4c9ae5af0de8125e83450734f622f380bc00000000
d9a7deb4c087d90423d99b78dc2f31e5b6f8e24fc0a194fc49db97e93f60c09b

Esto nos devolverá el id de la transacción y comprobaremos como lo hemos hecho en el post anterior que dicha transacción está en la memoria de transacciones de nuestros 3 nodos con:

bitcoin-cli -regtest -rpcuser=node1 -rpcpassword=node1 -rpcport=8332 getrawmempool
bitcoin-cli -regtest -rpcuser=node2 -rpcpassword=node2 -rpcport=8334 getrawmempool
bitcoin-cli -regtest -rpcuser=node3 -rpcpassword=node3 -rpcport=8336 getrawmempool

Tenemos la transacción en la memoria de nuestros 3 nodos, vamos a generar una transacción exactamente igual pero modificando fee y dirección de destino, seguimos el mismo proceso, veremos que al propagar la nueva transacción da un error claro. «18:txn-mempool-conflict»

Bien, hemos comprobado que una transacción no marcada como reemplazable no se puede modificar y da un error claro a la hora de intentarlo. Para despejar la mempool minamos 1 nuevo bloque con el comando:

bitcoin-cli -regtest -rpcuser=node1 -rpcpassword=node1 -rpcport=8332 generate 1

Repetimos todo el proceso con pero marcamos nuestra transacción como reemplazable (RBF), para hacerlo, debemos añadir al final del comando un «0» que se refiere a locktime y un «true» que se refiere a RBF. Poniendo ese «true» indicamos que es una transacción RBF.

El comando quedaría así:

bitcoin-cli -regtest -rpcuser=node1 -rpcpassword=node1 -rpcport=8332 createrawtransaction "[{\"txid\": \"4a5eaf7168089bc54577f355272fe950b5bc0b7b6e5aeafcd2dc75881325b823\", \"vout\": 1}]" "{\"2Mxj2uongmNmJui2UrUeJSDPa97PuwsdvaX\":1,\"2NDBW6T9y8nr9Xivd6hPRdiEM8jpGtnXPnu\":45.99991656}" 0 true

Firmamos la transacción y la enviamos, en este caso nos devuelve como TXid 7d808fd7b6982f2a11349c2ac63aa51477357e0b2c90145498decddbea20208d Comprobamos que la transacción existe en la memoria de transacciones de nuestros 3 nodos.

Repetimos por última vez el proceso, generamos una nueva transacción pero modificamos la dirección de destino y elevamos la comisión. Utilizo este comando:

bitcoin-cli -regtest -rpcuser=node1 -rpcpassword=node1 -rpcport=8332 createrawtransaction "[{\"txid\": \"4a5eaf7168089bc54577f355272fe950b5bc0b7b6e5aeafcd2dc75881325b823\", \"vout\": 1}]" "{\"2N6FEkFMsx8MpGwAAmyyg6yeaDjQ8nPH6XS\":1,\"2NDBW6T9y8nr9Xivd6hPRdiEM8jpGtnXPnu\":45.99991356}" 0 true

La firmamos y enviamos.

En el log (debug.log) de los nodos vemos como añadió la primera y ahora añade la segunda:

Si consultamos la memoria de transacciones de nuestros 3 nodos comprobaremos que ha desaparecido la primera versión de la transacción y sólo queda la segunda con diferente dirección de destino.

Conclusiones

Tenía una idea equivocada de RBF, no sólo puedes añadir inputs a la transacción, también se pueden modificar, no sólo la dirección de destino, sino cualquier parámetro de la transacción con la única condición de elevar la fee.

Gracias a Reizu por realizar las primeras pruebas y recordarme que es mejor verificar que confiar.

Un Comentario

Añadir un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *