Mastering Bitcoin

Mastering Bitcoin


6. Claves, Direcciones, Carteras » Carteras » Carteras Deterministas Jerárquicas (BIP0032/BIP0044) » Experimentando con carteras HD usando Bitcoin Explorer

Página 38 de 98

Derivación de clave pública hija

Como se mencionó anteriormente, una característica muy útil de las carteras deterministas jerárquicas es la capacidad para derivar claves hijas públicas de las claves públicas de los padres, sin tener las claves privadas. Esto nos da dos maneras para obtener una clave pública hija: ya sea desde la clave privada hija, o directamente de la clave pública padre.

Una clave pública extendida puede usarse, por tanto, para derivar todas las claves públicas (y solamente las claves públicas) en esa rama de la estructura de la cartera HD.

Este método simplificado se puede utilizar para crear despliegues muy seguros en servidores que solo requieren de claves públicas, mediante una copia de una clave pública extendida, sin claves privadas de ningún tipo. Ese tipo de despliegue puede producir un número infinito de claves públicas y direcciones bitcoin, pero no se puede gastar el dinero enviado a esas direcciones. Mientras tanto, en otro servidor, más seguro, la clave privada extendida puede derivar todas las claves privadas correspondientes para firmar transacciones y gastar el dinero.

Una aplicación común de esta solución es instalar una clave pública extendida en un servidor web que sirve una aplicación de comercio electrónico. El servidor web puede utilizar la función de derivación de clave pública para crear una nueva dirección bitcoin en cada transacción (por ejemplo, para un carrito de la compra del cliente). El servidor web no tendrá ninguna clave privada, que serían vulnerables al robo. Sin carteras HD, la única manera de hacer esto seria generar miles de direcciones de Bitcoin en un servidor seguro por separado y luego cargarlas previamente en el servidor de comercio electrónico. Este enfoque es engorroso y requiere un mantenimiento constante para garantizar que el servidor de comercio electrónico no «agote» las claves.

Otra aplicación común de esta solución es el almacenamiento en frío o en carteras hardware. En este escenario, la clave privada extendida se puede almacenar en una cartera de papel o en un dispositivo de hardware (tal como una cartera hardware Trezor), mientras que la clave pública extendida puede mantenerse en línea. El usuario puede crear direcciones de «recepción» a voluntad, mientras que las claves privadas se almacenan de forma segura en un lugar sin conexión. Para gastar los fondos, el usuario puede utilizar la clave privada extendida creando una firma en un cliente bitcoin sin conexión a la red, o firmar las transacciones en una cartera hardware (por ejemplo, Trezor). Extendiendo una clave pública padre para crear una clave pública hija ilustra el mecanismo para extender una clave pública padre para derivar claves públicas hijas.

Figura 12. Extendiendo una clave pública padre para crear una clave pública hija

Derivación reforzada de claves hijas

La capacidad de derivar una rama de claves públicas de una clave pública extendida es muy útil, pero viene con un riesgo potencial. El acceso a una clave pública extendida no da acceso a las claves privadas hijas. Sin embargo, debido a que la clave pública extendida contiene el código de cadena, si se conoce una clave privada hija, o de alguna manera se filtró, se puede utilizar el código de cadena para derivar todas las otras claves privadas hijas. Una única clave privada hija filtrada, junto con un código de cadena padre, revela todas las claves privadas de todos los hijos. Peor aún, la clave privada hija junto con un código de cadena de los padres se puede utilizar para deducir la clave privada padre.

Para contrarrestar este riesgo, las carteras HD utilizan una función de derivación alternativa llamada derivación reforzada, que «rompe» la relación entre la clave pública padre y el código de cadena hijo.

La función de derivación reforzada utiliza la clave privada padre para derivar el código de cadena hijo, en lugar de la clave pública padre. Esto crea un «cortafuegos» en la secuencia padre/hijo, con un código de cadena que no puede ser utilizado para comprometer un clave privada padre o hermana. La función de derivación reforzada parece casi idéntica a la derivación normal de la clave privada hija, a excepción de que la clave privada padre se utiliza como entrada a la función hash, en lugar de la clave pública padre, como se muestra en el diagrama en Derivación reforzada de una clave hija; omite la clave pública padre.

Figura 13. Derivación reforzada de una clave hija; omite la clave pública padre

