replicando en python lo que hace la billetera electrum durante la creación de la billetera (determinista)

Estoy tratando de replicar en python lo que hace la billetera Electrum durante la creación de la billetera (determinista). En mi humilde opinión, los documentos son un poco escasos en esto, tal vez porque solo se realizó una vez para la mayoría de los usuarios, todos los tutoriales, etc. parecen centrarse en la GUI, y no pude resolver el código python del spesmilo github para electrum .

Por lo que puedo ver, Electrum genera una semilla de generación de billetera aleatoria

  1. un mnemotécnico de 13 palabras ( ¿o 12 palabras más la suma de verificación? )

  2. que no está cifrada. ¿También es la clave privada maestra?

  3. Luego, el usuario ingresa una contraseña/frase de contraseña (o no) que encripta la semilla para que pueda guardarse como una billetera (archivo)

  4. El archivo de la billetera solo se puede descifrar con la contraseña/frase de contraseña

  5. Luego, se genera una clave pública maestra a partir de la billetera [¿Alguien tiene más detalles sobre esto?] .

  6. Luego, la dirección de Bitcoin binaria de 25 bytes = {[MPK>sha256>RIPEMD160]+[MPK>sha256>RIPEMD160>versionByteadd>sha256>sha256>first4bytes]}

  7. que a su vez está codificado en Base58Check en el formato de dirección de Bitcoin

¿Puede alguien verificar si mis suposiciones (1 a 7) están bien/corregirme? Además, a continuación se muestra lo lejos que llegué con python (¡probablemente muy incorrecto!):

from electrum import mnemonic
import ecdsa
import hashlib
import base58
import getpass

mnemonicInstance = mnemonic.Mnemonic(lang='en')
randseed = mnemonicInstance.make_seed()
print "this is my 13 word wallet gen seed" + randseed
private_key = mnemonicInstance.mnemonic_to_seed(randseed , getpass.getpass()).encode('hex')
print "this is my private key: " + private_key
#the line of code below failed!:
sk = ecdsa.SigningKey.from_string(private_key.decode("hex"), curve = ecdsa.SECP256k1)
vk = sk.verifying_key
public_key = ('\04' + vk.to_string()).encode("hex")
print "this is my public key: " + public_key
ripemd160 = hashlib.new('ripemd160')
ripemd160.update(hashlib.sha256(public_key.decode('hex')).digest())
middle_man = '\00' + ripemd160.digest()
checksum = hashlib.sha256(hashlib.sha256(middle_man).digest()).digest()[:4]
binary_addr = middle_man + checksum
addr = base58.b58encode(binary_addr)
print "this is my BTC address: " + addr

(Algunos de los anteriores extraídos del github de Shultzi ) También consulté Mastering Bitcoin de Andreas, pero no me gustó mucho esta parte.

¿Has experimentado con pybitcointools ? Podría ser un buen lugar para comenzar cuando se está aprendiendo.
sí, de hecho, Jon, no se molestó en poner el código de Vitalik, ya que hace esencialmente lo mismo. En realidad, prefiero pybitcointools porque es compatible con testnet (electrum no). De todos modos, no me gustó mucho, así que quería aclarar/corregir esto si es posible: ¿tal vez editar mi publicación (por favor) como lo hizo Nick?
Parece que hay algo de trabajo en marcha ahora que la gente quiere probar Segregated Witness: github.com/spesmilo/electrum/issues/541
sí, eso será increíble porque, como acabo de descubrir, parece que no es posible enviar multisig txns (mk_multisig_script) a testnet usando pybitcointools (no sin ajustar la transacción de Vitalik).

Respuestas (1)

Bip32 es la implementación de billeteras deterministas jerárquicas. Esto describe completamente lo que está discutiendo aquí. El texto completo de bip32 se puede encontrar en https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki El mnemotécnico se asigna a bits específicos para el cifrado, las palabras en sí no se utilizan. Lea el bit sobre la extensión de las claves, también explicará cómo se genera la clave pública maestra. También explica las tres derivaciones que se pueden hacer a partir de las claves pública y privada las cuales son:

Clave privada principal -> clave privada secundaria

Clave privada principal -> clave pública secundaria

Clave pública principal -> clave pública secundaria

Vale la pena señalar que la clave privada secundaria no se puede generar a partir de la clave pública principal.

muchas gracias Mark... Creo que entendí el concepto y he leído BIP32 (¡gracias por el enlace!); Supongo que mi publicación fue más sobre la implementación de python de esto: estoy siendo perezoso, lo sé, pero esperaba que alguien hubiera estado en mi lugar antes y pudiera escupir el código: veo la implementación de pycoin pero no pude averiguar cómo lo hace en testnet.