Electrum 2.0 и выше использует внутри себя BIP0032 . Я хочу написать код, который генерирует те же адреса. Я не могу найти информацию об этом в Интернете.
Какие пути BIP32 он использует для генерации адресов?
Он используется 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();
Вдохновленный ответом @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.
Это макет кошелька по умолчанию:
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);
Волшебник Оззи
Ник Оделл
Кристофер Герни
Ник Оделл
joe.js
Педро Симойнс