Cuando se utiliza la función de derivación privada reforzada, la clave privada hija resultante y el código de cadena son completamente diferentes de lo que resultaría de la función normal de derivación. La «rama» resultante de las claves puede utilizarse para producir las claves públicas extendidas que no son vulnerables, debido a que el código de cadena que contienen no puede ser explotado para revelar ninguna clave privada. Por lo tanto, la derivación reforzada se utiliza para crear un «espacio» en el árbol por encima del nivel donde se utilizan las claves públicas extendidas.

En términos simples, si usted desea utilizar la conveniencia de una clave pública extendida para derivar ramas de claves públicas, sin exponerse al riesgo de que se difunda un código de cadena, debe derivarlo de un padre reforzado, en lugar de un padre normal. Como práctica recomendada, los hijos de nivel-1 de las claves maestras siempre deberían obtenerse a través de la derivación reforzada, para evitar el compromiso de las claves maestras.

Números índice para derivación normal y reforzada

El número de índice que se utiliza en la función de derivación es un entero de 32 bits. Para distinguir fácilmente entre claves derivadas a través de la función normal de derivación frente a claves derivadas a través de la derivación reforzada, este número de índice se divide en dos rangos. Los números de índice entre 0 y 231-1 (0x0 a 0x7FFFFFFF), se usan solo para la derivación normal. Números de índice entre 231 y 232-1 (0x80000000 a 0xFFFFFFFF), se usan solo para la derivación reforzada. Por lo tanto, si el número de índice es menor que 231, eso significa que el hijo es normal, mientras que si el número de índice es igual o superior a 231, el hijo es reforzado.

Para que el número de índice sea más fácil de leer y de mostrar en pantalla, el número de índice para los hijos reforzados se presenta empezando de cero, pero con un símbolo prima. Por tanto, la primera clave hija normal se muestra como 0, mientras que el primer hijo reforzado (índice 0x80000000) se muestra como 0'. Continuando la secuencia, la segunda clave reforzada tendría índice 0x80000001 y se mostraría como 1', y así sucesivamente. Cuando vea un índice en una cartera HD i', significa 231+i.

Identificador de clave de cartera HD (ruta)

Las claves en una cartera HD se identifican mediante un convenio de descripción de «ruta», con cada nivel del árbol separado por el carácter barra (/) (ver «Ejemplos de rutas de cartera HD»). Las claves privadas derivadas de la clave privada maestra empiezan con «m». Las claves públicas derivadas de la clave pública maestra empiezan con «M». Por lo tanto, la primera clave privada hija de la clave privada maestra es m/0. La primera clave pública hija es M/0. El segundo nieto del primer hijo es m/0/1, y así sucesivamente.

Los «antepasados» de una clave se leen de derecha a izquierda, hasta llegar a la clave maestra de la que deriva. Por ejemplo, el identificador m/x/y/z describe la clave que es el hijo z-ésimo de la clave m/x/y, que a su vez es el hijo y-ésimo de la clave m/x, que es el hijo x-ésimo de m.

Tabla 8. Ejemplos de rutas de cartera HD

La estructura de árbol de la cartera HD ofrece una gran flexibilidad. Cada clave extendida padre puede tener 4 mil millones de hijos: 2 mil millones de hijos normales y 2 mil millones de hijos reforzados.

Cada uno de estos hijos puede tener otros 4 mil millones de hijos, y así sucesivamente. El árbol puede ser tan profundo como se desee, con un número infinito de generaciones. Con toda esta flexibilidad, sin embargo, se hace muy difícil de navegar por este árbol infinito. Es especialmente difícil para transferir carteras HD entre implementaciones, debido a que las posibilidades de organización interna en ramas principales y secundarias son infinitas.

Dos propuestas de mejora Bitcoin (BIPs) ofrecen una solución a esta complejidad, mediante la creación de algunas de las normas propuestas para la estructura de los árboles de cartera HD. BIP0043 propone el uso del primer índice hijo reforzado como un identificador especial que significa el «propósito» de la estructura de árbol. Basado en BIP0043, una cartera HD debería utilizar solo una rama del árbol de nivel-1, con el número de índice identificando la estructura y el espacio de nombres del resto del árbol mediante la definición de su propósito. Por ejemplo, una cartera HD que utilice una única rama m/i'/ intenta significar un propósito específico y ese propósito es identificado por el número de índice «i».

