Generating mnemonic phrase through CLI


#1

It seems like I can generate a wallet using the Cardano SL API by feeding an existing 12 word mnemonic string to it and using this module: https://cardanodocs.com/technical/wallet/api/#/default/post_api_wallets_new

If you use the Daedalus GUI, it generates a 12 word mnemonic for you.

Is there a way to generate the mnemonic through the Cardano SL without using a GUI? Or do I need to build my own function outside of the official tools which will generate a 12 word mnemonic that works with Cardano?

As far as I can tell, the “–backup-phrase PHRASE” option is just for implementing an already existing mnemonic.


#2

Yes. There is a static mnemonic’s set https://github.com/input-output-hk/cardano-sl/blob/develop/wallet/src/Pos/Util/Mnemonics.hs#L142-L485


Internal error occured: DecodeError "(in 'passphrase' field) suffix is not in base-16 format:
#3

Awesome! Thank you!

So, I should be able to write a function that randomly chooses 12 of these words to create wallet phrase strings, right?


#4

I think so.


#5

I just came across this:
https://cardanodocs.com/technical/wallet/api/v1/#section/Mnemonic-Codes

It states, “Note that picking up 12 random words from the list is not enough and leads to poor security”. So, I guess this is not advised? Although I’m a little confused as to why the list even exists in that case.


#6

It’s not recommended at all. You need proper randomness to protect your wallet. Choosing 12 words by yourself is not a proper one.


#7

So, the preferred method is to use a larger dictionary then?


#8

What do you mean by “larger dictionary”? There are exactly 2048 words that may be used as a mnemonic, as can be seen in this list: https://github.com/bitcoin/bips/blob/master/bip-0039/english.txt

Furthermore - not all word combinations may be used as a wallet. There’s a special property of the checksum that must be held. Only about 1 in each 256 combinations may be used as a valid wallet.

BIP39 mnemonics are secondary and are obtained from generated randomness as explained in this document: https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki

So just trying to select 12 words from the list might work, but not a proper way to create wallets. Proper algorithm looks somewhat like this:

  1. Generate 128 bits of randomness
  2. Calculate checksum of the resulting bytestring
  3. Take first 4 bits of the checksum and append them to the original randomness
  4. That will give you the bytestring of 132 bits
  5. Split 132 bits into 12 groups of 11 bits
  6. Convert each 11-bit word to a decimal number
  7. That will give you 12 numbers between 0 and 2047
  8. Use standard list or words to select 12 mnemonic words for each number (by index)

That will give you 12 words that you can send to the wallet creation API. You probably might easily find existing BIP39 library for any language of your choice that will allow you to generate those words, or at least indexes.

Generating proper randomness is not that trivial! Put some thought into how you’re going to to this part.


#9

Print out a program called diceware. It is a lot of pages. You roll dice to generate random phrases. I recommend printing it and actually rolling dice rather than using the online generator. I sometimes do that to create high entropy pass phrases since keefox doesn’t have that option.
Of course Daedalus creates a secure mnemonic for you anyway - so why bother ?

http://world.std.com/~reinhold/diceware.html

That will be random but as per


#10

I appreciate the helpful responses!


#11

https://github.com/input-output-hk/cardano-sl/blob/develop/wallet/src/Pos/Util/Mnemonic.hs is the updated link.