Mastering Bitcoin

Mastering Bitcoin


6. Claves, Direcciones, Carteras » Carteras » Carteras Deterministas Jerárquicas (BIP0032/BIP0044)

Página 36 de 98

Carteras

Las carteras son contenedores de claves privadas, usualmente implementadas como archivos estructurados o simples bases de datos. Otro método para hacer claves es la generación determinista de claves. En ella derivas cada nueva clave privada usando una función de hash de sentido único de una clave privada previa, vinculándolas en una secuencia. Siempre y cuando puedas recrear esa secuencia tan solo necesitas de la primera clave (conocida como clave semilla o maestra) para generarlas todas.

En esta sección examinaremos las distintas maneras de generar claves y las estructuras de cartera que se construyen a su alrededor.

Las carteras bitcoin contienen claves, no monedas. Cada usuario posee una cartera conteniendo claves. Las carteras son en esencia llaveros conteniendo pares de claves privadas/públicas (ver Claves Privadas y Públicas). Los usuarios firman transacciones con las claves, demostrando de esa forma que son dueños de las salidas de transacción (sus monedas). Las monedas son almacenadas en la cadena de bloques en forma de salidas de transacción (a menudo notadas como vout o txout).

Carteras No Deterministas (Aleatorias)

En los primeros clientes bitcoin, las carteras eran simplemente colecciones de claves privadas generadas aleatoriamente. Este tipo de cartera se conoce como cartera no determinista de Tipo-0. Por ejemplo, el cliente Bitcoin Core genera previamente 100 claves privadas aleatorias cuando se inicia, y genera más claves cuando son necesarias, usando cada clave solamente una vez. Este tipo de cartera se conoce como «Simplemente un Montón De Claves» o JBOK, y están siendo reemplazadas por carteras deterministas porque son engorrosas de manejar, respaldar e importar. La desventaja de las carteras aleatorias es que si generas muchas has de realizar copia de todo, lo que supone que la cartera ha de ser respaldada de forma frecuente. Cada clave ha de respaldarse, o los fondos que controla se pierden irrevocablemente si la cartera pasa a ser inaccesible. Esto entra en conflicto directamente con el principio de evitar la reutilización de direcciones, usando cada dirección de bitcoin durante solo una transacción… La reutilización de direcciones reduce la privacidad mediante la asociación de múltiples transacciones y direcciones con los demás. Una cartera de Tipo-0 no determinista es una mala elección de cartera, sobre todo si se quiere evitar la reutilización de direcciones porque eso significa gestionar muchas claves, lo que crea la necesidad de copias de seguridad frecuentes. Aunque el cliente Bitcoin Core incluye una cartera Tipo-0, el uso de esta cartera es desaconsejado por los desarrolladores de Bitcoin Core. La imagen siguiente muestra una billetera no determinista, que contiene un conjunto disperso de claves aleatorias.

Figura 8. Cartera no determinista (aleatoria) Tipo-0: una colección de claves generadas aleatoriamente

Carteras Deterministas (A Partir de Semilla)

«Semilla», «carteras con semilla», «carteras deterministas» o «con semilla» son carteras que contienen claves privadas que surgen a partir de una semilla común, mediante el uso de una función hash unidireccional. La semilla es un número generado aleatoriamente que se combina con otros datos, como un número de índice o «código de cadena» (ver apartado sobre Carteras Deterministas Jerárquicas BIP0032/BIP0044) para derivar las claves privadas. En una cartera determinista, la semilla es suficiente para recuperar todas las claves derivadas, y por lo tanto una única copia de seguridad en el momento de la creación es suficiente. La semilla también es suficiente para una exportación de cartera o de importación, lo que permite una fácil migración de todas las claves de los usuarios entre diferentes implementaciones de cartera.

Palabras Código Mnemónicas

Los códigos mnemotécnicos son palabras en inglés que representan (codifican) un número aleatorio utilizado como semilla para obtener una cartera determinista. La secuencia de palabras es suficiente para volver a crear la semilla y desde allí volver a crear la cartera y todas las claves derivadas. Una aplicación de cartera que implementa carteras deterministas con código nemotécnico mostrará al usuario una secuencia de 12 a 24 palabras al crear la cartera por primera vez. Esa secuencia de palabras es la copia de seguridad de la carpeta y se puede utilizar para recuperar y volver a crear todas las claves de la misma o de cualquier aplicación de cartera compatible. Las palabras de código mnemotécnico hace que sea más fácil para los usuarios realizar copias de seguridad de las carteras, ya que son fáciles de leer y transcribir correctamente, en comparación con una secuencia aleatoria de números.

