Какой путь вывода BIP32 использует Electrum?

Electrum 2.0 и выше использует внутри себя BIP0032 . Я хочу написать код, который генерирует те же адреса. Я не могу найти информацию об этом в Интернете.

Какие пути BIP32 он использует для генерации адресов?

Ответы (3)

Он используется m/0/<n>для получения адресов и m/1/<n>для смены адреса.

Вот пример кода bitcoinj для генерации адресов приема из расширенного открытого ключа.

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 Забавно: я увидел это сразу после того, как разобрался, прочитав исходный код. «Путь вывода BIP32» по какой-то причине совершенно не доступен для Google.
Просто для справки в будущем я веду список детерминированных деталей кошелька, включая пути деривации BIP-32, здесь: bitcointalk.org/index.php?topic=1000544.0
@ChristopherGurnee Вы, сэр, джентльмен и ученый.
а для мультисиг? bitcoin.stackexchange.com/questions/51989/…
@NickODell Спасибо за ваш ответ. Я также создал еще один правильный ответ (чтобы помочь другим на основе вашего), используя пакет nodejs bitcoinjs, получив 5 адресов получения и изменения.

Вдохновленный ответом @NickODell, я создал еще один пример, используя nodejs, который выводит 5 адресов получения и 5 адресов изменения.

Вам понадобятся эти два модуля: npm install bitcoinjs-lib --saveи npm install bip32-utils --saveи babelдля es6поддержки кода 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();
}

Протестировано в электруме с настоящим кошельком.

Если у вас нет кошелька с несколькими учетными записями, вы можете использовать эти пути BIP32 для создания адресов:

m/0/kсоответствует k-й паре ключей внешней цепочки HDW, полученной от мастера m.

m/1/kсоответствует k-й паре ключей внутренней цепочки HDW, полученной от мастера m. (внутренний, означает изменение и другое внутреннее использование)

Но когда вы хотите использовать кошелек с несколькими аккаунтами, например, по одному на каждого клиента, пути будут примерно такими:

m/i/0/kсоответствует k-й паре ключей внешней цепочки учетной записи номер i HDW, полученной от мастера m.

m/i/1/kсоответствует k-й паре ключей внутренней цепочки счетов номер i HDW, полученных от мастера m.

Это макет кошелька по умолчанию:

Структура кошелька

Это выглядит как крутой код, но я не могу честно сказать, что он отвечает на вопрос (нет упоминания о путях деривации). Это, вероятно, больше подходит в качестве комментария, ссылающегося на суть github или что-то в этом роде.
Конечно, вы правы. Пути есть в коде, но неправильно прокомментированы. отредактировал ответ.

TL;DR:

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

Несколько дней назад у меня был тот же самый вопрос, поэтому я закончил писать этот небольшой модуль nodejs, который делает почти то же самое, что вы можете прочитать в ответе @pedro_fp_simoes:

https://www.npmjs.com/package/xpub-generator Вы можете использовать его следующим образом:

import { XPubGenerator } from 'xpub-generator';

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