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.
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-rpc
API 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. geth
Asumiré 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
w3.eth.sendRawTransaction()
?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)
tallista