1

I woud like to obtain an extended public key of a derivation path (m/84'/0'/0'). I'm using btclib, and I have the xpub of the root account.

When I try to use bip32.derive("xpub...","m/84'/0'/0'")

I get btclib.exceptions.BTClibValueError: invalid hardened derivation from public key

What am I doing wrong ?

Guillaume Paris
  • 159
  • 1
  • 8

1 Answers1

2

Review BIP32:

The fact that they are equivalent is what makes non-hardened keys useful (one can derive child public keys of a given parent key without knowing any private key), and also what distinguishes them from hardened keys. The reason for not always using non-hardened keys (which are more useful) is security; see further for more information.

That little apostrophe ' means that branch of the key derivation tree is "hardened" -- and THAT means that you must have the private key to derive its child keys.

So if you have the PRIVATE key for m/84'/0'/0' you can generate child keys for example m/84'/0'/0'/0 or m/84'/0'/0'/0' (these are two different keys, one is hardened the other is not).

If you were to derive the non-hardened key at m/84'/0'/0'/0 then you could use an xpub FROM THIS KEY (not any of the parent keys) to derive public child keys, without any private keys. Examples would be m/84'/0'/0'/0/0 and m/84'/0'/0'/0/1

pinhead
  • 5,144
  • 2
  • 24
  • 43
  • Thanks a lot for your answer. Just another precision: If I have ONLY the xpub key of the top account (the xpub key than can be exported from a Ledger wallet for instance), it is not possible to get the xpub key at m/84'/0'/0' with btclib derive function so. But can I get the xpub key at m/84'/0'/0'/0 (or m/84'/0'/0'/1) ? – Guillaume Paris Dec 19 '20 at 13:33
  • 1
    See https://github.com/bitcoin/bips/blob/master/bip-0084.mediawiki#public-key-derivation The xpub you get from a Ledger is (I'm pretty sure) at the account level. Meaning from there you can derive change and receive addresses like m/84'/0'/0'/0/0. What you should try with your library is to take the xpub and just derive the last two levels: xpub/0/0 – pinhead Dec 20 '20 at 03:10
  • More precisely bip32.derive("xpub...","/0") for receive addresses – Guillaume Paris Dec 20 '20 at 11:29