Los códigos mnemotécnicos se definen en la Propuesta de Mejoras de Bitcoin 39 (ver apartado al efecto), que actualmente se encuentra en estado de borrador. Tenga en cuenta que BIP0039 es una propuesta de borrador y no un estándar. En concreto, hay un estándar diferente, con un conjunto diferente de palabras, utilizado por la cartera Electrum y que precede a BIP0039. BIP0039 es utilizado por la cartera Trezor y algunas otras carteras, pero es incompatible con la aplicación de Electrum.

BIP0039 define la creación de un código y semilla mnemónicos de la siguiente manera:

1. Crear una secuencia aleatoria (entropía) de 128 a 256 bits.

2. Crear un checksum de la secuencia aleatoria tomando los primeros pocos bits de su hash SHA256.

3. Anexar el checksum al final de la secuencia aleatoria.

4. Dividir la secuencia en secciones de 11 bits, usándolas para indexar un diccionario de 2048 palabras predefinidas.

5. Producir 12 a 24 palabras representando el código mnemónico. Códigos mnemónicos: entropía y longitud de palabra muestra la relación entre el tamaño de datos de entropía y la longitud de los códigos mnemónicos en palabras.

Tabla 5. Códigos mnemónicos: entropía y longitud de palabra

El código mnemónico representa de 128 a 256 bits, los cuales son usados para derivar una semilla más larga (512 bits) a través del uso de la función de estiramiento de clave PBKDF2. La semilla resultante es usada para crear una cartera determinista y todas sus claves derivadas.

Las tablas siguientes muestran algunos ejemplos de códigos mnemónicos y las semillas que producen.

Tabla 6. Código mnemónico de entropía de 128 bits y su semilla resultante

Tabla 7. Código mnemónico de entropía de 256 bits y su semilla resultante Entropía de entrada (256 bits)

Carteras Deterministas Jerárquicas (BIP0032/BIP0044)

Se desarrollaron carteras deterministas para que fuese fácil de obtener muchas claves de una sola «semilla». La forma más avanzada de carteras deterministas es la cartera determinista jerárquica o cartera HD definida por el estándar BIP0032. Las carteras deterministas jerárquicas contienen claves derivadas en una estructura de árbol, de tal manera que de una clave padre puede derivarse una secuencia de claves hijas, de cada una de las cuales puede derivarse una secuencia de claves nietos, y así sucesivamente, a una profundidad infinita. Esta estructura de árbol se ilustra en Cartera determinista jerárquica de Tipo-2: un árbol de claves generadas a partir de una única semilla.

Figura 9. Cartera determinista jerárquica de Tipo-2: un árbol de claves generadas a partir de una única semilla

Si estás implementando una cartera bitcoin debería ser construida como una cartera HD siguiendo los estándares BIP0032 y BIP0044.

Las carteras HD ofrecen dos grandes ventajas sobre las claves aleatorias (no deterministas). En primer lugar, la estructura de árbol se puede utilizar para expresar un significado organizativo adicional, tal como cuando se utiliza una rama específica de subclaves para recibir los pagos entrantes y una rama diferente se utiliza para recibir el cambio de los pagos salientes. Las ramas de claves también se pueden utilizar en un entorno corporativo, la asignación de diferentes ramas a los departamentos, filiales, funciones específicas o categorías de contabilidad.

La segunda ventaja de las carteras HD es que los usuarios pueden crear secuencias de claves públicas sin tener acceso a las claves privadas correspondientes. Esto permite a las carteras HD ser usadas en servidores inseguros o en capacidad de recepción de fondos únicamente, generando una clave pública distinta para cada transacción. Las claves públicas no necesitan ser precargadas ni derivadas por adelantado, y aun así el servidor no tiene las claves privadas que permiten gastar los fondos.

Creación de una cartera HD a partir de una semilla

Las carteras HD se crean a partir de una sola semilla raíz, que es un número aleatorio de 128, 256, o 512 bits. Todo lo demás en la cartera HD se deriva de forma determinista de esta semilla raíz, lo que hace que sea posible volver a crear toda la cartera HD a partir esa semilla en cualquier cartera HD compatible. Esto hace que sea fácil de hacer copias de seguridad, restaurar, exportar e importar carteras HD que contienen miles o incluso millones de claves mediante la simple transferencia de una única semilla raíz. La forma más común de representar la semilla raíz es mediante una secuencia de palabras mnemónicas, como se describe en la sección anterior Palabras Código Mnemónicas, para que sea más fácil para las personas transcribirla y almacenarla.