Ampliando esa especificación, BIP0044 propone una estructura multicuenta cuyo «objetivo» es el número 44' bajo BIP0043. Todas las carteras HD que cumplen con la estructura BIP0044 se identifican por el hecho de que sólo utilizan una rama del árbol: m/44'/.

BIP0044 especifica que la estructura se basa en cinco niveles predefinidos del árbol:

propósito / tipo_moneda / cuenta / cambio / indice_dirección

El primer nivel «propósito» está siempre ajustado a 44'. El segundo nivel «tipo_moneda» especifica el tipo de moneda criptomoneda, permitiendo carteras HD multidivisa donde cada moneda tiene su propio subárbol bajo el segundo nivel. Hay tres monedas definidas por ahora: Bitcoin es m/44'/0', Bitcoin Testnet es m/44'/1' y Litecoin es m/44'/2'.

El tercer nivel del árbol es «cuenta», que permite a los usuarios que subdividan sus carteras en subcuentas lógicas separadas, para la contabilidad o para propósitos organizativos. Por ejemplo, una billetera HD puede contener dos «cuentas» bitcoin: pass: [m/44'/0'/0'] y m/44'/0'/1'. Cada cuenta es la raíz de su propio subárbol.

En el cuarto nivel, «cambio», una cartera HD tiene dos subárboles, uno para la creación de direcciones que reciben y otro para la creación de direcciones de cambio. Tenga en cuenta que mientras que los niveles anteriores utilizaron derivación reforzada, este nivel utiliza derivación normal. Esto se hace para permitir que este nivel del árbol pueda exportar las claves públicas extendidas para el uso en un entorno no seguro. Las direcciones utilizables se derivan de la cartera HD como hijos del cuarto nivel, haciendo que el quinto nivel del árbol sea el «indice_dirección». Por ejemplo, la tercera dirección de recepción para los pagos bitcoin en la cuenta principal sería M/44'/0'/0'/0/2. La tabla «Ejemplos de estructuras e carteras HD BIP0044» muestra algunos ejemplos más.

Tabla 9. Ejemplos de estructuras de carteras HD BIP0044

Experimentando con carteras HD usando Bitcoin Explorer

«Bitcoin Explorer», «carteras HD» y «Mediante la herramienta de línea de comandos Bitcoin Explorer» introducida en el capítulo 5, se puede experimentar con la generación y ampliación de claves deterministas de BIP0032, así como su visualización en diferentes formatos:

$ bx seed | bx hd-new > m # crear una nueva clave privada maestra a partir de una semilla y almacenarla en el archivo «m»

$ cat m # mostrar la clave privada extendida maestra

xprv9s21ZrQH143K38iQ9Y5p6qoB8C75TE71NfpyQPdfGvzghDt39DHPFpovvtWZaRgY5uPwV7RpEgHs7cvdg fiSjLjjbuGKGcjRyU7RGGSS8Xa

$ cat m | bx hd-public # generar la clave pública extendida M/0

xpub67xpozcx8pe95XVuZLHXZeG6XWXHpGq6Qv5cmNfi7cS5mtjJ2tgypeQbBs2UAR6KECeeMVKZBPLrtJunS

DMstweyLXhRgPxdp14sk9tJPW9

$ cat m | bx hd-private # generar la clave privada extendida m/0

xprv9tyUQV64JT5qs3RSTJkXCWKMyUgoQp7F3hA1xzG6ZGu6u6Q9VMNjGr67Lctvy5P8oyaYAL9CAWrUE9i6G

oNMKUga5biW6Hx4tws2six3b9c

$ cat m | bx hd-private | bx hd-to-wif # mostrar la clave privada de m/0 como un WIF

L1pbvV86crAGoDzqmgY85xURkz3c435Z9nirMt52UbnGjYMzKBUN

$ cat m | bx hd-public | bx hd-to-address # mostrar la dirección bitcoin de M/0

1CHCnCjgMNb6digimckNQ6TBVcTWBAmPHK

$ cat m | bx hd-private | bx hd-private --index 12 --hard | bx hd-private --index 4 #

generar m/0/12'/4

xprv9yL8ndfdPVeDWJenF18oiHguRUj8jHmVrqqD97YQHeTcR3LCeh53q5PXPkLsy2kRaqgwoS6YZBLatRZRy UeAkRPe1kLR1P6Mn7jUrXFquUt

Ir a la siguiente página

Report Page