Wie berechnet Electrum das Seed-Byte kurz vor BIP-32?

Als Neuling in Bitcoin und Programmieren versuche ich, BTC-Adressen aus Mnemonik zu generieren. Also habe ich über die BIPs gelesen und Codes in Github gefunden, die diese implementieren.

Ich habe herausgefunden, dass Electrum BIP-39 nicht implementiert (standardmäßig, wenn ich mich nicht irre), weil Mnemonics, die in BIP-39 ungültig sind, von Electrum akzeptiert werden!

Meine Frage ist also: Wie macht Electrum seinen eigenen Abschnitt "From Mnemonic to Seed" (zumindest für Standard-Wallet)? Dieses "Seed-Byte" wird in BIP-32 zum Generieren von Schlüsseln verwendet, wenn ich mich nicht geirrt habe.

Ich habe den folgenden Python-Pseudocode (aus "Electrum Seed Version System") ausprobiert:

hmac = hmac.digest(b"Seed version", b"...(12 word mnemonic)...", hashlib.sha512)
bip32_thing = Bip32(secret = hmac[:32], chain = hmac[32:]) # default: Bip32 main net version (idk what this means)

Aber mein generierter öffentlicher Hauptschlüssel und der von Electrum stimmen nicht überein (höchstwahrscheinlich habe ich das "Seed Version System" insgesamt falsch verstanden). Danke für die Antwort!

Falls es hilft: Ich verwende bip-utilsin Python.

Antworten (1)

Nach vielen Stunden habe ich es gefunden! Genau das macht Mnemonic.mnemonic_to_seed()mnemonic.py! ( Link )

Der relevanteste Teil ist, was er zurückgibt:

seed_byte = hashlib.pbkdf2_hmac('sha512', mnemonic.encode('utf-8'), b'electrum' + passphrase.encode('utf-8'), iterations = PBKDF2_ROUNDS)

Wo PBKDF2_ROUNDS = 2048. Dann habe ich einfach...

bip32_node = Bip32.FromSeed(seed_byte)   # Derivation path: "m/"