Usando Python: cree una clave privada de mi elección, luego genere una clave pública y una dirección

Estoy buscando una biblioteca Bitcoin simple y fácil de usar para Python.

Lo que quiero hacer es verificar que puedo ingresar una clave privada hexadecimal que quiero y obtener la clave pública esperada en formato comprimido y la dirección 1Btc...

Miré cryptotools en github que parecía prometedor y fácil de usar, pero no aceptaría un valor hexadecimal que no fuera un múltiplo de 2. Sé que suena extraño, pero quiero poder ingresar un hexadecimal valor como c12 y hacer que funcione como se esperaba (a menos que tenga que ingresar 0c12 y eso funcionará, con el cero inicial descartado). Espero que cuando ingrese 0cfa721d esto se interprete como big endian.

bitcoinlib parece prometedor, pero lo encuentro confuso y lo he intentado durante un par de horas pero no estoy seguro de cómo obtener lo que quiero.

  1. Ingrese la clave privada en hexadecimal
  2. Recuperar la clave de publicación en formato hash160, comprimida
  3. Obtenga la dirección 1Btc... también.

Me pregunto si esta es una relación matemática estricta. Por ejemplo, ¿podría haber un número arbitrario o infinito de claves de publicación de la clave privada? ¿Hay alguna manera de asegurarme de obtener la clave pública que quiero de la clave privada? Quiero probar las claves privadas conocidas con la clave pública y la dirección BTC generada que corresponde a las claves y direcciones privadas conocidas, para poder tratar de averiguar cómo quien generó estas direcciones a partir de las opciones de claves privadas que puedo intentar replicar y hacer lo mismo. yo mismo.

Gracias por cualquier ayuda o sugerencia.

Hola, autor de cryptotools aquí. La razón por la que no aceptará dígitos impares hexadecimales es que almacenará la clave privada internamente como objeto de bytes de Python y el método bytes.fromhex requiere bytes completos. Le echaré un vistazo. Como solución, simplemente puede rellenar con un cero si tiene una cantidad impar de dígitos. 0x0cfa721d es exactamente lo mismo que 0xcfa721d. La otra funcionalidad está ahí, solo hazlo.myprivatekey.to_public().to_address('P2PKH', compressed=True)

Respuestas (1)

Para este caso tan reducido, puedes echar un vistazo a https://github.com/circulosmeos/bitcoin-in-tiny-pieces

Tiene cada operación codificada para facilitar su comprensión, aislada en un archivo diferente, pero son fáciles de unir o usar directamente desde la línea de comandos: por ejemplo:

$ echo 0x01 | ./bitcoin-public-from-private.py | ./bitcoin-address-from-public-key.py

Y para la pregunta:

Por ejemplo, ¿podría haber un número arbitrario o infinito de claves de publicación de la clave privada?

En principio, de una clave privada solo se deriva una clave pública: pero esta se puede codificar en tres direcciones de Bitcoin diferentes . Normalmente sólo se utilizan uno o dos de estos formatos.

Esto es en el caso más simple, sin considerar casos más complejos introducidos más tarde en Bitcoin (como claves HD , etc.)...

¡Hey, gracias! Bifurqué su repositorio en github.com/jamesyoungdigital/bitcoin-in-tiny-pieces.git para agregar una pequeña herramienta nueva que verifica los saldos de direcciones de Brainwallet. No estaba teniendo mucho éxito con el script de shell. Ahora depende de mi bifurcación de pybitcointools.git, que es realmente fácil de usar y no depende de casi nada. ¡Espero que te gusten las pequeñas adiciones! :)
¡Me alegro de que haya sido útil! En cuanto al script de shell, simplemente abra un problema y le echaré un vistazo: ¡funcionaría perfectamente!
¡Estrella otorgada! Me gustaría dar unas cuantas más pero no me dejan, jaja. :-) Con el script de shell, intento así: ./bitcoin-test-address-balance.sh satoshi pero el resultado siempre es: ... 2 .... n y por lo que sé, nunca termina . El problema parece estar en la secuencia de comandos de python de balance de direcciones, líneas 62 a 64, cuando se detecta una excepción. La URL debe usar {} para la interpolación. Por favor vea mi solicitud de extracción. ¡Gracias! :-)
Hola James, creo que la excepción se detecta correctamente: la cuestión es que blockchain.info a veces descarta la petición, probablemente debido al alto tráfico: en ese caso, el script duerme de 1 a n minutos entre reintentos: como se hace para ejecutar lotes, esto no se considera un problema :-o pero gracias por tu tirón!