Glosario / Direcciones y claves
Índice de clave
- ¿Qué es el índice de clave?
- El índice de clave es el número que se elige en cada paso de una derivación HD, de 0 a 4.294.967.295, y que decide a qué clave hija de una clave padre se llega.
Se especifica en el BIP-32.
Los índices son la forma en que cuenta una billetera. Cada nivel del árbol usa un número de 32 bits, así que una sola clave padre tiene 4.294.967.296 claves hijas posibles, y toda la mitad superior de ese rango, desde 2.147.483.648 en adelante, está reservada para la derivación endurecida. En el uso diario solo se ve el último índice de una ruta: el que sube cada vez que se pulsa recibir.
Cómo funciona
El índice es lo único que difiere entre una clave hija y la siguiente. Durante la derivación se serializa como un número de cuatro bytes en big endian (el byte más significativo primero) y se añade al material de la clave padre antes de calcular el hash, de modo que el índice 0 y el índice 1 producen resultados sin ninguna relación visible entre sí. Nada más cambia en ese paso.
El rango se divide en dos en 2.147.483.648. Por debajo de esa línea la derivación es normal, y una clave pública extendida padre basta para calcular la clave pública hija sin ningún secreto. En esa línea o por encima de ella la derivación es endurecida: la clave privada padre tiene que intervenir, y el material público por sí solo no produce nada. La notación oculta la aritmética: escribir 84' u 84h significa el índice 2.147.483.732, que es 84 más el desplazamiento de endurecimiento.
Dos notaciones para lo mismo causan más confusión de la que deberían. La documentación más antigua y la mayoría de las pantallas de billetera usan el apóstrofo, como en m/84'/0'/0', mientras que los descriptores que imprime Bitcoin Core prefieren m/84h/0h/0h. Son idénticas. La forma con letra existe porque un apóstrofo dentro de un argumento de la línea de comandos es un riesgo al entrecomillar, y pegarlo en bitcoin-cli falla de formas molestas de depurar.
Dónde aparece
El último número de una ruta es el índice que se ve a diario. En m/84h/0h/0h/0/7, el 0 selecciona la cadena de recepción y el 7 marca la octava dirección que ha entregado la billetera, contando desde cero. El cambio tiene su propio contador en la cadena 1, así que la primera salida de cambio de una billetera recién creada cae en m/84h/0h/0h/1/0, y los dos contadores avanzan de forma independiente.
El conteo secuencial es lo que hace posible la recuperación, y también lo que la hace fallar. BIP-44 indica a una billetera que se está restaurando que derive hacia adelante a lo largo de 20 direcciones sin usar consecutivas y que después deje de buscar, así que unas monedas recibidas en el índice 45, con un largo tramo vacío antes de ellas, aparecerán como un saldo cero hasta que usted suba a mano el límite de brecha (gap limit). Bitcoin Core esquiva la cuestión manteniendo una reserva de claves derivadas de antemano, 1.000 de forma predeterminada, que va reponiendo a medida que se consumen.
El descubrimiento funciona igual un nivel más arriba. Una billetera que se está restaurando revisa la cuenta 0', encuentra historial, pasa a la cuenta 1' y se detiene en la primera cuenta sin ninguna transacción. Por eso, crear la cuenta 5' y dejar vacías las cuentas que hay por debajo es una forma fiable de lograr que una futura restauración pase por alto sus monedas.
Índice de clave frente a ruta de derivación
Un índice es un número; una ruta es la lista ordenada de ellos. m/84h/0h/0h/0/7 contiene cinco índices, y en el uso normal solo se mueve el último, porque el propósito, el tipo de moneda, la cuenta y la cadena permanecen fijos durante toda la vida de la billetera. La distinción importa cuando un artículo de ayuda le pide que compruebe su ruta de derivación. Se refiere al prefijo fijo, no al contador de direcciones, y por más veces que pulse recibir no rescatará un saldo que falta porque el prefijo era incorrecto.