So generieren Sie Myzel-Adressen aus den 12 Wörtern in Python

Ich versuche, die Empfangsadressen neu zu generieren (und Adressen zu ändern, was das betrifft), die meine Myzel-Brieftasche generiert hat.

Bisher habe ich die BIP39-Implementierung von Trezor verwendet , um die Entropie aus den 12 Wörtern zu generieren, und eine BIP32-Implementierung , die ich zuvor verwendet habe (erfolgreich, um dieselben Adressen wie Bitcoin Core zu generieren, der ein anderes Unterschlüsselschema verwendet, aber aus einem tpub, nicht aus der Entropie), um die Schlüssel aus der Entropie zu erzeugen.

Hier ist der Code:

from bip32utils import BIP32Key
from bip32utils import BIP32_HARDEN
import bip39

wallet_generator = bip39.Mnemonic('english')
entropy = wallet_generator.to_entropy('12 words here')
key = BIP32Key.fromEntropy(entropy)
account_number = 0
i = 0
print key.ChildKey(44 + BIP32_HARDEN) \
         .ChildKey(0 + BIP32_HARDEN) \
         .ChildKey(account_number + BIP32_HARDEN) \
         .ChildKey(0) \
         .ChildKey(i) \
         .Address()

Ich versuche, dem hier beschriebenen Schema von BIP44 zu folgen .

Ich erhalte einen Schlüssel, aber nicht den, der in meiner ersten Myzeltransaktion erscheint. Ich habe versucht, die ersten 100 imit account_number0 bis 9 zu durchsuchen, ohne Erfolg. Die Verwendung bip32genvon der Befehlszeile aus erzeugt auch nicht den richtigen Schlüssel:

echo YOUR_ENTROPY_IN_HEX_HERE | \
    bip32gen -v \
    -i entropy -f - -x \
    -o addr -F - -X \
    m/44h/0h/0h/0/0

With entropyumgewandelt in Hex mitprint ''.join('{:02X}'.format(x) for x in entropy)

Was vermisse ich? Ist die Entropie mit BIP39 Teil falsch? Liefert diese BIP32-Bibliothek fehlerhafte Adressen? Welche Alternativen gibt es?

AKTUALISIEREN:

Dank dieser Seite habe ich gesehen, dass das aus den 12 Wörtern generierte xprv falsch ist. Also ist entweder das bip39 defekt oder die Art und Weise, wie ich es verwende.

Versuchen Sie es mit dem vorletzten Teil des gehärteten Ableitungspfads. Im Moment haben Sie m/44'/0'/0'/0/i, versuchen Sie es m/44'/0'/0'/0'/i.
@AndrewChow immer noch nichts.
Ich bin mir nicht sicher, was genau erreicht werden soll, aber ich weiß, dass jede Brieftasche unterschiedliche Arten von Implementierungen hat, wie hier in einem Beitrag beschrieben: bitcoin.stackexchange.com/questions/60690/… - vielleicht hilft das ...

Antworten (1)

Die Schwierigkeit liegt bei den schlecht benannten BIP32Key.fromEntropy.

Um eine neue Brieftasche zu erstellen, gehen Sie normalerweise wie folgt vor:

  1. Holen Sie sich etwas Entropie von einer kryptografisch sicheren Zufallsquelle, mindestens 128 Bit und muss ein Vielfaches von 32 Bit sein.
  2. Konvertieren Sie die Entropie in eine mnemonische Funktion (diese Konvertierung ist keine Einwegfunktion, sie ist bijektiv).
  3. Konvertieren Sie die Mnemonik in einen 512-Bit-Seed (diese Konvertierung ist eine Möglichkeit).
  4. Wandeln Sie den Seed in einen erweiterten privaten Schlüssel um (ebenfalls in eine Richtung).
  5. Machen Sie die BIP-32-Ableitung und den ganzen Rest ....

BIP32Key.fromEntropyhätte eigentlich heißen sollen BIP32Key.fromSeed.

Hier ist ein Beispiel:

from bip32utils import BIP32Key
from bip32utils import BIP32_HARDEN
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'

print mnemonic
seed = bip39.Mnemonic.to_seed(mnemonic)
key = BIP32Key.fromEntropy(seed)
account_number = 0
i = 0
print key.ChildKey(44 + BIP32_HARDEN) \
         .ChildKey(0 + BIP32_HARDEN) \
         .ChildKey(account_number + BIP32_HARDEN) \
         .ChildKey(0) \
         .ChildKey(i) \
         .Address()