Saltar al contenido

Prueba ya los Silent Payments en Bitcoin

Tiempo de lectura aprox: 6 minutos, 20 segundos

Introducción

Estoy inmerso en la preparación y publicación de una serie de podcasts sobre algo que en Bitcoin no se ha resuelto todavía al 100%: 

  • las direcciones que nos permitan pagos recurrentes con privacidad y sin interactividad requerida

Hablaré más en detalle sobre esto en el próximo pod, pero la idea es que en Bitcoin no tenemos una forma fácil de compartir una dirección de forma pública y poder: 

  • recibir tantos pagos recurrentes como queramos
  • mientras mantenemos la privacidad
  • y sin fricción de ningún tipo

Podemos reutilizar direcciones, como se ha hecho siempre, pero eso es malísimo para nuestra privacidad y para la de los pagadores.

Queremos un imposible: tener una dirección que se pueda reutilizar y que ningún observador que la vea pueda cotillear a ver cuanto hemos recibido. 

Algo así tenemos con los códigos de pago reutilizables del BIP47 de 2015 y que el equipo de Samourai Wallet implementó en los PayNyms de su wallet en 2018. Pero para utilizar los Payment Codes tienes el problema de necesitar:

  • o una transacción de notificación con cada persona a la que quieras realizar pagos recurrentes (abrir un canal de pago (nada que ver con LN))
  • o guardar un backup, en paralelo a tu frase mnemónica, de todos los payments codes que te han hecho pagos, para poderlos recuperar más tarde. 

Con el estado de la mempool actual, pensar en tener que pagar las comisiones de 1 tx adicional por cada canal de pago que quieras tener es algo que puede tirar para atrás, pero sin lugar a dudas, los Paynyms y sus Códigos de Pago son la mejor solución que tenemos sobre la mesa para tener direcciones de pago reutilizables. 

La llegada de los Silent Payments

Los Silent Payments de Ruben Somsen y Josi Bake son una nueva propuesta de direcciones reutilizables para bitcoin, que permitirán hacer todo lo que hacen los códigos de pago pero sin necesitar una transacción. Encontrarás la Silent Address de la persona a la que desees pagarle (quizá de su perfil de X, Nostr o su Web), le darás a enviar a tu wallet y ya. 

En Mainnet tendrán una longitud de 116 caracteres (como los códigos de pago), empezarán por sp1q (de silent payment) y lucirán tal que así:

  • sp1qqgste7k9hx0qftg6qmwlkqtwuy6cycyavzmzj85c6qdfhjdpdjtdgqjuexzk6murw56suy3e0rd2cgqvycxttddwsvgxe2usfpxumr70xc9pkqwv

Bitcoin Core publica nuevas versiones cada 6 meses. Hace apenas 1-2 meses se publico la versión 26 y es posible que veamos Silent Payments implementado para la versión 27 o 28. 

Nosotros mientras tanto podemos testear las versiones de prueba en signet y en esta guía os enseño como hacerlo. 

Si lo conseguís, dejad en los comentarios vuestra SP y os hago algunos pagos silenciosos. También podemos comentar en la sala de chat 🙂 

Esta es mi dirección de Silenciosa en Signet: 

  • tsp1qqteqg3kltrqslyme5g3h9n7pgpra0cyf08kleg5vcj9gdkyhyzspjq3zr6x5j3aycvvfrr96lldseexcchtvsu3xrxp7wkzpkk6ekuk2957acw8x

Mas abajo os explico cómo enviarme monedas.

Tutorial Silent Payments en Signet

Este tutorial se ha hecho para Linux (Ubuntu) aunque muy probablemente podría ser adaptado para Mac con mucha facilidad. En Windows no lo he probado pero si teneis instalado WSL con mucha seguridad también se pueda seguir (nota mental, hacer tutorial de instalación de WSL en Windows).

Preparando Ubuntu

Requerimientos previos

1. Tener Linux actualizado

  • sudo apt update
  • sudo apt upgrade

2. Tener git instalado

  • sudo apt install git

Lo habremos instalado si al hacer git –version nos devuelve la versión

  • > git version 2.34.1

Instalando direnv

Sobre direnv: https://direnv.net/

  • sudo apt install direnv

Verificamos que se ha instalado:

  • direnv --version
  • > 2.25.2

