Welchen BIP32-Ableitungspfad verwendet Electrum?

Electrum 2.0 und höher verwendet BIP0032 intern. Ich möchte Code schreiben, der dieselben Adressen generiert. Ich finde online keine Informationen dazu.

Welche BIP32-Pfade werden zum Generieren von Adressen verwendet?

Antworten (3)

Es wird m/0/<n>zum Empfangen von Adressen und m/1/<n>zum Ändern von Adressen verwendet.

Hier ist ein Beispiel-Bitcoinj-Code zum Generieren von Empfangsadressen aus einem erweiterten öffentlichen Schlüssel.

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 Lustige Sache: Ich habe das gleich gesehen, nachdem ich es ausgearbeitet hatte, indem ich den Quellcode gelesen hatte. "BIP32-Ableitungspfad" ist aus irgendeinem Grund völlig ungooglebar.
Nur als zukünftige Referenz habe ich hier eine Liste mit deterministischen Wallet-Details, einschließlich BIP-32-Ableitungspfaden, geführt: bitcointalk.org/index.php?topic=1000544.0
@ChristopherGurnee Sie, Sir, sind ein Gentleman und ein Gelehrter.
@NickODell Danke für deine Antwort. Ich habe auch eine weitere gültige Antwort erstellt (um anderen basierend auf Ihrer zu helfen), indem ich das Paket nodejs bitcoinjs verwendet und 5 Empfangs- und Änderungsadressen abgeleitet habe.

Inspiriert von @NickODell answer habe ich ein weiteres Beispiel mit nodejs erstellt, das 5 Empfangsadressen und 5 Änderungsadressen ableitet.

Sie benötigen diese beiden Module: npm install bitcoinjs-lib --saveund npm install bip32-utils --saveund babelfür die es6Unterstützung des Javascript-Codes.

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();
}

Getestet in Elektrum mit einer echten Brieftasche.

Wenn Sie kein Wallet mit mehreren Konten haben, können Sie diese BIP32-Pfade verwenden, um Adressen zu generieren:

m/0/kentspricht dem k-ten Schlüsselpaar der externen Kette des HDW, abgeleitet von Master m.

m/1/kentspricht dem k-ten Schlüsselpaar der internen Kette des HDW, abgeleitet von Master m. (intern, bedeutet Änderung und andere interne Verwendungen)

Wenn Sie jedoch eine Brieftasche mit mehreren Konten verwenden möchten, z. B. eines für jeden Kunden, sind die Pfade eher wie folgt:

m/i/0/kentspricht dem k-ten Schlüsselpaar der von Master m abgeleiteten externen Kontokette Nummer i des HDW.

m/i/1/kentspricht dem k-ten Schlüsselpaar der vom Master m abgeleiteten internen Kette der Kontennummer i des HDW.

Dies ist das Standard-Wallet-Layout:

Wallet-Struktur

Das sieht nach einem coolen Stück Code aus, aber ich kann ehrlich gesagt nicht sagen, dass es die Frage beantwortet (Ableitungspfade werden nicht erwähnt). Dies wäre wahrscheinlich eher als Kommentar geeignet, der auf einen Github-Gist oder ähnliches verweist.
Sicher, du hast Recht. Die Pfade sind im Code aber nicht korrekt kommentiert. bearbeitete die Antwort.

TL;DR:

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

Vor einigen Tagen hatte ich genau die gleiche Frage, also beendete ich das Schreiben dieses kleinen nodejs-Moduls, das so ziemlich dasselbe tut, was Sie in der Antwort von @pedro_fp_simoes lesen können:

https://www.npmjs.com/package/xpub-generator Sie können es wie folgt verwenden:

import { XPubGenerator } from 'xpub-generator';

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