Como crear una dirección multifirma de bitcoin.

Image for post
Image for post

En esta entrada vamos a explicar que es una dirección multifirma y cuales son sus características mencionando algunos de los casos de uso más habituales y finalmente indicaremos algunas ventajas y riesgos. Usaremos la red testnet y crearemos una dirección 2 de 3.

Introducción

En una transacción típica de bitcoin las direcciones suelen ser del tipo P2PKH o SegWit, en el primer caso y de forma simple esto es que las monedas se envían a una dirección basada en su clave pública, lo que a su vez significa que se requiere la clave privada relacionada para desbloquear la transacción y reutilizar los fondos. Ahora, imagine que pudiera bloquear una transacción no con una sola clave sino con varias claves privadas. Esto permitiría por ejemplo que el dinero se envíe a un grupo de personas o al comité directivo de una empresa, donde todas o algunas de esas personas tienen que aceptar aportar su firma y gastar el dinero. Este mecanismo se conoce como Multifirma o multisig.

Características

Una transacción multifirma es un tipo de transacción que envía fondos a una dirección multisig requiriendo las firmas de ciertas personas del grupo total para poder gastar los fondos. Las firmas múltiples se describen típicamente como “m de n”. Esto traduce que la transacción está bloqueada con un grupo de “n” claves, y que solo “m” de ellas son suficientes y necesarias para desbloquear la transacción.

Para poder crear una dirección multisig es requerido tener las claves públicas de cada persona firmante, no es posible crear direcciones multifirma a partir de otras direcciones ya que como comentamos aquí, las direcciones son hashes de claves públicas. En este ejemplo usaremos la consola de comando con Bitcoin Core aunque es recomendable usar una wallet como GordianWallet que hace todo el trabajo de forma transparente.

GordianWallet facilita el manejo y la gestión de carteras multisig permitiendo escanear un código QR para recuperar toda la cartera. Inicialmente se crean tres semillas.

  • La primera semilla se crea como su frase de recuperación sin conexión y se convierte en un mnemónico BIP39 de 12 palabras que es nuestra responsabilidad guardar sin conexión.
  • La segunda semilla estará en su dispositivo y estará encriptada y almacenada localmente de forma segura. Esta semilla se puede exportar en cualquier momento junto con el código QR de recuperación que contiene esta semilla.
  • La tercera semilla está designada para el nodo. Se convierte a un xprv y luego la semilla en sí se elimina para siempre del dispositivo. Nunca se almacena en la base de datos del dispositivo.
    En esta etapa, el dispositivo es totalmente capaz de firmar transacciones para la billetera.

Adicionalmente GordianWallet permite importar las claves creadas en ColdCard creando una cartera multifirma 2 de 3, donde una semilla pertenece a la ColdCard, otra al dispositivo móvil y la tercera al nodo propio. También es posible guardar la cartera mediante un código QR.

Multifirma 2 de 3 en GordialWallet.

Obtención de las 3 claves publicas.

Para este ejemplo crearemos una dirección 2 de 3 utilizando dos clientes de Bitcoin Core en maquinas distintas con los comandos getnewaddress y getaddressinfo y un cliente de Electrum. Al final firmaremos la transacción que gasta de la dirección usando las dos de Core.

Bitcoin Core 1

Image for post
Image for post
Bitcoin core 1
address: tb1q66slekvxjwfxmz6h9sdx5qg9zfg2tn8qzz4tlz
pubkey: 02c23666f1c266bf69edcc01705ae29526512b9bf9c84cd8103109ce30f778ca14
path: m/0'/0'/3'

Bitcoin Core 2

Image for post
Image for post
Bitcoin core 2
address: 2MuVkiNgM8kebEgykKoyzTLLUP4J1Y5cmR8
pubkey: 038e790aa64cefbdb46185b609b791cf40d3616a7b6adcb49f506a77176994031f
path: m/0'/0'/22'

Electrum

