How do I create an ethereum wallet in Python?
Asked Answered
S

2

15

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.

Salter answered 1/9, 2017 at 16:15 Comment(2)
Is it important to you that your node ends up with a copy of the key, or are you satisfied if everything happens in pure python?Chafer
@Chafer I was actually looking for something that would happen completely in pythonSalter
C
18

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

Chafer answered 1/9, 2017 at 17:43 Comment(2)
Thank you very much for the detailed instructions. However, I wanted to know if this key pair can be used to perform actual transactions (sorry, I'm very new to this field). Also, I wanted to store a WalletID, Private Key, and Password (for the private key, similar to password used in myetherwallet) in my database. Is that possible?Salter
This is a broad extension from the focused one you asked before. They would probably be best split into focused questions. Also, you will get more support if you show the work you tried along the way. A site like reddit.com/r/ethdev might be better for open-ended "How do I get started?" questions.Chafer
C
0

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

install requirements: pip install coincurve

from hashlib import sha3_256
from secrets import token_bytes
from coincurve import PublicKey

private_key = sha3_256(token_bytes(32)).digest()
public_key = PublicKey.from_valid_secret(private_key).format(compressed=False)[1:]
addr = sha3_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/

Cameron answered 31/7, 2021 at 2:35 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.