Cómo generar direcciones de micelio a partir de las 12 palabras en python

Estoy tratando de volver a generar las direcciones de recepción (y cambiar las direcciones, para el caso) que ha generado mi billetera de mycelium.

Hasta ahora he usado la implementación de trezor de BIP39 para generar la entropía de las 12 palabras, y una implementación de BIP32 que he usado anteriormente (con éxito, para generar las mismas direcciones que el núcleo de bitcoin, que usa un esquema de subclaves diferente pero de un tpub, no de la entropía), para producir las claves de la entropía.

Aquí está el código:

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()

Estoy tratando de seguir el esquema de BIP44 como se describe aquí .

Obtengo una clave, pero no la que aparece en mi primera transacción de micelio. Intenté buscar los primeros 100 icon account_number0 a 9, sin éxito. Usar bip32gendesde la línea de comando tampoco produce la clave correcta:

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

Con entropyconvertido a hexadecimal conprint ''.join('{:02X}'.format(x) for x in entropy)

¿Qué me estoy perdiendo? ¿La entropía con la parte BIP39 es incorrecta? ¿Esa biblioteca BIP32 está generando direcciones erróneas? ¿Qué alternativas hay?

ACTUALIZAR:

Gracias a este sitio , he visto que el xprv generado a partir de las 12 palabras es incorrecto. Entonces, o el bip39 está defectuoso, o la forma en que lo estoy usando lo está.

Pruebe con la penúltima parte de la ruta de derivación que se está endureciendo. Ahora mismo lo tienes m/44'/0'/0'/0/i, prueba m/44'/0'/0'/0'/i.
@AndrewChow todavía nada.
No estoy seguro de qué se logrará exactamente, pero sé que cada billetera tiene diferentes tipos de implementaciones, como se describe aquí en una publicación: bitcoin.stackexchange.com/questions/60690/… - tal vez esto ayude...

Respuestas (1)

La dificultad está en los mal nombrados BIP32Key.fromEntropy.

Por lo general, para crear una nueva billetera, usted:

  1. Obtenga algo de entropía de una fuente aleatoria criptográficamente segura, al menos 128 bits y debe ser un múltiplo de 32 bits.
  2. Convierta la entropía en una mnemotécnica (esta conversión no es una función unidireccional, es biyectiva).
  3. Convierta el mnemotécnico en una semilla de 512 bits (esta conversión es unidireccional).
  4. Convierta la semilla en una clave privada extendida (también unidireccional).
  5. Haz la derivación BIP-32 y todo lo demás....

BIP32Key.fromEntropyrealmente debería haber sido nombrado BIP32Key.fromSeed.

Aquí hay un ejemplo:

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()