¿Cómo puedo generar una billetera en python?

Estoy tratando de escribir un script de python que pueda generar una nueva billetera para ese usuario, pero necesito poder mantener la clave privada.

Seguí esto: respuesta de desbordamiento de pila
y obtuve estos resultados:

import os
from ethereum import utils
key = utils.sha3(os.urandom(4096))
print key
Out[5]: 'L\xf7\x98\x06\xb9\xbe>?
c\x88\xd3\xa7\x05\xdd\xe8AtNe\xf3\xe7Pc\xed\xd8L~\\\xcc\rq\x18'
raw = utils.privtoaddr(key)
print raw
Out[7]: 
'n\x98V8\x05\xa1\x05\x9b\x18\xca%\xb3\xed\xd0\xd5\xa9I\xf8\x97\x15'
add = utils.checksum_encode(raw)
print add
Out[9]: '0x6e98563805A1059B18ca25B3edd0d5a949f89715'

Por lo tanto, pude obtener una dirección, pero no estoy exactamente seguro de lo que estoy viendo aquí en las variables "clave" y "sin procesar".

El sistema operativo es Ubuntu 16.4, con Python 2.7.12
Tenga en cuenta que este es un pequeño proyecto personal para aprender, por lo que realmente no me importan los problemas de "seguridad".

Editar: pude usar esto para crear para hacer lo que necesitaba, dejaré esta pregunta abierta ya que todavía estoy interesado en mi primera forma. https://github.com/vkobel/ethereum-generate-wallet

Respuestas (1)

Parece que estás en Python 2. Py2 representa bytes en una cadena codificada en latin-1. A veces verá caracteres ASCII, otras veces verá algo como \x18lo que significa el byte 00011000, también conocido como 18 en hexadecimal, o 24 como un número entero. Una clave privada es solo un montón de bytes consecutivos.

rawes la representación binaria de la dirección. La dirección en addres la representación de cadena hexadecimal (con suma de verificación definida en EIP-55 ). Tenga en cuenta la terminación de la dirección: 15, que corresponde a \x15en addr.


También puede estar interesado en las características de web3.py v4 para la administración de claves privadas: http://web3py.readthedocs.io/en/latest/web3.eth.account.html

Parece que:

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

Si desea ver la codificación hexadecimal de la clave privada, puede usar:

>>> acct.privateKey.hex()
'b25c7db31feed9122727bf0939dc769a96564b2de4c4726d035b36ecf1e5b364'
Gracias por la explicación. Así que ahora puedo ver la clave privada "real" usando .encode('hex') en la cadena :)
Bueno, no estamos de acuerdo sobre lo que significa "real" sobre la clave privada. :) Creo que la representación de bytes nativos es la representación más natural. Sin embargo, agregaré una nota adicional para las personas que desean la versión hexadecimal.