Cómo volverse privado a través de archivos UTC en el almacén de claves [duplicado]

Creo cuentas geth account newcon una contraseña, luego obtengo un archivo UTC que es un archivo json guardado en el almacén de claves de la carpeta en el directorio de datos. Ahora intento obtener la clave privada de este archivo json.

La razón por la que quiero hacer esto es porque estoy usando metamask en ubuntu y hay un problema que no me permite importar el archivo json directamente a metamask en ubuntu.

¿Alguien sabe cómo obtener una clave privada a través del archivo UTC json con contraseña?

Gracias

Respuestas (5)

https://www.myetherwallet.com es una opción popular. Pero recomendaría descargar la versión sin conexión del sitio para mayor seguridad.

Si te apetece escribir un poco de código, keythereumes una buena opción.

Algo como esto:

var keyObject = keythereum.importFromFile(address, datadir);
var privateKey = keythereum.recover(password, keyObject);
console.log(privateKey.toString('hex'));
En el caso de Node.js , keythereum-node se puede usar como una alternativa más rápida a keythereum.

2021-12

FYI para Googlers, puede inspeccionar el archivo de almacén de claves UTC con la ethkeyherramienta cli que viene con gethel indicador --private para mostrar la clave privada

ethkey inspect --private test_chain/keystore/UTC--<file name

producción

Address:       0x...
Public key:    ...
Private key:   ...

A menudo se requiere una clave privada para importar su cuenta en una billetera diferente. Incluso Metamask necesita una clave privada para importar la cuenta. Así fue como pude extraer la clave privada del nodo donde creé mi cuenta. Las claves de Ethereum en un nodo de Linux se cifrarán y almacenarán en la siguiente ubicación.

~/.ethereum/keystore/ (mainnet)
~/.ethereum/rinkeby/keystore/ (rinkeby testnet)

Si tiene la dirección pública de la cuenta y la contraseña utilizada para bloquear la cuenta, debería poder extraer la clave privada. Usé el paquete web3 python para extraer la clave privada. Instale esto usando pip.

pip install web3

Ejecuta el siguiente código

>>> from web3.auto import w3
>>> with open("~/.ethereum/rinkeby/keystore/UTC--2018-06-
    10T05-43-22.134895238Z--9e63c0d223d9232a4f3076947ad7cff353cc1a28") 
     as keyfile:
...     encrypted_key = keyfile.read()
...     private_key = w3.eth.account.decrypt(encrypted_key, 
                                             'password')

UTC--2018-06-10T05-43-22.134895238Z--9e63c0d223d9232a4f3076947ad7cff353cc1a28 es el archivo que contiene la clave almacenada. Esto devolverá una clave privada en formato de byte.

Puede obtener la clave privada en formato hexadecimal de la siguiente manera.

import binascii
binascii.b2a_hex(private_key)

Puede usar la herramienta web3 CLI para hacer esto fácilmente:

web3 account extract --keyfile ~/Downloads/keystore-file --password password
Instalación de la CLI de web3:curl -LSs https://raw.githubusercontent.com/gochain/web3/master/install.sh | sh

Suponiendo que ha activado el rpc personal de su geth , para hacer esto programáticamente sin codificar la ruta del directorio del archivo del almacén de claves en python , haga lo siguiente:

from web3 import Web3
import eth_keys
from eth_account import account

w3 = Web3(Web3.HTTPProvider('http://127.0.0.1'))
address = '0x...'
password = 'password'

wallets_list = w3.geth.personal.list_wallets()
keyfile_path = (wallets_list[list(i['accounts'][0]['address'] for i in wallets_list).index(address)]['url']).replace("keystore://", "").replace("\\", "/")
keyfile = open(keyfile_path)
keyfile_contents = keyfile.read()
keyfile.close()
private_key = eth_keys.keys.PrivateKey(account.Account.decrypt(keyfile_contents, password))
public_key = private_key.public_key

private_key_str = str(private_key)
public_key_str = str(public_key)
Hola Rolij! Copiar y pegar la misma respuesta a varias preguntas no es muy útil. Si las preguntas son similares, puede marcarlas como duplicadas o puede agregar un enlace a su respuesta como comentario.
Gracias @Ismael por el aviso. Vi la misma pregunta en casi todas partes y no vi a nadie marcándolos como duplicados (a pesar de la gran cantidad de visitas), así que pensé que estaban bien. Y también vi todas las respuestas con el código duro del archivo del almacén de claves y pensé que mi respuesta podría ser más útil, así que decidí publicarla en todas partes. a pesar de todo eso, verificaré si tengo el privilegio de marcarlos como duplicados y eliminaré mis respuestas. Gracias de nuevo por la orientación.
Todo está bien, no tienes que hacer nada, en el futuro simplemente no hagas eso. El sistema solo está tratando de detectar bots, me aseguro de que seas un humano, así que todo está bien.
Gracias @Ismael por la guía. Recordaré eso.