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
eine 13-Wörter-Mnemonik ( oder 12 Wörter plus Prüfsumme? )
der unverschlüsselt ist. Dies ist auch der Master Private Key?
Dann gibt der Benutzer ein Passwort/eine Passphrase (oder nicht) ein, die den Seed verschlüsselt, damit er als Brieftasche (Datei) gespeichert werden kann.
Die Wallet-Datei kann nur mit dem Passwort/der Passphrase entschlüsselt werden
Dann wird ein Master Public Key aus der Brieftasche generiert [Hat jemand mehr Details dazu?] .
Dann die 25-Byte-Binär-Bitcoin-Adresse = {[MPK>sha256>RIPEMD160]+[MPK>sha256>RIPEMD160>versionByteadd>sha256>sha256>first4bytes]}
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.
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.
Jonathan Kreuz
Kumarz
Jonathan Kreuz
Kumarz