¿Qué ruta de derivación BIP32 utiliza Electrum?

Electrum 2.0 y versiones posteriores utilizan BIP0032 internamente. Quiero escribir código que genere las mismas direcciones. No puedo encontrar ninguna información sobre esto en línea.

¿Qué rutas BIP32 utiliza para generar direcciones?

Respuestas (3)

Se utiliza m/0/<n>para recibir direcciones y m/1/<n>para cambiar direcciones.

Aquí hay un ejemplo de código bitcoinj para generar direcciones de recepción a partir de una clave pública extendida.

String serialized_xpub = "xpub.....";
unsigned int address_num = 4;
NetworkParameters params = MainNetParams.get();
DeterministicKey root_xpub = DeterministicKey.deserializeB58(null, serialized_xpub, params);

DeterministicKey receiving = HDKeyDerivation.deriveChildKey(root_xpub, new ChildNumber(0, false));
DeterministicKey new_address_key = HDKeyDerivation.deriveChildKey(receiving, new ChildNumber(address_num, false));
String new_address = new_address_key.toAddress().toString();
@WizardOfOzzie Cosa divertida: lo vi justo después de resolverlo leyendo el código fuente. La "ruta de derivación BIP32" no se puede buscar en Google, por alguna razón.
Solo para futuras referencias, he mantenido una lista de detalles deterministas de billeteras, incluidas las rutas de derivación de BIP-32, aquí: bitcointalk.org/index.php?topic=1000544.0
@ChristopherGurnee Usted, señor, es un caballero y un erudito.
@NickODell Gracias por tu respuesta. También creé otra respuesta válida (para ayudar a otros en función de la suya) usando el paquete nodejs bitcoinjs, derivando 5 direcciones de recepción y cambio.

Inspirándome en la respuesta de @NickODell, creé otro ejemplo usando nodejs que deriva 5 direcciones de recepción y 5 direcciones de cambio.

Necesitará estos dos módulos: npm install bitcoinjs-lib --savey npm install bip32-utils --savey babelpara el es6soporte del código javascript.

import Bitcoin from 'bitcoinjs-lib';
import Bip32Utils from 'bip32-utils';

let hdNode = Bitcoin.HDNode.fromBase58('xpub...get.the.master.public.key.from.a.wallet.like.electrum...');

let receiving = hdNode.derive(0); // BIP32 m/0/<n> path (receiving addresses)
let receivingChain = new Bip32Utils.Chain(receiving);

for (var k = 0; k < 5; ++k) {
    console.log(receivingChain.get());
    receivingChain.next();
}

let change = hdNode.derive(1); // BIP32 m/1/<n> path (change addresses)
let changeChain = new Bip32Utils.Chain(change);

for (var k = 0; k < 5; ++k) {
    console.log(changeChain.get());
    changeChain.next();
}

Probado en electrum con una billetera real.

Cuando no tiene una billetera de múltiples cuentas, puede usar estas rutas BIP32 para generar direcciones:

m/0/kcorresponde al k'ésimo par de claves de la cadena externa del HDW derivado del maestro m.

m/1/kcorresponde al k'ésimo par de claves de la cadena interna del HDW derivado del maestro m. (interno, significa cambio y otros usos internos)

Pero cuando desea usar una billetera con varias cuentas, por ejemplo, una para cada cliente, las rutas son más como esta:

m/i/0/kcorresponde al k'ésimo par de claves de la cadena externa del número de cuenta i del HDW derivado del maestro m.

m/i/1/kcorresponde al k'ésimo par de claves de la cadena interna del número de cuenta i del HDW derivado del maestro m.

Este es el diseño de billetera predeterminado:

Estructura de la billetera

Esto parece un código genial, pero honestamente no puedo decir que responda la pregunta (no se mencionan las rutas de derivación). Esto probablemente sería más adecuado como un enlace de comentario a una esencia de github o algo así.
Claro, tienes razón. Las rutas están en el código pero no están correctamente comentadas. editado la respuesta.

TL;RD:

BIP32 m/0/<n> path (receiving addresses)
BIP32 m/1/<n> path (change addresses)

Hace algunos días tuve la misma pregunta, así que terminé de escribir este pequeño módulo de nodejs que hace más o menos lo mismo que puedes leer en la respuesta de @pedro_fp_simoes:

https://www.npmjs.com/package/xpub-generator Puede usarlo de la siguiente manera:

import { XPubGenerator } from 'xpub-generator';

const g = new XPubGenerator('xpub....');
g.nthReceiving(1);
g.nthChange(1);