Image for post
Image for post
Electrum
address: tb1q8fj2tmvhat2jlapc9tav46sl2dw8l5p4y04m0c
pubkey: 0276dda401a97fba75e3ffb0bb5318a0e8beb230ef7465221241c732712de7b6cf
path: m/0/1

Una vez que hemos obtenido las claves publicas de los 3 firmantes utilizamos el comando createmultisig que recibe dos parámetros.

El número (m) de firmantes requeridos para poder gastar los fondos, y un arreglo con el total de las claves públicas de la multifirma (n)

Para este caso le hemos pasado 2 como (m) y las 3 claves públicas (n) arriba mencionadas.

Image for post
Image for post

La salida del comando createmultisig:


{
"address": "2N7f2RrTSSRYqWdZDFjyooxbmLasRvoGHEb",
"redeemScript": "52210276dda401a97fba75e3ffb0bb5318a0e8beb230ef7465221241c732712de7b6cf21038e790aa64cefbdb46185b609b791cf40d3616a7b6adcb49f506a77176994031f2102c23666f1c266bf69edcc01705ae29526512b9bf9c84cd8103109ce30f778ca1453ae",
"descriptor": "sh(multi(2,0276dda401a97fba75e3ffb0bb5318a0e8beb230ef7465221241c732712de7b6cf,038e790aa64cefbdb46185b609b791cf40d3616a7b6adcb49f506a77176994031f,02c23666f1c266bf69edcc01705ae29526512b9bf9c84cd8103109ce30f778ca14))#7qyyhtxs"
}

Si el comando tiene éxito retorna 3 salidas. Esta información debe guardarse en un lugar seguro.

El primero es la address (2N7f2RrTSSRYqWdZDFjyooxbmLasRvoGHEb) a la cual hemos enviado algunos fondos. Dado que estamos en testnet y es una dirección multisig la dirección empieza con un 2, esto significa que es una dirección P2SH-SegWit. En mainnet dichas direcciones empiezan con un 3. El redeemScript es lo que necesita para canjear los fondos (junto con las claves privadas para “m” de las “n” direcciones). Este script es otra característica especial de las direcciones P2SH. Finalmente obtiene el descriptor que es una “descripción” estandarizada de una dirección.

Nótese que el orden con el cual fue creada la dirección es muy importante, ya que si se cambia se producirá un hash diferente y por tanto una dirección completamente distinta y más importante aun un script diferente a pesar de usar las mismas claves públicas.

Image for post
Image for post

Gastar de una dirección multisig.

Al tratarse de una dirección multifirma debemos indicarle a Bitcoin Core como llegar a los posibles fondos que pueda tener la dirección. Actualmente Bitcoin Core no maneja de forma nativa las direcciones multifirma, y dado que no es una dirección que pertenezca a la propia billetera se debe importar mediante el comando importaddress o importmulti usando el descriptor.

Para este caso usaremos la dirección, luego de ejecutar el proceso de escaneo los fondos deberían aparecer como watch only y NO disponibiles para gastar.

$ bitcoin-cli -testnet importaddress 2N7f2RrTSSRYqWdZDFjyooxbmLasRvoGHEb
error: Could not connect to the server 127.0.0.1:18332 (error code 0 - "timeout reached")
Make sure the bitcoind server is running and that you are connecting to the correct RPC port.
$ bitcoin-cli -testnet getbalance
0.00010000
$ tail -f debug.log
2020–12–15T19:06:58Z [default wallet] Still rescanning. At block 1007978. Progress=0.199041
Image for post
Image for post
Watch Only — Bitcoin Core Testnet
Image for post
Image for post

Como observamos los fondos enviados a la dirección multisig estan marcados como no gastables.

