Electrum 2.0: la estandarización no BIP39/32 complica enormemente las cosas. ¿Por qué?

Electrum 2.0 me ha estado causando cierta frustración, en la medida en que parece ser una implementación no estándar de BIP32/BIP39 (carteras HD, semilla mnemotécnica, respectivamente). La billetera en cuestión es una billetera multisig 2of2 (todas P2SH), con la segunda clave pública extendida creada en pybitcointools usando

bip32_privtopub( bip32_master_key( sha256("a password") ) ),

luego importado a Electrum.

Dada la semilla de 13 palabras, que en sí misma no es estándar ya que la última palabra es una suma de verificación, se ha demostrado que es imposible exportar la xprivclave de Electrum.

¿Cómo se convierte una semilla mnemotécnica en una clave privada extendida estándar BIP32 (dado que el propio cliente no lo permitirá)? : EDIT1 : con gran dificultad, mira mi respuesta a continuación

(REENFOCADO) PREGUNTA : *por qué Electrum:

  • desviarse de BIP0039?
  • hacer que la exportación de la clave privada maestra BIP32 sea imposible?
  • ¿devuelve Txs hexadecimales P2SH parcialmente firmados que están mal formados?

Respuestas (4)

Hay una forma alternativa de extraer la clave privada extendida maestra (xprv): en la consola de Electrum, simplemente escriba esto:

wallet.get_master_private_key('x/', gui.password_dialog())

O para la clave privada maestra de una billetera creada con Electrum 1.x, es:

wallet.get_seed(gui.password_dialog())

Advertencia

Nunca escriba su contraseña o una clave privada en la consola. En otras palabras, no hagas esto:

wallet.get_seed('my-password')

Todo lo que escribe en la consola se almacena temporalmente dentro de su archivo de billetera sin cifrar para que funcione la función de historial de comandos (a la que se accede a través de la flecha hacia arriba).

¡¿Dónde diablos encontraste eso?! ¡Buen trabajo!
¡Gracias! Alguien en Bitcointalk estaba preguntando cómo hacer esto hoy, y pensé en investigar un poco la fuente de Electrum para ver si podía encontrar una mejor manera de hacer esto antes de responder. Posteriormente, tenía sentido actualizar esta respuesta y deshacerse del método no tan seguro que estaba aquí antes.
wallet.get_master_private_key('x/', None)sin contraseña FWIW, no""

Thomas Voegtlin, el desarrollador de Electrum explica el razonamiento en los primeros 10 minutos de esta entrevista. Creo que también publicó lo mismo en la lista de correo de desarrolladores de Bitcoin hace algún tiempo.

https://letstalkbitcoin.com/blog/post/epicenter-bitcoin-69-thomas-voegtlin-electrum-spv-wallets-and-bitcoin-aliases

Su punto principal contra BIP39 es que no incluye un número de versión y el requisito del diccionario de lista de palabras para implementarlo.

Nota: julio de 2017, Electrum v2.8.3... el comando ahora es:

getmasterprivate()

El cuadro de diálogo de la contraseña aparecerá automáticamente;)

Hola HCP, bienvenido a Bitcoin.SE y gracias por la actualización. Por lo general, tratamos de abordar completamente la pregunta en cada respuesta, por lo tanto, si pudiera agregar un poco más de explicación, sería genial. Si solo desea actualizar una pequeña parte de una respuesta existente, también puede sugerir una edición.

Acabo de encontrar esto en /r/Bitcoin: , así que aparentemente hay un exe para hacer esto, pero no soy exactamente un juego, ya que Chrome marcó la descarga del enlace.

Parece que Electrum usa: m/0/0para direcciones de billetera y m/1/0para cambiar direcciones.

EDITAR: Se envió una solicitud de extracción para el código que extrae la semilla raíz de la frase semilla de Electrum 2.0:

def electrumv2_extract_seed(words, password=''):
    """Takes Electrum v2.0 13 word mnemonic string and returns seed. Only works on English for now"""
    # clean-up unicode characters
    mnemonic = words[:]
    try:
        mnemonic = unicodedata.normalize('NFC', unicode(' '.join(words.lower().strip().split()))).encode('utf-8') # a string of 13 words
    except Exception as e:
        raise Exception(str(e))
    rootseed = pbkdf2.PBKDF2(str(mnemonic), str('electrum' + password), 2048,  macmodule=hmac, digestmodule=hashlib.sha512).read(64)
    return rootseed

def electrumv2_mnemonic_to_mprivkey(words, password=''):
    return bip32_master_key(electrumv2_extract_seed(words, password=''))

Esto es para usar con pybitcointools como from bitcoin import *en Python 2.7