Ich habe im Grunde die Anweisungen hier befolgt, wie man Myzeladressen aus den 12 Wörtern in Python generiert
Also mein Code ist ähnlich:
from bip32utils import BIP32Key
from bip32utils import BIP32_HARDEN
from bip32utils import Base58
import os, bip39
strength_bits = 128
entropy = os.urandom(strength_bits // 8)
wallet_generator = bip39.Mnemonic('english')
mnemonic = wallet_generator.to_mnemonic(entropy)
assert wallet_generator.to_entropy(mnemonic) == entropy # see, bijective!
# Or specify the mnemonic directly if you prefer:
mnemonic = 'aware report movie exile buyer drum poverty supreme gym oppose float elegant'
passphrase = 'test'
seed = bip39.Mnemonic.to_seed(mnemonic, passphrase=passphrase)
key = BIP32Key.fromEntropy(seed)
account_number = 0
i = 0
print "Address: " + key.ChildKey(44 + BIP32_HARDEN) \
.ChildKey(0 + BIP32_HARDEN) \
.ChildKey(account_number + BIP32_HARDEN) \
.ChildKey(0) \
.ChildKey(i) \
.Address()
Und ich habe es mit https://iancoleman.io/bip39/#english verifiziert , dass die generierte Adresse tatsächlich die erste Adresse ist, die diese Webseite auch generiert hat. Ich möchte jedoch auch die öffentlichen und privaten Schlüsselpaare mit derselben Bibliothek abrufen. Ich habe ursprünglich versucht:
print "Public Key: " + Base58.check_encode(key.ChildKey(44 + BIP32_HARDEN) \
.ChildKey(0 + BIP32_HARDEN) \
.ChildKey(account_number + BIP32_HARDEN) \
.ChildKey(0) \
.ChildKey(i) \
.PublicKey())
print "Private Key: " + Base58.check_encode(key.ChildKey(44 + BIP32_HARDEN) \
.ChildKey(0 + BIP32_HARDEN) \
.ChildKey(account_number + BIP32_HARDEN) \
.ChildKey(0) \
.ChildKey(i) \
.PrivateKey())
Die Ausgabe dieser beiden Aufrufe ist jedoch nicht die gleiche wie die, die von der oben genannten Website für dieselbe Adresse bereitgestellt wird.
Meine Frage ist also: Was ist der richtige Weg für mich, die öffentlichen und privaten Schlüsselpaare zu generieren?
Bearbeiten: Zur Verdeutlichung, für die genaue Mnemonik und Passphrase oben, sagt mir die Website, die ich als Referenz verwende, dass die erste Adresse und das Schlüsselpaar lauten sollten:
Die Ausgabe des obigen Python-Codes lautet:
Address: 1K6WQtD7bLQ5nQ14GyBV33mBWSbkiRKhQs
Public Key: 62Yi9HBYYagf8CY1Ve2fquHKjBqAA7GFjGUUtkUHbkP5PHzv3W
Private Key: EGHMsAp7nY7Jo9F589zCU227KBLTDhiwRq5vYVvRVZxJNPJn4
Die Adresse passt also, aber nicht das Schlüsselpaar.
Bitte versuchen Sie die folgende Demo, und das Ergebnis ist dasselbe wie bei https://iancoleman.io/bip39/ .
$ python3.6 test.py
{'addr': '1A9vZ4oPLb29szfRWVFe1VoEe7a2qEMjvJ',
'coin': 'BTC',
'mnemonic_words': 'aware report movie exile buyer drum poverty supreme gym oppose float elegant',
'privatekey': 'L3g3hhYabnBFbGqd7qReebwCrRkGhAzaX4cBpYSv5S667sWJAn5A',
'publickey': '029dc2912196f2ad7a830747c2490287e4ff3ea52c417598681a955dcdf473b6c0'}
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import pprint
import binascii
import mnemonic
import bip32utils
def bip39(mnemonic_words):
mobj = mnemonic.Mnemonic("english")
seed = mobj.to_seed(mnemonic_words)
bip32_root_key_obj = bip32utils.BIP32Key.fromEntropy(seed)
bip32_child_key_obj = bip32_root_key_obj.ChildKey(
44 + bip32utils.BIP32_HARDEN
).ChildKey(
0 + bip32utils.BIP32_HARDEN
).ChildKey(
0 + bip32utils.BIP32_HARDEN
).ChildKey(0).ChildKey(0)
# return {
# 'mnemonic_words': mnemonic_words,
# 'bip32_root_key': bip32_root_key_obj.ExtendedKey(),
# 'bip32_extended_private_key': bip32_child_key_obj.ExtendedKey(),
# 'bip32_derivation_path': "m/44'/0'/0'/0",
# 'bip32_derivation_addr': bip32_child_key_obj.Address(),
# 'coin': 'BTC'
# }
return {
'mnemonic_words': mnemonic_words,
# 'bip32_root_key': bip32_root_key_obj.ExtendedKey(),
# 'bip32_extended_private_key': bip32_child_key_obj.ExtendedKey(),
# 'path': "m/44'/0'/0'/0",
'addr': bip32_child_key_obj.Address(),
'publickey': binascii.hexlify(bip32_child_key_obj.PublicKey()).decode(),
'privatekey': bip32_child_key_obj.WalletImportFormat(),
'coin': 'BTC'
}
if __name__ == '__main__':
mnemonic_words = "aware report movie exile buyer drum poverty supreme gym oppose float elegant"
pprint.pprint(bip39(mnemonic_words))
Ich habe das Problem gefunden, denke ich.
Sie sollten Base58.check_encode nicht ausführen
Verwenden Sie zum Drucken des PublicKey die Methode .hex().
Außerdem https://iancoleman.io/bip39/#english Drucken Sie den privaten Schlüssel im WIF-Formular aus, also sollten Sie .WalletImportFormat() anstelle von .PrivateKey() ausführen, wenn Sie die gleiche Ausgabe wie iancoleman.io haben möchten. Diesmal muss .hex() nicht verwendet werden (auch hier muss nicht in base58 codiert werden)
Der öffentliche Schlüssel sollte hexadezimal sein, wie @MohamedLEGH oben erwähnt hat. Beim privaten Schlüssel müssen Sie zuerst den Netzwerkcode anhängen. Siehe Schritt 2 hier .
Zombie
m1xolyd1an
PublicKey()
vsAddress()
. Wollten Sie den öffentlichen Schlüssel oder die Adresse?Stürmischer Dan