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?
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();
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 --save
y npm install bip32-utils --save
y babel
para el es6
soporte 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/k
corresponde al k'ésimo par de claves de la cadena externa del HDW derivado del maestro m.
m/1/k
corresponde 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/k
corresponde 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/k
corresponde 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:
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);
mago de ozzie
Nick ODell
Christopher Gurnee
Nick ODell
joe.js
Pedro Simões