Search code examples
cryptographybitcoinblockchainnbitcoin

NBitcoin and Mnemonic Standards


I am very new to Bitcoin development so forgive me...

I'm using NBitcoin in a .Net console app to generate a master key using a mnemonic and then derive hierarchical keys. Here is the code I am using:

Mnemonic mnemo = new Mnemonic(Wordlist.English, WordCount.Twelve);
ExtKey hdroot = mnemo.DeriveExtKey();
var wif = hdroot.GetWif(Network.Main);
var defaultAddress = hdroot.Derive(new KeyPath("m/0/0"));

Here is the Mnemonic I get as a result, as wells as a public address derived from the master key using the "m/0/0" path:

Mnemonic: dry brown drive parade drastic shine embrace hard report loan fold iron

Path: m/0/0/: 1GcchMaHAN1XRQsoi8gPg8TShqzN4sNGvu

I tested recreating my keys using the mnemonic and was always able to derive the same exact keys as expected within my console app.

Being curious I wanted to see if I could import this mnemonic into existing wallet software and get the same keys as well. Since the Exodus wallet uses a standard twelve word mnemonic I fired it up and generated my wallet using the same mnemonic. However none of the keys match up! I exported my public key and made sure it was the same path of "m/0/0" from the master. As you can see it is NOT a match:

Exported public key from Exodus using the same mnemonic:

Mnemonic: dry brown drive parade drastic shine embrace hard report loan fold iron

Address: 1DMDJ266gxMCJiTcWk5MZFbfxxx4Ss3URN

Path: m/0/0

I also tested the mnemonic on Jaxx as well as the the Coinomi wallet on Android and it derived the same keys as Exodus does.

So I am completly confused. The only thing I can think of is that there is a standard entropy that these wallets use that is missing from my implementation?

My question is, how can I use NBitcoin to create the same mnemonic standrad that wallets like Exodus, Coinomi and Jaxx use?


Solution

  • 1DMD is generated by the path m/44'/0'/0'/0/0

    try this:

    Mnemonic mnemo = new Mnemonic("dry brown drive parade drastic shine embrace hard report loan fold iron",Wordlist.English);
    ExtKey hdroot = mnemo.DeriveExtKey();
    var firstprivkey = hdroot.Derive(new KeyPath("m/44'/0'/0'/0/0"));
    var firstpubKey = firstprivkey.Neuter().PubKey;
    return firstpubKey.GetAddress(Network.Main).ToString();