es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Construyendo direcciones Bech32

Estoy tratando de seguir los pasos aquí https://en.bitcoin.it/wiki/Bech32 para generar una dirección bech32 válida. Me quedo atascado en el primer paso:

  1. Tener una clave pública comprimida (0x02 o 0x03 seguido de la coordenada X de 32 bytes):
    0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798
  2. Realizar un hash SHA-256 en la clave pública:
    0f715baf5d4c2ed329785cef29e562f73488c8a2bb9dbc5700b361d54b9b0554

Aquí hay una de las cosas que intenté:

>>> import hashlib
>>> m = hashlib.sha256()
>>> m.update('0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798')
>>> m.hexdigest()
'd13c888cfd35d6ab67dc3f67edcc401833e6ae4eec20b254b1981b187946ed91'

Nota:
1. Estoy limitado a Python 2.7.18
2. Estoy creando estas direcciones con fines de prueba, no son necesarias para uso real pero deben ser válidas
3. Si sabes cómo realizar los pasos 3+, por favor, compártelos también 🙂
4. Hay una supuesta implementación de referencia aquí: https://github.com/fiatjaf/bech32/blob/master/bech32/init.py, pero no entiendo nada… parece ser completamente diferente del proceso descrito.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    El problema parece estar en la forma en que se pasa la entrada al método update() en el módulo hashlib. La entrada que se pasa al método debe ser una cadena de bytes, pero en el fragmento de código proporcionado, la entrada es una cadena Unicode. Aquí está la versión corregida:

    import hashlib
    
    public_key = bytes.fromhex('0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798')
    m = hashlib.sha256()
    m.update(public_key)
    print(m.hexdigest()) # La salida debería ser: 0f715baf5d4c2ed329785cef29e562f73488c8a2bb9dbc5700b361d54b9b0554
    

    Para generar una dirección bech32 válida, los siguientes pasos involucran convertir el resultado del hash en una cadena base32 y agregarle un checksum. La implementación de referencia mencionada en la pregunta debería ayudar con esto.

Comments are closed.