Saltar al contenido
buybitcoinsmart

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.

No confundir con

Preguntas frecuentes

¿Por qué mi clave pública extendida empieza por ypub en lugar de xpub?

Porque se serializó con los bytes de versión que BIP-49 asigna a esta rama, 0x049d7cb2, que en base58 se codifican como ypub. El prefijo es un rótulo del esquema de derivación, no un tipo distinto de clave, y SLIP-0132 lo registra junto a xpub y zpub.

¿Está BIP-49 marcado como obsoleto?

No. El propio encabezado del BIP sigue diciendo Deployed (desplegado), y las billeteras que crearon cuentas en la rama 49' siguen derivándolas con normalidad. Nada en la especificación retiró la rama, y no hace falta poner a salvo las monedas que están bajo ella.

¿Puedo saber por una dirección si salió de BIP-49?

No. Una salida P2SH solo registra el hash de script que esta fija, así que una dirección que empieza por 3 no revela nada sobre la ruta que hay detrás. Anote la ruta de la cuenta junto a su respaldo en lugar de intentar deducirla más tarde.

Para seguir leyendo

Términos relacionados

Más en la sección Direcciones y claves

Leer esta página en inglés