Python Blockchain: creación de mineros
Para habilitar la minería, necesitamos desarrollar una función de minería. La funcionalidad de minería debe generar un resumen en una cadena de mensaje determinada y proporcionar una prueba de trabajo. Discutamos esto en este capítulo.
Función de resumen de mensajes
Escribiremos una función de utilidad llamada sha256 para crear un resumen sobre un mensaje dado -
def sha256(message):
return hashlib.sha256(message.encode('ascii')).hexdigest()
los sha256 la función toma un message como parámetro, lo codifica en ASCII, genera un resumen hexadecimal y devuelve el valor al llamador.
Función de minería
Ahora desarrollamos el minefunción que implementa nuestra propia estrategia minera. Nuestra estrategia en este caso sería generar un hash en el mensaje dado que tiene como prefijo un número determinado de unos. El número dado de unos se especifica como parámetro paramine función especificada como el nivel de dificultad.
Por ejemplo, si especifica un nivel de dificultad de 2, el hash generado en un mensaje dado debe comenzar con dos 1, como 11xxxxxxxx. Si el nivel de dificultad es 3, el hash generado debe comenzar con tres unos, como 111xxxxxxxx. Dados estos requisitos, ahora desarrollaremos la función de minería como se muestra en los pasos que se indican a continuación.
Paso 1
La función de minería toma dos parámetros: el mensaje y el nivel de dificultad.
def mine(message, difficulty=1):
Paso 2
El nivel de dificultad debe ser mayor o igual a 1, lo aseguramos con la siguiente declaración de aserción:
assert difficulty >= 1
Paso 3
Creamos un prefix variable utilizando el nivel de dificultad establecido.
prefix = '1' * difficulty
Tenga en cuenta que si el nivel de dificultad es 2, el prefijo sería "11" y si el nivel de dificultad es 3, el prefijo sería "111", y así sucesivamente. Comprobaremos si este prefijo existe en el resumen generado del mensaje. Para digerir el mensaje en sí, usamos las siguientes dos líneas de código:
for i in range(1000):
digest = sha256(str(hash(message)) + str(i))
Seguimos agregando un nuevo número ial hash del mensaje en cada iteración y generar un nuevo resumen sobre el mensaje combinado. Como entrada alsha256 función cambia en cada iteración, el digestel valor también cambiaría. Comprobamos si estodigest el valor tiene por encima del conjunto prefix.
if digest.startswith(prefix):
Si se cumple la condición, cancelaremos el for bucle y devuelve el digest valor para la persona que llama.
La totalidad mine el código se muestra aquí -
def mine(message, difficulty=1):
assert difficulty >= 1
prefix = '1' * difficulty
for i in range(1000):
digest = sha256(str(hash(message)) + str(i))
if digest.startswith(prefix):
print ("after " + str(i) + " iterations found nonce: "+ digest)
return digest
Para su comprensión, hemos agregado el print declaración que imprime el valor de resumen y el número de iteraciones que se necesitaron para cumplir la condición antes de regresar de la función.
Prueba de la función de minería
Para probar nuestra función de minería, simplemente ejecute la siguiente declaración:
mine ("test message", 2)
Cuando ejecute el código anterior, verá un resultado similar al siguiente:
after 138 iterations found nonce:
11008a740eb2fa6bf8d55baecda42a41993ca65ce66b2d3889477e6bfad1484c
Tenga en cuenta que el resumen generado comienza con "11". Si cambia el nivel de dificultad a 3, el resumen generado comenzará con "111" y, por supuesto, probablemente requerirá más iteraciones. Como puede ver, un minero con más poder de procesamiento podrá extraer un mensaje determinado antes. Así es como los mineros compiten entre sí para obtener sus ingresos.
Ahora, estamos listos para agregar más bloques a nuestra cadena de bloques. Aprendamos esto en nuestro próximo capítulo.