Wie generiert man mit web3.py private, öffentliche und Ethereum-Adressen?

Ich möchte wissen, wie die Schlüssel für Ethereum mit web3.py generiert werden . So generieren Sie die Schlüssel, wenn ich meinen Etherknoten installiere.

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

Ich habe den Knoten konfiguriert. Was ist nun die Methode, um die Schlüssel zu erhalten (private, öffentliche und Ether-Adresse)? Bitte erkläre.

Da Sie den Knoten erwähnen, würde ich davon ausgehen, dass Sie einen gehosteten privaten Schlüssel in Ihrem lokalen Knoten erstellen möchten. Wenn nicht, aktualisieren Sie bitte Ihre Frage. Siehe web3py.readthedocs.io/en/latest/…

Antworten (2)

Sie können die web3.personal.newAccount(password)Methode verwenden:

Erzeugt ein neues Konto im Schlüsselbund des Knotens, das mit der angegebenen verschlüsselt ist passphrase. Gibt die Adresse des erstellten Kontos zurück.

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

Beachten Sie, dass Knoten aus Sicherheitsgründen den privaten Schlüssel nicht über die json-rpcvon web3 verwendete API offenlegen. Mir ist auch keine Möglichkeit bekannt, auf Ihren öffentlichen Schlüssel zuzugreifen.

Wenn Sie lokale Schlüssel anstelle von gehosteten Schlüsseln möchten, lesen Sie: Wie kann ich eine Brieftasche in Python generieren?


Bearbeiten : Es scheint, dass Sie wirklich beide Dinge wollen: einen lokalen Schlüssel und einen gehosteten Schlüssel gleichzeitig. Um dies zu erreichen, könnten Sie den Schlüssel im Knoten erstellen und ihn dann extrahieren. Dazu muss die Datei gefunden und entschlüsselt werden.

Wo Ihre Schlüsseldatei aufbewahrt wird, hängt von Ihrer Wahl des Knotens, des Betriebssystems und der Konfiguration ab. Ich nehme den Standard geth-Keystore-Ordner an:~/.ethereum/keystore/

Sie können die Schlüsseldatei mit der eth-account-Methode entschlüsselndecrypt() :

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

Sie haben auch nach dem öffentlichen Schlüssel gefragt, der kein häufig verwendeter Teil von Ethereum ist, daher gibt es keine großartige API dafür. Sie können diese nicht öffentliche API verwenden, aber beachten Sie, dass sich diese Variablennamen jederzeit ändern können:

acct._key_obj.public_key
Wenn ich lokale Schlüssel erstelle (mit einigen anderen Bibliotheken, um private, öffentliche und Ether-Adressen zu generieren), kann ich sie an den Knoten senden, um die Transaktion (nach dem Signieren) mit zu pushen w3.eth.sendRawTransaction()?
Ich möchte den von mir kontrollierten lokalen Knoten verwenden und auch Schlüssel mit dem lokalen Knoten generieren.

Angenommen, Sie haben den persönlichen rpc Ihres geth aktiviert , um dies programmgesteuert zu tun, ohne den Verzeichnispfad der Keystore-Datei in python fest zu codieren , gehen Sie wie folgt vor:

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)