Как сгенерировать частные, общедоступные и эфирные адреса с помощью web3.py?

Я хочу знать процесс генерации ключей для эфириума с помощью web3.py. Как сгенерировать ключи, если я установлю свою эфирную ноду.

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

Я настроил узел. Теперь, как можно получить ключи (приватный, публичный и эфирный адрес)? Пожалуйста, объясни.

Поскольку вы упомянули узел, я предполагаю, что вы хотите создать размещенный закрытый ключ в своем локальном узле. Если нет, обновите свой вопрос. См. web3py.readthedocs.io/en/latest/…

Ответы (2)

Вы можете использовать web3.personal.newAccount(password)метод:

Создает новую учетную запись в цепочке ключей узла, зашифрованную данным passphrase. Возвращает адрес созданной учетной записи.

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

Обратите внимание, что в целях безопасности узлы не раскрывают закрытый ключ через json-rpcAPI, который использует web3. Я также не знаю, как получить доступ к вашему открытому ключу.

Если вам нужны локальные ключи вместо размещенных ключей, ознакомьтесь с: Как я могу создать кошелек в python?


Редактировать : кажется, вам действительно нужны обе вещи: локальный ключ и размещенный ключ одновременно. Для этого вы можете создать ключ в узле, а затем извлечь его. Это включает в себя поиск файла и его расшифровку.

Где хранится ваш ключевой файл, зависит от вашего выбора узла, ОС и конфигурации. Я предполагаю, что gethпапка хранилища ключей по умолчанию:~/.ethereum/keystore/

Вы можете расшифровать ключевой файл, используя метод 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

Вы также спрашивали об открытом ключе, который не часто используется в Ethereum, поэтому для него нет отличного API. Вы можете использовать этот закрытый API, но обратите внимание, что имена этих переменных могут измениться в любое время:

acct._key_obj.public_key
Если я создаю локальные ключи (используя некоторые другие библиотеки для создания частных, общедоступных и эфирных адресов), могу ли я отправить их на узел, чтобы протолкнуть транзакцию (после подписания) с помощью w3.eth.sendRawTransaction()?
Я хочу использовать локальный узел, который контролируется мной, а также хочу генерировать ключи с помощью локального узла.

Предполагая, что вы активировали личный rpc вашего geth , чтобы сделать это программно без жесткого кодирования пути к каталогу файла хранилища ключей в python , сделайте следующее:

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)