bitcoinjs / bip39

JavaScript implementation of Bitcoin BIP39: Mnemonic code for generating deterministic keys
ISC License
1.11k stars 447 forks source link

Is the seed the same as the private key? #67

Closed arshbot closed 6 years ago

arshbot commented 6 years ago

I'm attempting to generate the private key (not the extended private key, although if the path to generating the private key is through that then that'd be interesting). However I'm having a lot of difficulty.

Is the seed generated from mneumonicToSeed or mneumonicToSeedHex considered a private key or master private key? Does this definition differ between different currencies? i.e. Bitcoin and Ethereum?

dcousens commented 6 years ago

Is the seed generated from mneumonicToSeed or mneumonicToSeedHex considering a private key

No

or master private key?

No

The seed is 64-bytes in length, and is used as entropy for private key generation. Private keys are 32-bytes in length, and have some numerical constraints.

arshbot commented 6 years ago

Okay thanks. Do you know how I'd generate a private key from the seed?

dcousens commented 6 years ago

BIP32 does the following:

  let I = crypto.hmacSHA512('Bitcoin seed', seed)
  let IL = I.slice(0, 32)

Where IL is the private key (which is checked to be in the range [0, n]. If you intend to use the BIP32 standard, I'd suggest using a library to do this for you.

arshbot commented 6 years ago

Huh, so the private key is just half the seed? (Assuming the seed is 64 bits) I've found a ton of libraries that do this really well, but I'm really trying to perform stuff like privkey, address generation as manually as I can without performing intricate math myself.

dcousens commented 6 years ago

Huh, so the private key is just half the seed?

Indeed, after being HMAC'd. You could simply do a .slice too, or you could HMAC-SHA256, or, or, or.

arshbot commented 6 years ago

What's done with the right half of the seed if it isn't useful in recreating the wallet's functionality later on?

dcousens commented 6 years ago

@arshbot for BIP32, it is used as the chainCode, which is used in deriving BIP32 child nodes.