Figura 10. Creando claves y códigos de cadena maestros a partir de una semilla raíz

El proceso de creación de claves maestras y código de cadena maestro para una cartera HD se muestra en Creando claves y códigos de cadena maestros a partir de una semilla raíz.

La semilla raíz es introducida en el algoritmo HMAC-SHA512 y el hash resultante se utiliza para crear una clave privada maestra (m) y un código de cadena maestra. La clave privada maestra (m) genera luego una clave pública maestra correspondiente (M), utilizando el proceso de multiplicación de curva elíptica normal m * G que vimos anteriormente en este capítulo. El código de cadena se utiliza para introducir entropía en la función que crea claves hijas a partir de claves padres, como veremos en la siguiente sección.

Derivación de la clave pública hija

Las carteras deterministas jerárquicas utilizan una función de derivación de clave hija (CKD) para derivar claves hijas de claves padres.

Las funciones de derivación de claves hijas se basan en una función de hash de sentido único que combina:

Una clave privada o clave pública padre (clave descomprimida ECDSA).

Una semilla llamada código de cadena (256 bits).

Un número índice (32 bits).

Figura 11. Extendiendo una clave privada padre para crear una clave privada hijo.

El código de cadena se utiliza para introducir datos aparentemente aleatorios para el proceso, de modo que el índice no sea suficiente para derivar otras claves secundarias. Por lo tanto, tener una clave hija no permitirá encontrar sus hermanos, a menos que usted también tenga el código de cadena. La semilla del código de la cadena inicial (en la raíz del árbol) se obtiene a partir de datos aleatorios, mientras que los códigos de cadena posteriores se derivan de los códigos de cadena de cada padre.

Estos tres elementos son combinados y hasheados para generar claves hijas, como se ve a continuación.

La clave pública del padre, el código de cadena, y el número de índice se combinan y se hace hash con el algoritmo HMAC-SHA512 para producir un hash de 512 bits. El hash resultante se divide en dos mitades. La mitad derecha de 256 bits de la salida de hash se convierten en el código de cadena para el hijo. Los 256 bits de la mitad izquierda del hash y el número de índice se agregan a la clave privada de los padres par a producir la clave privada del hijo. En Extendiendo una clave privada padre para crear una clave privada hijo, vemos esto ilustrado con el conjunto de índices a 0 para producir el hijo del padre de orden 0 (primero del índice).

Cambiar el indice nos permite ampliar el padre y crear los otros hijos en la secuencia, por ejemplo, Hijo 0, Hijo 1, Hijo 2, etc. Cada clave padre puede tener 2 mil millones de claves hijas.

Repitiendo el proceso en un nivel inferior del árbol, cada hijo puede a su vez convertirse en un padre y crear sus propios hijos, en un número infinito de generaciones.

Usando claves hijas derivadas

Las claves privadas hijas son indistinguibles de las claves no deterministas (aleatorias). Debido a que la función de derivación es una función de un solo sentido, la clave hija no puede ser usada para encontrar la clave principal. La clave hija tampoco se puede utilizar para encontrar ningún hermano.

Si usted tiene el hijo n-ésimo, usted no puede encontrar sus hermanos, como el hijo n-1 o el hijo n+1, o cualquier otro hijo que forme parte de la secuencia. Sólo la clave principal y el código de cadena pueden derivar todos los hijos. Sin el código de cadena del hijo, tampoco se puede usar la clave hija para derivar ninguno de los nietos. Es necesario tanto la clave privada del hijo como el código de cadena del hijo para iniciar una nueva rama y derivar nietos.

Entonces, ¿para qué se puede utilizar la clave privada hijo por sí sola? Se puede utilizar para crear una clave pública y una dirección bitcoin. Después, se puede utilizar para firmar transacciones para gastar lo que se haya pagado a esa dirección.

Una clave privada del hijo, la clave pública correspondiente, y la dirección bitcoin son indistinguibles de las claves y las direcciones creadas aleatoriamente. El hecho de que son parte de una secuencia no es visible, fuera de la función de la cartera HD que los creó. Una vez creadas, funcionan exactamente como claves «normales».

Ir a la siguiente página

Report Page