¿Cómo generar direcciones privadas, públicas y ethereum usando web3.py?

Quiero saber el proceso de generación de claves para ethereum usando web3.py. Cómo generar las claves si instalo mi nodo ether.

from web3 import Web3, HTTPProvider, IPCProvider
web3 = Web3(HTTPProvider('http://localhost:8545'))

Configuré el nodo. Ahora, ¿cuál es el método para obtener las claves (dirección privada, pública y ether)? Por favor explique.

Dado que menciona el nodo, supongo que quiere crear una clave privada alojada en su nodo local. Si no es así, actualice su pregunta. Ver web3py.readthedocs.io/en/latest/…

Respuestas (2)

Puedes usar el web3.personal.newAccount(password)método:

Genera una nueva cuenta en el llavero del nodo encriptada con el passphrase. Devuelve la dirección de la cuenta creada.

py>> web3.personal.newAccount('the-passphrase')
['0xd3cda913deb6f67967b99d67acdfa1712c293601']

Tenga en cuenta que, por motivos de seguridad, los nodos no exponen la clave privada sobre la json-rpcAPI que utiliza web3. Tampoco conozco una forma de acceder a su clave pública.

Si desea claves locales en lugar de claves alojadas, consulte: ¿Cómo puedo generar una billetera en python?


Editar : parece que realmente quieres ambas cosas: una clave local y una clave alojada al mismo tiempo. Para lograr eso, puede crear la clave en el nodo y luego extraerla. Eso implica encontrar el archivo y descifrarlo.

El lugar donde se guarda su archivo de claves depende de su elección de nodo, sistema operativo y configuración. gethAsumiré la carpeta del almacén de claves predeterminada :~/.ethereum/keystore/

Puede descifrar el archivo de claves utilizando el método eth-account decrypt():

from eth_account import Account

with open('~/.ethereum/keystore/<your_keyfile_name>') as keyfile:
    keyfile_json = keyfile.read()

private_key = Account.decrypt(keyfile_json, '<you-account-password>')

# get some extra info about the private_key, like the address:
acct = Account.privateKeyToAccount(private_key)

ether_address = acct.address

También preguntó sobre la clave pública, que no es una parte de Ethereum que se use con frecuencia, por lo que no hay una gran API para ella. Puede usar esta API no pública, pero tenga en cuenta que estos nombres de variables pueden cambiar en cualquier momento:

acct._key_obj.public_key
Si creo claves locales (usando algunas otras bibliotecas para generar direcciones privadas, públicas y ether), ¿puedo enviarlas al nodo para impulsar la transacción (después de firmar) usando w3.eth.sendRawTransaction()?
Quiero usar el nodo local que controlo yo y también quiero generar claves usando el nodo local.

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'))

password = 'password'
address = web3.personal.newAccount('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)