How do I create an ethereum wallet in Python?

14.6k views Asked by At

I am building an application that would create a wallet for a user. One option is the web3.personal API in web3.py, which has a newAccount('passphrase') method. The method only returns the address of created account.

What I'm looking for is a function similar to the eth.accounts API in web3.js, which has a create([entropy]) method. It returns an account object with 'address', 'privatekey' and other details.

2

There are 2 answers

2
carver On BEST ANSWER

Edit: I removed the deprecated pyethereum solution, replaced with the better eth-account one.

Setup

At shell: pip install eth_account

Generating Account

The eth-account library will help you create a private key with an attached address:

>>> from eth_account import Account

>>> acct = Account.create('KEYSMASH FJAFJKLDSKF7JKFDJ 1530')
>>> acct.privateKey
b"\xb2\}\xb3\x1f\xee\xd9\x12''\xbf\t9\xdcv\x9a\x96VK-\xe4\xc4rm\x03[6\xec\xf1\xe5\xb3d"
>>> acct.address
'0x5ce9454909639D2D17A3F753ce7d93fa0b9aB12E'

Adding some of your own randomness above helps address potential limitations of os.urandom, which depends on your version of Python, and your operating system. Obviously use a different string of randomness than the 'KEYSMASH...' one from above.

For more information about using the private key, see this doc with common examples, like signing a transaction.


As a side-note, you may find more support at ethereum.stackexchange.com

1
Valentin Kantor On

you can create private/public key pair with pure computations, bypassing the web3.py accounts api.

install requirements: pip install coincurve pysha3

from secrets import token_bytes
from coincurve import PublicKey
from sha3 import keccak_256

private_key = keccak_256(token_bytes(32)).digest()
public_key = PublicKey.from_valid_secret(private_key).format(compressed=False)[1:]
addr = keccak_256(public_key).digest()[-20:]
print('private_key:', private_key.hex())
print('eth addr: 0x' + addr.hex())

reference: https://www.arthurkoziel.com/generating-ethereum-addresses-in-python/