Para construir la transacción que gastará los fondos enviados a la dirección multisig debemos recopilar la siguiente información.

  • El id de la transacción: 1e38e30f728f77fb8c078799c352afa514aa7968ed590484fe63da4bb3d62e85
  • El indíce de la moneda dentro de la transacción: 0
  • El scriptPub / hex que bloquea la transacción anterior. a9149e12184fc106d328cd9762b78da87a464c40633f87.
  • El script de desbloqueo de la dirección multisig: 52210276dda401a97fba75e3ffb0bb5318a0e8beb230ef7465221241c732712de7b6cf21038e790aa64cefbdb46185b609b791cf40d3616a7b6adcb49f506a77176994031f2102c23666f1c266bf69edcc01705ae29526512b9bf9c84cd8103109ce30f778ca1453ae.
  • Una dirección de cambio: tb1qd32ek94ywpqt076sxtg5839wdu5e58ed8utvxu
Image for post
Image for post
Creación de variables, transacción y obtención de la primera clave privada.
Image for post
Image for post
Obtención de la segunda clave privada.

Con estas variables fijadas creamos la transacción usando el comando createrawtransaction. La transacción creada es salvada en la variable $rawtxh que será usada para añadirle las firmas.

rawtxh=0200000001852ed6b34bda63fe840459ed6879aa14a5af52c39987078cfb778f720fe3381e0000000000ffffffff0120a10700000000001600146c559b16a47040b7fb5032d143c4ae6f299a1f2d00000000

Posteriormente obtenemos las claves privadas de dos de las tres claves de la multisig y las añadimos a la transacción firmando.

Clave privada 1:

cW6PMLx7pC1FCGK58fM4riErWikMeoHxpH7d2EYZ8U3Jeq5FoXW9

Clave privada 2:

cUsLFfRCKWHLrubefb3GhhbrCpxjZ8jpZxs7gesYjGwMrAniPcjo

Finalmente usando el comando signrawtransactionwithkey añadimos la primera clave privada y obtenemos un mensaje indicando que el proceso no está completo y que se requieren más firmas.

“sequence”: 4294967295,
“error”: “CHECK(MULTI)SIG failing with non-zero signature (possibly need more signatures)”
Image for post
Image for post

Por tanto usando la otra clave privada obtenida anteriormente firmamos de nuevo la transacción y ahora si vemos un aviso de proceso completado.

Image for post
Image for post

Ahora usamos el comando sendrawtransaction para gastar en la transacción ccae734397d801442dbe31fcd1259cfbcb47931a216912c1f5eeed2a7afc16e6

Image for post
Image for post

Ventajas

El uso de las firmas múltiples permiten modelar una gran cantidad de acuerdos financieros para corporaciones, instituciones legales, comités directivos entre otros grupos. Una firma múltiple 1 de 2 podría ser la cuenta bancaria conjunta de un par de socios, mientras que una firma múltiple de 2 de 2 podría ser utilizada para grandes gastos por una sociedad de responsabilidad limitada. Las firmas múltiples constituyen la base de los contratos inteligentes. Por ejemplo, la venta de un bien inmueble podría concretarse mediante una firma 2 de 3, donde las firmas son enviadas por el comprador, el vendedor y un agente de custodia. Una vez que el agente en garantía acepta que se han cumplido todas las condiciones de venta, libera el dinero al vendedor; o alternativamente, el comprador y el vendedor pueden liberar conjuntamente los fondos.

Adicionalmente las direcciones multifirma incrementan la seguridad de los fondos al requerir un mayor esfuerzo en la construcción de las transacciones que gastan el dinero y un especial cuidado en el almacenamiento de la información requerida para las mismas.

Riesgos

El uso de estas herramientas requiere conocimientos claros de como funcionan las transacciones y las propias direcciones multifirma con el objetivo de no perder los fondos. Un caso típico de error es suponer que con 2 de las 3 claves privadas se pueden recuperar los fondos. Sin embargo hemos comprobado que se requiere conocer más información y no solo las 3 claves públicas con las cuales se creó la dirección multifirma.

Telegram: https://t.me/sntgvrg

Bitcoin student

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store