Cómo derivar la clave privada asociada con una dirección de bóveda multi-sig de Coinbase

Cuando creé una bóveda multisig en Coinbase, obtuve:

  1. Una clave pública maestra en formato BIP32 extendido, de profundidad 0, huella padre 00000000e índice hijo 0.
  2. Una clave privada en formato WIF ("user seed"), que desconozco si ha sido endurecida, derivada de una clave pública, ni la profundidad ni el índice.

Estoy tratando de probar la propiedad de una dirección derivada de la clave pública maestra en el índice 14. Entonces, al usar bip32.org , pude derivar la clave pública en formato extendido BIP32 en el índice m/14, que corresponde exactamente a la dirección para la cual necesito probar la propiedad.

Por lo tanto, mi objetivo ahora es derivar la clave privada para la cual la dirección es la misma que la dirección de la clave pública derivada en index m/14, según la información que tengo. Si es posible con pybitcointools.

Intenté hacer una pregunta más general aquí , pero fue un buen caso de problema XY (pregunté sobre mi intento de solución en lugar del problema real).

¿Le importaría publicar un ejemplo de xpub/WIF/dirección generada? Me ayudaría a averiguar qué quieren que hagas. (No uno que estés usando para manejar dinero real, obviamente).

Respuestas (1)

Investigué un poco en la herramienta multisig fuera de línea de Coinbase para descubrir cuál era realmente la semilla del usuario y sus rutas de derivación. Resulta que la semilla del usuario es solo eso, una semilla que se usa para obtener la clave privada maestra. Esto se hace al codificarlo con HMAC-SHA512 donde la clave es la cadena Bitcoin seedy los datos son la forma binaria de la semilla del usuario (lo que significa decodificarlo y obtener los datos binarios).

Para hacer esto con pybitcointools, primero decodificamos la semilla de usuario WIF con decode_privkeyy la volvemos a codificar encode_privkeypara obtener la forma binaria. Luego pasamos eso bip32_master_keypara obtener la clave maestra bip32 de esa semilla. Y a partir de ahí, simplemente llame bip32_ckdpara obtener la clave privada extendida de cualquier índice secundario que queramos. Por último, extraemos la clave privada real bip32_bin_extract_keyy la codificamos encode_privkeypara convertirla en formato WIF, que se puede importar y usar en otro software de billetera.

El siguiente código hace todo esto por usted e imprimirá la clave privada maestra extendida derivada de la semilla, la clave pública extendida derivada de la clave maestra (que debe coincidir con la clave pública que tiene), la clave privada secundaria extendida y esa clave secundaria en WIF.

Reemplace los valores para USER_PUB, USER_SEED e I con su clave pública de usuario real, semilla de usuario e índice secundario que desee. Los valores que tengo aquí son reales y funcionarán.

from pybitcointools.deterministic import bip32_ckd, bip32_master_key, bip32_bin_extract_key, bip32_privtopub
from pybitcointools.main import decode_privkey, encode_privkey

USER_PUB = 'xpub661MyMwAqRbcEzdGMFKZXuVwbyHY2zKhiw6YFTrULfNBF53QVfXyoAiKMZKWkQA5444NXtLj9HPmgyN1xLCiJJ9dKAy4nLZJ87trHRnwUDb'
USER_SEED = 'L3XCYcQ2pwY3YTuwyPXzWsvVtGnCp4zL2ajP3XQt2pVhPuKiVM7r'
I = 14

user_seed = encode_privkey(decode_privkey(USER_SEED), 'bin')
priv = bip32_master_key(user_seed)
derived_pub = bip32_privtopub(priv)
child_priv = bip32_ckd(priv, I)
assert USER_PUB == derived_pub
print "Master Private Key corresponding to seed: " + priv
print "Master Public Key corresponding to seed: " + derived_pub
print "Extended Private key at index " + str(I) + ": " + child_priv
print "WIF format of that key: " + encode_privkey(bip32_bin_extract_key(child_priv), 'wif_compressed')
Excelente, esto funciona perfectamente!