Ahora hay que «hook it into shell» (https://direnv.net/docs/hook.html)

  • sudo nano ~/.bashrc

Entonces añadir:

  • eval "$(direnv hook bash)"

Ctrl+X para salir

y le decimos que Sí a guardar las modificaciones.

Ahora solo nos queda recargar el archivo de .bashrc y lo podemos hacer cerrando sesión y volviendo a acceder o con el siguiente comando:

  • source ~/.bashrc

Instalando bendir

Esto es opcional pero nos facilitará mucho los comando que le tiremos luego a bitcoin-cli porque nos evitará tener que estar poniendo todo el rato «signet»

Referencia: https://github.com/josibake/bendir 

¿Qué es bendir?

  • Es un direnv para gestionar signet, regtest, y testnet automáticamente vía directorios y variables de entorno.

¿Cómo lo instalamos?

Instalando Bitcoin Core SP 

Dependencias de Bitcoin Core

Para compilar bitcoin core y ejecutarlo vamos a necesitar algunas dependencias. Aunque aquí compilaremos una versión de Test con el código de Silent Payments, si te interesa aprender a compilar bitcoin core de la rama principal (solo cambia un comando), el tutorial imperdible es el de Jon Atack:

Para las dependencias, éstas cambian en función del sistema operativo y la distribución. Revisar en:

Instalo las de linux siguiendo las recomendaciones de Jon Atack:

  • sudo apt-get install automake autotools-dev bsdmainutils build-essential ccache clang gcc git libboost-dev libboost-filesystem-dev libboost-system-dev libboost-test-dev libevent-dev libminiupnpc-dev libnatpmp-dev libqt5gui5 libqt5core5a libqt5dbus5 libsqlite3-dev libtool libzmq3-dev pkg-config python3 qttools5-dev qttools5-dev-tools qtwayland5 systemtap-sdt-dev

Si te da error la instalación, ¿puede ser que no hicieras sudo apt update al inicio?

Descargar Bitcoin Core y SP:

Descargar el código fuente de Bitcoin Core clonando su repositorio de git:

Entramos al directorio recién descargado

  • cd bitcoin/src

Entonces le damos a

  • git fetch origin pull/28453/head:silent-payments-testing-branch
  • git checkout silent-payments-testing-branch

Y con esto ya podemos compilar. Para, volvemos a la carpeta ~/bitcoin

  • cd ..

Y compilamos con 3 comandos:

  • ./autogen.sh
  • ./configure
  • make <- En lugar de esto te recomiendo el siguiente comando

TE RECOMIENDO para utilizar todos los cores de tu ordenador:

  • make -j "$(($(nproc) + 1))"

Cuando termine nos quedará copiar los binarios al directorio de test que hemos creado antes:

  • cp ~/bitcoin/src/bitcoind ~/silent-payments-testing/bin/
  • cp ~/bitcoin/src/bitcoin-cli ~/silent-payments-testing/bin/

Acto seguido entramos en la carpeta de testeo de los Silent Payments:

  • cd ~/silent-payments-testing

Y tecleamos

  • init signet

Entonces veremos un mensaje del estilo:

Si no lo vieramos es que tenemos un problema con direnv.

Primeros pasos con Bitcoin Core Signet SP

Con esto ya tendremos a direnv+bendir trabajando y ejecutando comandos de forma simplificada que siempre apuntarán a signet (sin necesidad de indicárselo cada vez). Con lo que ahora ya podemos arrancar Bitcoin core:

  • bitcoind -daemon

Crear Wallet:

Crearemos la wallet de nombre «sp» con el siguiente comando:

  • bitcoin-cli createwallet "sp" silent_payments=true

Ahora querremos añadir fondos a nuestra wallet con los que poder operar y testear los Silent Payments. Para ello vamos a necesitar una dirección donde recibir. La creamos con:

  • bitcoin-cli getnewaddress
  • > tb1qyf7vrsjy2y0w8uwj2m4d953c5kz29z5u052rlx

Si queremos una address taproot haremos

  • bitcoin-cli getnewaddress "" "bech32m"

Para recibir monedas a esta dirección podemos utilizar un «faucet» o «grifo» de satoshis de signet. Abajo, en la sección de recursos he dejado algunos links de faucets pero puedes ir directamente y usar este:

Seguimos el procedimiento (ponemos la cantidad y nuestra dirección) y esperamos a que nos lleguen. Para ver si has recibido las monedas:

  • bitcoin-cli getbalance

En mi caso el balance me daba 0.00000000 y eso era porque la cadena de bloques no se me había sincronizado (la sincronicé en una sentada tomando café con datos del móvil. No tarda más de 5 min), y me di cuenta cuando ejecuté:

  • bitcoin-cli getblockchaininfo

Con el nodo signet ya sincronizado sí que me encontraba las monedas:

Todo listo para adentrarnos a los Silent Payment o «Pagos silenciosos» 🤫

Silent payments

Para empezar vamos a necesitar una dirección «silenciosa» o Silent Payment Address para poder recibir fondos (que por ahora nosotros mismos vamos a enviar).

Para generar una Silent Payment Address ejecutamos el siguiente comando:

  • bitcoin-cli getnewaddress address_type="silent-payment"

Con este comando le estamos pidiendo a nuestra billetera que nos cree una dirección tipo «silent-payment», que se convertirá en un nuevo formato de dirección.

¡Et Voila! Así creo mi primerai Silent Payment Address:

  • tsp1qqteqg3kltrqslyme5g3h9n7pgpra0cyf08kleg5vcj9gdkyhyzspjq3zr6x5j3aycvvfrr96lldseexcchtvsu3xrxp7wkzpkk6ekuk2957acw8x

Si fuera de mainnet empezaría por las letras «sp» y un total de 117 caracteres (aunque podría crecer en futuras versiones).

Ahora vamos a enviarnos bitcoin a nosotros mismos fondos: del utxo que hemos recibido de 0,01 sBTC a la Silent Payment Address. Y para hacerlo utilizaremos el comando RPC sendtoaddress. Lo construimos de la siguiente forma:

  • bitcoin-cli sendtoaddress "address" amount

En mi caso:

  • bitcoin-cli sendtoaddress "tsp1qqteqg3kltrqslyme5g3h9n7pgpra0cyf08kleg5vcj9gdkyhyzspjq3zr6x5j3aycvvfrr96lldseexcchtvsu3xrxp7wkzpkk6ekuk2957acw8x" 0.00215193

Pues bien, esto que debería funcionar, no me funcionaba pq tanto en signet como en regtest la opción de fallbackfee viene desactivada y hay que darle alguna información sobre la fee que queremos usar:

La solución es fijarle una fee de tx antes de enviarla con:

  • bitcoin-cli settxfee 0.00001

Y con esto, ahora sí que podemos realizar nuestro pago silencioso:

Y así, esta txid que te entrega el comando de pago una vez se ha realizado se convierte en mi primer Silent Payment 🙂

TXID:

  • 810121fc658b7f6b16d4fdfe0a35df539805f437d7682d929bdaff01de0a2a9e

Silent Payment Address con las que testear envíos

Orbe

  • tsp1qq00glmn5tjyl6manfwqhhr9c6qgydzhs48yjpwjrm8k0zanm4veuqqn0npayezar59wuralwsmrfua27668jq25qrx5upl08tvnnynsrwvn94sn7

West

  • tsp1qqw6n64s44vgdppn47nfrs8rwvujfxu2qw5rtvnmrmyfdpu0zacaakq37uwu6dcmjvx30kctck2m3jnfwvrtdc2wqdlc5rjd398hkx6e90q8jy44w

Jorg2140

  • tsp1qqvr3f5cq8zu7fpfy5wm84jgpva3yzcwrft7gt03dc0fsp6q9cx2zuqhyhv72260ujz84x84hmwg4at46t520w7tsq3dlgdpvpkskqukevyw0juel

Y mi Silent Address 🙂

  • tsp1qqteqg3kltrqslyme5g3h9n7pgpra0cyf08kleg5vcj9gdkyhyzspjq3zr6x5j3aycvvfrr96lldseexcchtvsu3xrxp7wkzpkk6ekuk2957acw8x

Recursos de interés

Comandos

Wallet

Para ver qué wallets tienes creadas

  • bitcoin-cli listwalletdir

Para cargar una wallet concreta

  • bitcoin-cli loadwallet "nombre_la_wallet"

Si te da el error de «fallbackfee» puedes fijar una antes de enviar una tx así

  • bitcoin-cli settxfee 0.00001

Envíar bitcoin

  • bitcoin-cli sendtoaddress (más información de sus campos aquí)

Ver los UTXOs que tienes

  • bitcoin-cli listunspent

Ver el balance que tienes en la wallet

  • bitcoin-cli getbalance

Ver el balance que tienes sin confirmar en la billetera

  • bitcoin-cli getunconfirmedbalance

Ver las direcciones utilizadas

  • bitcoin-cli listaddressgroupings

Recursos Signet

Faucets:

Explorador:

Referencias

WIP BIP 352 de Josie Bake y Ruben Somsen

Guía de Josie Bake para instalar un nodo de Signet:

Bendir de Josie:

Guía para compilar Bitcoin Core de Jon Atack:

Instalar un nodo de Signer por Michael Folkson:

Sobre el fallbackfee en regtest y signet:

Crear una tx con coin control en bitcoin core wallet por línea de comando: