⚠️ ¡Advertencia! El siguiente artículo es un resumen sobre Mastering Ethereum, en consecuencia, me tomé la libertad de quitar las partes que no me parecieron relevantes y profundizar en lo que sí. Si tenés alguna sugerencia o corrección, no dudes en contactarme.
Wallets
Podríamos definir una wallet como una aplicación que funciona como interfaz para acceder a la red de Ethereum.
Si intentamos hacer una definición más estricta, dese el punto de vista de un desarrollador, es lo que controla el acceso a las claves privadas y, por lo tanto, a todos los activos relacionados con esa cuenta, así como la posibilidad de firmar en su nombre.
Nota: Existe la confusión de que la wallet contiene los tokens o ether dentro de ella, pero en realidad los tokens están en la blockchain, la wallet estrictamente contiene las claves privadas que controlan estos activos, así que, por tanto, por su funcionalidad se parecería más a un llavero.
Podemos clasificar a las wallets en dos tipos según su forma de ser creadas.
El primer tipo es una wallet no determinística, donde cada clave se genera independientemente a partir de un número aleatorio diferente, actualmente estas wallets no tienen mucho uso, se prefiere usar, en cambio, las wallets determinísticas, ya que las últimas tienen algunas propiedades que las hacen una mejor elección.
Es una wallet determinística, donde todas las claves se derivan de una única clave maestra, conocida como la semilla. Todas las claves en este tipo de billetera están relacionadas entre sí y pueden generarse nuevamente si se tiene la semilla original. Existen varios métodos de derivación de claves utilizados en las billeteras determinísticas. El método de derivación más comúnmente utilizado utiliza una estructura similar a un árbol, como se describe en Billeteras Determinísticas Jerárquicas (BIP-32/BIP-44).
Para hacer que las billeteras determinísticas sean ligeramente más seguras contra accidentes de pérdida de datos, como el robo de tu teléfono o dejarlo caer en el inodoro, las semillas a menudo se codifican como una lista de palabras (en inglés u otro idioma) para que las escribas y uses en caso de un accidente. Estas se conocen como mnemonic de la wallet.
En el siguiente capítulo vamos a profundizar en los pasos para generar una wallet determinista, pero primero para esto necesitamos tener un seed del cual derivar las claves privadas y públicas.
Seed y Mnemonics (BIP 39)
En términos generales, BIP 39 define una fórmula para:
1) la generación de un mnemonic (aka como frase semilla o de recuperacion).
2) la generación de una semilla a partir de esa frase mnemotécnica.
3) Esa semilla se utiliza para producir tus claves privadas y públicas.
¿Pero qué sentido tiene usar BIP 39? Bueno, es mucho más fácil guardar y recordar estas palabras sin equivocarse en un carácter que guardar esta semilla en formato hexadecimal, en resumen es una forma de convertir una semilla hexadecimal a algo más fácil de manejar para un humano.
// Mnemonic
indoor dish desk flag debris potato excuse depart ticket judge file exit
Bueno, es mucho más fácil guardar y recordar estas palabras sin equivocarse en un carácter que guardar esta semilla en formato hexadecimal, en resumen es una forma de convertir una semilla hexadecimal a algo más fácil de manejar para un humano.
// formato hexadecimal
3bd0bda567d4ea90f01e92d1921aacc5046128fd0e9bee96d070e1d606cb
79225ee3e488bf6c898a857b5f980070d4d4ce9adf07d73458a271846ef3a8415320
La fórmula es determinística, eso significa que el mismo mnemonic siempre va a producir el mismo seed de 512-bits. Incluso si tu dispositivo fuera robado o el promovedor de wallets dejara de existir, podrías recuperar la cuenta usando el mnemonic. También hay que considerar como mencionamos anteriormente con las claves privadas, que no debemos compartir el mnemonic y preferentemente mantenerlos almacenados en una copia de seguridad con papel y lápiz.
- Si querés probar el proceso en forma aplicada podés hacerlo ejecutando este jupiter notebook
- O podemos jugar en este sandbox de generación que tiene una interfaz más amable
Creación del Mnemonic
Las palabras mnemotécnicas se generan automáticamente por la billetera utilizando el proceso estandarizado definido en BIP-39. La billetera parte de una fuente de entropía, agrega un valor de comprobación y luego asigna la entropía a una lista de palabras:
- Lo primero que necesitaremos es ese número aleatorio, también conocido como entropía. La especificación BIP 39 establece que esta entropía solo puede venir en algunas dimensiones: múltiplos de 32 bits, entre 128 y 256. Cuanto mayor sea la entropía, más palabras mnemotécnicas se generarán y tendrá mayor seguridad.
- Luego hay que tomar la entropía y hashearla con SHA-256
- Tomamos los primeros 4 bytes del hash como ckechsum y agregamos el checksum al final de la entropía
- Dividimos todo en secciones de 11 bits.
- Asignamos a cada valor de 11 bits una palabra del diccionario predefinido de 2,048 palabras.
- Creamos el código mnemotécnico a partir de la secuencia de palabras, manteniendo el orden.
Bien generamos el mnemonic ahora vamos a usarlo para generar la seed en el siguiente paso.
Creación de la seed
Para crear nuestro seed vamos a tomar el mnemonic producido en el paso anterior, y generar un salt que luego vamos a pasar por una función PBKDF2 (Password-Based Key Derivation Function) .
7.Por un lado, tenemos nuestro mnemonic generado en paso anterior
8.A eso le sumamos un salt que se compone de la constante palabra “mnemonic” y un passphrase determinado por el usuario.
9.PBKDF2 toma el mnemonic y el salt y ejecuta 2,048 rondas de hash con el algoritmo HMAC-SHA512, produciendo un valor de 512 bits como su salida final. Ese valor de 512 bits es la semilla.
Creando HD Wallet (BIP 32 | BIP 44)
BIP 32 es utilizado por Bitcoin, Ethereum y otras blockchains para crear no solo un par de claves a partir de esa seed, sino más bien cuentas virtualmente ilimitadas, todas las cuales pueden ser recuperadas con solo un mnemonic o semilla.
BIP 44 estandariza una ruta para describir la intención de una cuenta particular. Esto terminará influyendo en cómo se derivan las claves secundarias.
Las HD(Hierarchical Deterministic) wallets se generan a partir de una única seed, comúnmente, esta semilla se genera a partir de una mnemonic como se detalla en la sección anterior.
Por defecto, la mayoría de los usuarios de Ethereum están utilizando una dirección con una ruta de derivación del tipo de m/44'/60'/0'/0/0
.
Pero vayamos campo por campo para entender lo que hace:
- Los apóstrofes (por ejemplo, en los tres primeros niveles) indican que el valor está hardened. Esta es una característica de seguridad de la que explicaremos más adelante.
m
— es una convención.44
—purpose
— esta ruta sigue el estándar BIP 44.60
—coin_type
— 60 indica la red Ethereum. La lista de “tipos de monedas registradas” se puede encontrar aquí.0
—account
— destinado a representar diferentes tipos de usuarios de billeteras. Por ejemplo, una empresa puede tener una rama de cuentas para un departamento de contabilidad y otra para un equipo de ventas. Es un índice basado en cero.0
—change
— esto se usa en Bitcoin que usa modeloUTXO
y requiere wallets para enviar el remanente de una transferencia si lo hubiera. Típicamente, permanece como0
para direcciones de Ethereum.0
—address_index
— finalmente, el índice de la cuenta que estás utilizando. También es un índice basado en cero, por lo que el índice0
es la primera cuenta disponible. Si tienes diez cuentas, la ruta de derivación de la última esm/44'/60'/0'/0/9
.
- Si querés probar la derivación de claves podés usar este jupiter notebook
- O podés derivarlas en el sandbox de generación que tiene una interfaz más amable
Hardened
¿Qué implica un hardened path? Es una característica de seguridad; las claves privadas se utilizan en la generación de claves hardened, mientras que las claves normales se generan utilizando claves públicas.
Las claves públicas extendidas normales (xpub
) pueden ser utilizadas para crear claves públicas hijas, por ejemplo. Un caso de uso comúnmente citado es proporcionar a una tienda en línea una clave pública extendida, que puede ser utilizada para derivar una nueva dirección pública hija para recibir fondos por cada venta. Ninguna clave privada reside nunca en el servidor, por lo que no hay riesgo de que se filtren si el servidor es comprometido.
Qué ventajas plantean las HD Wallets
1.Gestión de múltiples cuentas: Las HD Wallets te permiten manejar varias cuentas al mismo tiempo, sin necesidad de escribir todas las claves públicas y privadas manualmente. La estructura jerárquica facilita el seguimiento del saldo de todas las cuentas.
2.Privacidad: Otra ventaja importante de las HD Wallets es la privacidad. Puedes configurar una billetera temporal para una transacción única y gestionarla desde la misma interfaz que todas tus otras cuentas, manteniendo la privacidad de tu dirección maestra.
3.Restauración de cuentas: Si pierdes tus claves físicas, es imposible recuperar tus cuentas. Sin embargo, con las HD Wallets, solo necesitas cuidar la clave privada maestra para restaurar todas las cuentas en la billetera, incluso si están más abajo en la jerarquía. Esto se logra gracias a cómo funcionan las HD Wallets.
Clave privada y pública extendida
En la terminología de BIP-32, las claves pueden ser “extendidas”. Con las operaciones matemáticas adecuadas, estas claves “padre” extendidas pueden utilizarse para derivar claves “hijas”, produciendo así la jerarquía de claves y direcciones descrita anteriormente. Una clave padre no tiene que estar en la parte superior del árbol, puede ser seleccionada desde cualquier lugar en la jerarquía del árbol. Extender una clave implica tomar la propia clave y agregarle un código de cadena especial. Un código de cadena es una cadena binaria de 256 bits que se mezcla con cada clave para producir claves hijas.
Una característica muy útil de las billeteras HD es la capacidad de derivar claves públicas hijas a partir de claves públicas padre, sin tener las claves privadas. Esto nos da dos formas de derivar una clave pública hija: directamente desde la clave privada hija o desde la clave pública padre.
Por lo tanto, una clave pública extendida puede utilizarse para derivar todas las claves públicas (y solo las claves públicas) en esa rama de la estructura de la billetera HD. Las claves extendidas permiten derivar claves privadas y públicas a partir de ellas. Esto se hace utilizando el algoritmo descrito en BIP 32.
Conclusión
En resumen, las wallets son el fundamento de cualquier aplicación de blockchain. Permiten a los usuarios administrar grupos de claves privadas y direcciones. Las billeteras también permiten a los usuarios demostrar su propiedad de ether y autorizar transacciones mediante la aplicación de firmas digitales.
Referencias
1.Antonopoulos, A. M., & Wood, G. (2018). “Mastering Ethereum: Building Smart Contracts and DApps.” O’Reilly Media.
2.Wolovim. (s.f.). “Ethereum 201: HD Wallets.” Recuperado de https://wolovim.medium.com/ethereum-201-hd-wallets-11d0c93c87f7.
3.Wolovim. (s.f.). “Ethereum 201: Mnemonics.” Recuperado de https://wolovim.medium.com/ethereum-201-mnemonics-bb01a9108c38.
4.Bitcoin Stack Exchange. (s.f.). “What can I do with account extended private key and account extended public key?” Recuperado de https://bitcoin.stackexchange.com/questions/86089/what-can-i-do-with-account-extended-private-key-and-account-extended-public-key.
5.Ledger. (s.f.). “What are Hierarchical Deterministic (HD) Wallets?” Recuperado de https://www.ledger.com/academy/crypto/what-are-hierarchical-deterministic-hd-wallets.