Replizieren in Python, was die Electrum-Wallet während der (deterministischen) Wallet-Erstellung tut

Ich versuche, in Python zu replizieren, was die Electrum-Wallet während der (deterministischen) Wallet-Erstellung tut. IMHO sind die Dokumente zu diesem Teil etwas spärlich, vielleicht weil es für die meisten Benutzer nur einmal durchgeführt wird, alle Tutorials usw. sich auf die GUI zu konzentrieren scheinen und ich den Python-Code aus dem spesmilo github für electrum nicht ausarbeiten konnte .

Soweit ich sehen kann, generiert Electrum einen zufälligen Wallet Generation Seed

  1. eine 13-Wörter-Mnemonik ( oder 12 Wörter plus Prüfsumme? )

  2. der unverschlüsselt ist. Dies ist auch der Master Private Key?

  3. Dann gibt der Benutzer ein Passwort/eine Passphrase (oder nicht) ein, die den Seed verschlüsselt, damit er als Brieftasche (Datei) gespeichert werden kann.

  4. Die Wallet-Datei kann nur mit dem Passwort/der Passphrase entschlüsselt werden

  5. Dann wird ein Master Public Key aus der Brieftasche generiert [Hat jemand mehr Details dazu?] .

  6. Dann die 25-Byte-Binär-Bitcoin-Adresse = {[MPK>sha256>RIPEMD160]+[MPK>sha256>RIPEMD160>versionByteadd>sha256>sha256>first4bytes]}

  7. die wiederum mit Base58Check in das Bitcoin- Adressformat codiert ist

Kann bitte jemand überprüfen, ob meine Annahmen (1 bis 7) in Ordnung sind / mich korrigieren? Außerdem ist unten, wie weit ich mit Python gekommen bin (wahrscheinlich grob falsch!):

from electrum import mnemonic
import ecdsa
import hashlib
import base58
import getpass

mnemonicInstance = mnemonic.Mnemonic(lang='en')
randseed = mnemonicInstance.make_seed()
print "this is my 13 word wallet gen seed" + randseed
private_key = mnemonicInstance.mnemonic_to_seed(randseed , getpass.getpass()).encode('hex')
print "this is my private key: " + private_key
#the line of code below failed!:
sk = ecdsa.SigningKey.from_string(private_key.decode("hex"), curve = ecdsa.SECP256k1)
vk = sk.verifying_key
public_key = ('\04' + vk.to_string()).encode("hex")
print "this is my public key: " + public_key
ripemd160 = hashlib.new('ripemd160')
ripemd160.update(hashlib.sha256(public_key.decode('hex')).digest())
middle_man = '\00' + ripemd160.digest()
checksum = hashlib.sha256(hashlib.sha256(middle_man).digest()).digest()[:4]
binary_addr = middle_man + checksum
addr = base58.b58encode(binary_addr)
print "this is my BTC address: " + addr

(Einige der oben genannten Punkte stammen aus Shultzis Github ) Ich habe auch Andreas Mastering Bitcoin konsultiert, hatte aber nicht viel Freude mit diesem Teil.

Haben Sie mit pybitcointools experimentiert ? Könnte ein guter Anfang beim Lernen sein.
Ja, ich habe tatsächlich Jon, habe mir nicht die Mühe gemacht, Vitaliks Code einzufügen, da er im Wesentlichen dasselbe tut. Eigentlich bevorzuge ich pybitcointools, weil es Testnet unterstützt (Elektrum nicht). Wie auch immer, ich hatte nicht viel Freude, also wollte ich das klären / korrigieren, wenn möglich: Vielleicht bearbeite meinen Beitrag (bitte) wie Nick?
Es scheint, dass jetzt einige Arbeiten im Gange sind, an denen die Leute Segregated Witness testen möchten: github.com/spesmilo/electrum/issues/541
Ja, das wird großartig, denn wie ich gerade herausgefunden habe, scheint es nicht möglich zu sein, Multisig-txns (mk_multisig_script) mit pybitcointools auf Testnet zu pushen (nicht ohne Vitaliks transaction.py zu optimieren).

Antworten (1)

Bip32 ist die Implementierung hierarchischer deterministischer Wallets. Dies beschreibt vollständig, was Sie hier diskutieren. Den vollständigen Text von bip32 finden Sie unter https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki . Die mnemonische Zuordnung zu bestimmten Bits für die Verschlüsselung, die Wörter selbst werden nicht verwendet. Lesen Sie den Abschnitt über das Erweitern der Schlüssel, in dem auch erklärt wird, wie der öffentliche Hauptschlüssel generiert wird. Es erklärt auch die drei Ableitungen, die aus den öffentlichen und privaten Schlüsseln gemacht werden können, nämlich:

Übergeordneter privater Schlüssel -> untergeordneter privater Schlüssel

Übergeordneter privater Schlüssel -> untergeordneter öffentlicher Schlüssel

Übergeordneter öffentlicher Schlüssel -> untergeordneter öffentlicher Schlüssel

Beachten Sie, dass der untergeordnete private Schlüssel nicht aus dem übergeordneten öffentlichen Schlüssel generiert werden kann.

vielen Dank Mark ... Ich glaube, ich habe das Konzept verstanden und BIP32 gelesen (danke für den Link!) ; Ich nehme an, in meinem Beitrag ging es mehr um die Python-Implementierung: Ich bin faul, ich weiß, aber ich hatte irgendwie gehofft, dass jemand schon einmal in meinen Schuhen war und den Code einfach ausspucken könnte: Ich habe die Python-Implementierung gesehen, konnte aber nicht herausfinden, wie es tut dies in testnet.