Master Derivation Key Functions
Description
Section titled “Description”This example demonstrates the master derivation key (MDK) alias functions and shows their equivalence to the core seed/mnemonic functions. Key concepts:
- masterDerivationKeyToMnemonic() is an alias for mnemonicFromSeed()
- mnemonicToMasterDerivationKey() is an alias for seedFromMnemonic()
- These aliases exist for wallet derivation workflows where the terminology “master derivation key” is more familiar than “seed”
Prerequisites
Section titled “Prerequisites”- No LocalNet required
Run This Example
Section titled “Run This Example”From the repository root:
cd examplesnpm run example algo25/04-master-derivation-key.ts/** * Example: Master Derivation Key Functions * * This example demonstrates the master derivation key (MDK) alias functions * and shows their equivalence to the core seed/mnemonic functions. * * Key concepts: * - masterDerivationKeyToMnemonic() is an alias for mnemonicFromSeed() * - mnemonicToMasterDerivationKey() is an alias for seedFromMnemonic() * - These aliases exist for wallet derivation workflows where the terminology * "master derivation key" is more familiar than "seed" * * Prerequisites: * - No LocalNet required */
import { masterDerivationKeyToMnemonic, mnemonicFromSeed, mnemonicToMasterDerivationKey, seedFromMnemonic,} from '@algorandfoundation/algokit-utils/algo25';import { formatHex, printHeader, printInfo, printStep, printSuccess } from '../shared/utils.js';
/** * Compare two Uint8Arrays for equality */function arrayEqual(a: Uint8Array, b: Uint8Array): boolean { if (a.length !== b.length) return false; for (let i = 0; i < a.length; i++) { if (a[i] !== b[i]) return false; } return true;}
function main() { printHeader('Master Derivation Key Functions Example');
// Step 1: Generate a random 32-byte master derivation key (MDK) printStep(1, 'Generate a Random 32-byte Master Derivation Key');
const mdk = new Uint8Array(32); crypto.getRandomValues(mdk);
printInfo(`Master Derivation Key (MDK): ${mdk.length} bytes`); printInfo(`Hex: ${formatHex(mdk)}`); printInfo(''); printInfo('A master derivation key is simply a 32-byte seed.'); printInfo('The term "MDK" is used in wallet derivation contexts.');
// Step 2: Convert MDK to mnemonic using masterDerivationKeyToMnemonic printStep(2, 'Convert MDK to Mnemonic using masterDerivationKeyToMnemonic()');
const mnemonicFromMdk = masterDerivationKeyToMnemonic(mdk); const words = mnemonicFromMdk.split(' ');
printInfo(`Mnemonic has ${words.length} words`); printInfo('Mnemonic words:'); for (let i = 0; i < words.length; i += 5) { const row = words.slice(i, i + 5); const numbered = row .map((w, j) => `${(i + j + 1).toString().padStart(2, ' ')}. ${w.padEnd(10)}`) .join(' '); printInfo(` ${numbered}`); }
// Step 3: Convert mnemonic back to MDK using mnemonicToMasterDerivationKey printStep(3, 'Convert Mnemonic Back to MDK using mnemonicToMasterDerivationKey()');
const recoveredMdk = mnemonicToMasterDerivationKey(mnemonicFromMdk);
printInfo(`Recovered MDK: ${recoveredMdk.length} bytes`); printInfo(`Hex: ${formatHex(recoveredMdk)}`);
const mdkMatch = arrayEqual(mdk, recoveredMdk); printInfo(''); printInfo(`Original MDK matches recovered MDK: ${mdkMatch ? 'Yes' : 'No'}`);
if (mdkMatch) { printSuccess('Round-trip conversion successful!'); }
// Step 4: Show equivalence: masterDerivationKeyToMnemonic === mnemonicFromSeed printStep(4, 'Demonstrate Equivalence: masterDerivationKeyToMnemonic === mnemonicFromSeed');
const mnemonicViaMdk = masterDerivationKeyToMnemonic(mdk); const mnemonicViaSeed = mnemonicFromSeed(mdk);
printInfo('Using masterDerivationKeyToMnemonic(mdk):'); printInfo(` "${mnemonicViaMdk.split(' ').slice(0, 5).join(' ')}..."`); printInfo(''); printInfo('Using mnemonicFromSeed(mdk):'); printInfo(` "${mnemonicViaSeed.split(' ').slice(0, 5).join(' ')}..."`); printInfo('');
const mnemonicsEqual = mnemonicViaMdk === mnemonicViaSeed; printInfo(`Results identical: ${mnemonicsEqual ? 'Yes' : 'No'}`);
if (mnemonicsEqual) { printSuccess('masterDerivationKeyToMnemonic(mdk) === mnemonicFromSeed(mdk)'); }
// Step 5: Show equivalence: mnemonicToMasterDerivationKey === seedFromMnemonic printStep(5, 'Demonstrate Equivalence: mnemonicToMasterDerivationKey === seedFromMnemonic');
const mdkFromAlias = mnemonicToMasterDerivationKey(mnemonicFromMdk); const seedFromCore = seedFromMnemonic(mnemonicFromMdk);
printInfo('Using mnemonicToMasterDerivationKey(mnemonic):'); printInfo(` ${formatHex(mdkFromAlias)}`); printInfo(''); printInfo('Using seedFromMnemonic(mnemonic):'); printInfo(` ${formatHex(seedFromCore)}`); printInfo('');
const seedsEqual = arrayEqual(mdkFromAlias, seedFromCore); printInfo(`Results identical: ${seedsEqual ? 'Yes' : 'No'}`);
if (seedsEqual) { printSuccess('mnemonicToMasterDerivationKey(mn) equals seedFromMnemonic(mn)'); }
// Step 6: Explain why these aliases exist printStep(6, 'Why These Convenience Aliases Exist');
printInfo('The MDK alias functions exist for wallet derivation workflows:'); printInfo(''); printInfo('Terminology mapping:'); printInfo(' ┌────────────────────────────────┬────────────────────────────────┐'); printInfo(' │ Wallet Context │ Cryptographic Context │'); printInfo(' ├────────────────────────────────┼────────────────────────────────┤'); printInfo(' │ Master Derivation Key (MDK) │ Seed │'); printInfo(' │ masterDerivationKeyToMnemonic │ mnemonicFromSeed │'); printInfo(' │ mnemonicToMasterDerivationKey │ seedFromMnemonic │'); printInfo(' └────────────────────────────────┴────────────────────────────────┘'); printInfo(''); printInfo('In hierarchical deterministic (HD) wallet implementations,'); printInfo('the "master derivation key" is used to derive child keys.'); printInfo('This is the same 32-byte value as the seed, just with'); printInfo('terminology that matches wallet derivation standards.');
// Step 7: Practical usage examples printStep(7, 'When to Use MDK vs Seed Functions');
printInfo('Use MDK functions when:'); printInfo(' - Working with KMD (Key Management Daemon)'); printInfo(' - Implementing HD wallet derivation'); printInfo(' - Following wallet-specific documentation that uses MDK terminology'); printInfo(''); printInfo('Use seed functions when:'); printInfo(' - Working with general cryptographic operations'); printInfo(' - Following Algorand core documentation'); printInfo(' - The context is account creation rather than wallet derivation'); printInfo(''); printInfo('Both function pairs are interchangeable - choose based on context.');
// Step 8: Summary printStep(8, 'Summary');
printInfo('Master Derivation Key functions are convenience aliases:'); printInfo(''); printInfo(' masterDerivationKeyToMnemonic(mdk)'); printInfo(' └─ Alias for: mnemonicFromSeed(mdk)'); printInfo(' └─ Input: 32-byte Uint8Array'); printInfo(' └─ Output: 25-word mnemonic string'); printInfo(''); printInfo(' mnemonicToMasterDerivationKey(mn)'); printInfo(' └─ Alias for: seedFromMnemonic(mn)'); printInfo(' └─ Input: 25-word mnemonic string'); printInfo(' └─ Output: 32-byte Uint8Array'); printInfo(''); printInfo('The aliases exist to provide familiar terminology for wallet workflows.');
printSuccess('Master Derivation Key Functions example completed successfully!');}
main();Other examples in Mnemonic Utilities
Section titled “Other examples in Mnemonic Utilities”- Mnemonic from Seed
- Seed from Mnemonic
- Secret Key to Mnemonic
- Master Derivation Key Functions
- Error Handling for Mnemonic Functions