bip 32 hd wallets – How can I switch from BIP32 to BIP44 with bitcoinj?

Checkout Bitcoinj master branch


    Wallet walletBip39 = Wallet.fromSeed(params, seed);

    Wallet walletBip44 = Wallet.fromSeed(params, seed, ImmutableList.of(new ChildNumber(44, true), new ChildNumber(0, true), ChildNumber.ZERO_HARDENED, ChildNumber.ZERO));

bip44 – Testnet addresses fail in Explorer

I have generated a test network address like this:

const btc = require('bitcoinjs-lib');
const bip32 = require('bip32');
const bip39 = require('bip39');

var root = bip32.fromSeed(
var pubkey = root.derivePath("m/44'/1'/0'/0/0").publicKey;

and for my problems I end up with this value: 14kwGTShacA5hT4uAes7dkNvreuHXuRRf7

However, when I test this with BlockCypher (or or another explorer) it doesn't seem to recognize it:



{"error": "Address 14kwGTShacA5hT4uAes7dkNvreuHXuRRf7 incompatible
with current block chain: BTC.test3 "}

Note that according to BIP44, the derivation path for testnet coins is m/44'/1' against m/44/0' for mainnet

so what's going on here?

supports bitcoin core 0.18 bip44, bip39 (HD wallet)

I am new to Bitcoin. Problems with the implementation of the HD wallet. Goggled for the same, but did not get satisfied response. Can we create multiple seeds in a Bitcoin core server?
If so, how can we manage the private key of each generated seed?
If not, how can we create a custom derivation path?

Note: I use the json rpc protocol to communicate with the bitcoin core.

Bitcoin Core 0.18 support BIP44, BIP39 (HD Wallet)

I am new to Bitcoin. Problems with the implementation of the HD wallet. Goggled for the same, but did not get satisfied response. Can someone help me with the following questions?

  1. Can we create multiple seeds in a Bitcoin core server?
    If so, how can we manage the private key of each generated seed?
    If not, how can we create a custom derivation path?
  2. How we can generate multiple addresses is part of the account and the calculation of the
    Balance of this account?
  3. If Bitcoin-Core does not support BIP-44, is there another node?

Note: I use the json rpc protocol to communicate with the bitcoin core.

Hardened address generation with BIP44 watch-only wallet with xpub

I am amazed at the hard key derivation from a BIP44 wallet, which is intended only for watches.

Let me first explain what I am trying to do.

  • I implement a 2-out-of-3 multisig scheme
  • I use Bcoin Node and Wallet
  • All 3 keys are generated externally
  • I would like to use the wallet only for watches from Bcoin

Create addresses and scripts

I have done so far:

  1. Create 3 xprv keys and xpubs keys with this tool
  2. I used Custome Path m/44'/0'/0' hardened keys, because Bcoin Wallet requires hardened BIP44 keys
  3. I created 3 Only to see Wallets with the xpub Key.
  4. Then I added each of the keys as shared keys (I really just have to do this for a wallet)

The code is as follows:

const HSM_accountKey = "xpub_HSM...."
const IC_accountKey = "xpub_IC..."
const Paper_accountKey = "xpub_Paper..."

const result_wallet_HSM = await walletClient.createWallet('wallet_HSM', options_wallet);
const result_wallet_IC = await walletClient.createWallet('wallet_IC', options_wallet);
const result_wallet_Paper = await walletClient.createWallet('wallet_Paper', options_wallet);

const wallet_IC_account = await wallet_IC.getAccount('default');
const wallet_Paper_account = await wallet_Paper.getAccount('default');
const result_addkey1 = await wallet_HSM.addSharedKey('default', wallet_IC_account.accountKey);
const result_addkey2 = await wallet_HSM.addSharedKey('default', wallet_Paper_account.accountKey);

Now I have created a pure 2-out-of-3 multisig wallet.
What I want to do now is to create addresses. I do not want to derive any extended child keys anymore. I only need one derivation step.
Now I want to create multisig addresses for my users.

// Create addresses from each wallet
const wallet_HSM_address = await wallet_HSM.createAddress('default');
const wallet_IC_address = await wallet_IC.createAddress('default');
const wallet_Paper_address = await wallet_Paper.createAddress('default');

// Keyrings for script generation
const keyring_HSM = KeyRing.fromJSON(wallet_HSM_address);
const keyring_IC = KeyRing.fromJSON(wallet_IC_address);
const keyring_Paper = KeyRing.fromJSON(wallet_Paper_address);

//Get the pubkeys from each wallet
const pubKeys = (keyring_HSM.publicKey, keyring_HSM.publicKey, keyring_Paper.publicKey);

const multiSigScript = Script.fromMultisig(m, n, pubKeys);
const receivingAddress = multiSigScript.getAddress().toBase58(network); 

I feel like I'm taking this step on a straight line, but you get what I'm trying to do.

To redeliver I would now like to create individual receive addresses for my users and the corresponding P2SH scripts.

Well, that's what I need help in understanding,

  • According to BIP32, you can not use CDKpub to derive hardened public keys. You need the xprv to derive subkeys.
  • However, I can deduce public children's keys from what I have done. I've sent tesetnet coins to these addresses (receivingAddress in the above code) and they work. The wallet receives coins.
  • How was it possible to use the watch-only wallet to create hardened public children's keys? I did not enter xprv to the wallet.
  • Or is it that I did NOT create a secured public child key when using the path? m/44'/0'/0'?
    Is the receivingAddress I do not create any hardened in the above code? That is, when someone is able to find the private child keys of a user and the user xpub, will you be able to derive all private chile keys?

I apologize for the long question. I'm a bit confused about how the wallets can create public children's keys without having a private key in their wallet.

Many Thanks.

Bitcoin core – BIP44: What are internal addresses used for?

I've read other questions (and their answers), but I still do not see any use for internal addresses. I understand that you should send the change to a transaction there, but I do not see how you benefit from it. All you do is move your remaining money to an address, right? And you can just as easily transfer your money to a new external address. I understand that it is about using an address only once, but this can also be done with external addresses.

I hope someone can explain what advantages internal addresses have.

Thank you in advance!

HD Wallet – BIP44 and change addresses

Why is it recommended in some wallets not to use internal addresses to get money?

From this article to HD Wallets

Then we have the chain node derived from a path of 0 or 1. 0 is the external key pair string and is used to generate new public addresses. 1 is the internal keyring and is used, for example, to change addresses (in Bitcoin, each transaction must have an address to which the excess amounts are to be sent.) The "change" of the transaction) … This is because this is is a derivation path that was formally used by the various cryptographic communities. This is important because if I wanted to, I could create my own tree according to any standard created and create and sign valid transactions with the public / private keys. But could another wallet ever regenerate this structure? What happens if my app is marketed? The user's money is stored in a completely arbitrary private / public key tree. Not the best situation you are in. Therefore, we stick to these artifacts of the past, because one or two additional derivatives are a low price for consensus.

TLDR: It's for organizational reasons. For reasons of consensus, Wallet developers are following the lead path of BIP44 regardless of currency. Ethereum HD wallets do not make sense to use them account Field because addresses are already in Ethereum accounts, but some wallets.