Cuando creé una bóveda multisig en Coinbase, obtuve:
0
, huella padre 00000000
e índice hijo 0
.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).
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 seed
y 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_privkey
y la volvemos a codificar encode_privkey
para obtener la forma binaria. Luego pasamos eso bip32_master_key
para obtener la clave maestra bip32 de esa semilla. Y a partir de ahí, simplemente llame bip32_ckd
para obtener la clave privada extendida de cualquier índice secundario que queramos. Por último, extraemos la clave privada real bip32_bin_extract_key
y la codificamos encode_privkey
para 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')
Nick ODell