So generieren Sie öffentliche und private Schlüsselpaare aus den 12 Seed-Wörtern in Python

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:Geben Sie hier die Bildbeschreibung ein

Die Ausgabe des obigen Python-Codes lautet:

Address: 1K6WQtD7bLQ5nQ14GyBV33mBWSbkiRKhQs
Public Key: 62Yi9HBYYagf8CY1Ve2fquHKjBqAA7GFjGUUtkUHbkP5PHzv3W
Private Key: EGHMsAp7nY7Jo9F589zCU227KBLTDhiwRq5vYVvRVZxJNPJn4

Die Adresse passt also, aber nicht das Schlüsselpaar.

Bist du sicher, dass es nicht passt? Wie ich sehe, verwenden Sie PublicKey()vs Address(). Wollten Sie den öffentlichen Schlüssel oder die Adresse?
Ich möchte den öffentlichen Schlüssel und den privaten Schlüssel. Die Adresse stimmt schon. Ich habe die Frage bearbeitet, um die Beispielausgabe sowohl der Referenzwebseite als auch des Python-Skripts als Referenz hinzuzufügen

Antworten (3)

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))
Wie schreibt man das Ergebnis in eine txt-Datei? Python 3
@debug Was ist, wenn ich dies für Ether und nicht für Bitcoin tun möchte? Welche Aspekte des Codes sollte ich ändern, um dies zu tun?

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 .