Glosario / Direcciones y claves
Derivación BIP-49
- ¿Qué es la derivación BIP-49?
- La derivación BIP-49 coloca las cuentas SegWit anidadas en su propia rama, en m/49'/0'/0', de modo que una billetera que no puede leerlas no muestra nada en lugar de un saldo erróneo.
Se especifica en el BIP-49.
BIP-49 reserva el primer nivel endurecido del árbol de claves, 49', para las cuentas cuyas direcciones son P2WPKH anidado dentro de P2SH. Se asignó el 19 de mayo de 2016 y más tarde obtuvo sus propios bytes de versión de clave extendida, 0x049d7cb2 para ypub y 0x049d7878 para yprv. Si su billetera exporta una clave de cuenta que empieza por ypub, esa es la rama que una restauración tiene que recorrer.
Cómo funciona
BIP-49 resuelve dos cuestiones: qué rama de un árbol BIP-32 guarda las claves de SegWit anidado y cómo se construye una dirección a partir de una clave de esa rama.
La rama toma prestada la plantilla de cinco niveles que ya usaba BIP-44, m / purpose' / coin_type' / account' / change / address_index, y cambia exactamente un número. El propósito pasa a ser 49' en lugar de 44'. El tipo de moneda, la cuenta, la cadena y el índice conservan los significados que les dio BIP-44.
La mitad dedicada a la dirección es mecánica: se calcula el hash de la clave pública comprimida, se envuelve el resultado de 20 bytes en un script de canje de 22 bytes y luego se calcula el hash de ese script para obtener lo que la salida fija. La especificación escribe las dos piezas como scriptSig: 0x160014{20-byte-key-hash} y scriptPubKey: 0xA914{20-byte-script-hash}87.
Lo interesante es la opción que el autor rechazó. Weigl enumera dos enfoques: conservar la cuenta que ya se tiene y colgar direcciones SegWit anidadas de las mismas claves públicas, o crear cuentas dedicadas bajo un nuevo propósito. El primero es más cómodo hasta que algo sale mal, y entonces, en palabras de la especificación, la cuenta "might show up but also it might miss some UTXOs". BIP-49 eligió cuentas dedicadas precisamente porque esa opción "fails in a more visible way". Una pantalla vacía es un mensaje de error mejor que un número equivocado pero plausible.
La serialización recibió el mismo trato, con el tiempo: las claves públicas extendidas de esta rama usan los bytes de versión 0x049d7cb2, que en base58 se codifican con el prefijo ypub, con 0x049d7878 para yprv, y upub y uprv en la testnet.
Dónde aparece
BIP-49 aparece como una clave extendida que empieza por ypub en lugar de xpub, y como la cuenta SegWit anidada que una billetera muestra junto a la nativa. Mycelium, calificada con 3,7 en este sitio, lleva cuentas SegWit nativas y anidadas en una sola aplicación, los dos esquemas que SLIP-0132 registra bajo zpub y ypub.
El prefijo ypub fue un añadido posterior, y esa historia todavía se nota. BIP-43, que inventó el nivel de propósito en 2014, indicó a los implementadores que mantuvieran 0x0488B21E y el prefijo xpub para todos los propósitos. BIP-49 salió así al principio, y SLIP-0132, creado el 8 de febrero de 2018 para registrar los bytes de versión como es debido, describe el resultado sin rodeos: el prefijo sin cambios llevó a "unsustainable user confusion", porque o bien el usuario tenía que recordar de qué rama venía una xpub, o bien la herramienta receptora tenía que escanear ambos espacios de direcciones. Un prefijo es una pista, no una garantía. Si pega una clave extendida en un explorador de bloques y este deriva direcciones que empiezan por 1 mientras su billetera muestra direcciones que empiezan por 3, lo que tiene es una clave BIP-49 con el prefijo antiguo, y hay que indicarle la ruta a mano a la herramienta.
La especificación incluye un vector de prueba para la testnet con el que conviene comprobar una herramienta: la frase abandon repetida once veces seguida de about, raíz de la cuenta m/49'/1'/0', primera dirección de recepción 2Mww8dCYPUpKHofjgcXcBCEGmniw9CoaiD2.
Derivación BIP-49 frente a SegWit anidado
La derivación BIP-49 es una regla sobre claves, y SegWit anidado es un patrón que ve la cadena; los dos suelen ir juntos, pero ninguno implica el otro. Una salida es SegWit anidado por el script que esta fija, y nada en ella registra qué ruta produjo la clave. Una billetera puede construir una a partir de una clave privada importada, o con el enfoque que BIP-49 rechazó, que derivaba una segunda dirección P2SH de claves públicas que ya estaban en una cuenta BIP-44. Saber que sus monedas están en direcciones que empiezan por 3 no le dice, por tanto, dónde restaurar, y por eso la ruta de la cuenta debe figurar en sus notas junto al respaldo de la semilla.