Simulación simplificada del algoritmo de "minería" de Bitcoin


Prefacio

Este artículo presenta el modelo de simulación simplificado del algoritmo de "minería" de Bitcoin y aprende las tareas asignadas por el profesor de criptografía a los bloggers. El código es solo de referencia.


1. Introducción a la "minería" de Bitcoin

Bitcoin es un tipo de moneda virtual de red generada por software P2P de código abierto. No depende de la emisión de una institución monetaria específica y se genera a través de una gran cantidad de cálculos de un algoritmo específico. La economía de Bitcoin utiliza una base de datos distribuida compuesta por muchos nodos en toda la red P2P para confirmar y registrar todos los comportamientos de las transacciones. . La naturaleza descentralizada de P2P y el algoritmo en sí pueden garantizar que el valor de la moneda no pueda ser manipulado por la producción a gran escala de Bitcoin.
El sistema Bitcoin consta de usuarios (los usuarios controlan sus billeteras a través de claves), transacciones (las transacciones se transmitirán a toda la red Bitcoin) y mineros (a través de cálculos competitivos para generar una cadena de bloques de consenso en cada nodo. La cadena de bloques es una distribución El público autorizado libro de cuentas contiene todas las transacciones que ocurren en la red Bitcoin).
Bitcoin
Los mineros de Bitcoin administran la red de Bitcoin resolviendo el problema de un mecanismo de prueba de trabajo con una cierta cantidad de trabajo: confirmar transacciones y evitar pagos dobles. Dado que la operación de hash es irreversible, es muy difícil encontrar el número de ajuste aleatorio que coincida con los requisitos, y requiere un proceso constante de prueba y error que puede predecir el número total de veces. En este momento, entra en juego el mecanismo de prueba de carga de trabajo. Cuando un nodo encuentra una solución que cumple con los requisitos, puede transmitir sus resultados a toda la red. Otros nodos pueden recibir este bloque de datos recién resuelto y verificar si coincide con las reglas. Si otros nodos descubren que los requisitos se cumplen mediante el cálculo del valor hash (el objetivo de cálculo requerido por Bitcoin), entonces el bloque de datos es válido y otros nodos aceptarán el bloque de datos.
Bitcoin 1
Satoshi Nakamoto compara la producción de Bitcoin al consumir energía y tiempo de la CPU con una mina de oro que consume recursos para inyectar oro en la economía. El software de nodos y minería de Bitcoin utiliza principalmente redes peer-to-peer, firmas digitales y sistemas de prueba interactivos para iniciar transacciones de verificación y prueba de conocimiento cero. Cada nodo de red transmite transacciones a la red. Después de que estas transacciones de transmisión sean verificadas por los mineros (computadoras en la red), los mineros pueden usar sus propios resultados de prueba de trabajo para expresar confirmación, y las transacciones confirmadas se empaquetarán en el bloque de datos. En, los bloques de datos se unirán para formar una cadena de bloques de datos continua. Cada nodo de Bitcoin recopilará todas las transacciones no confirmadas y las agrupará en un bloque de datos. El nodo minero agregará un número de ajuste aleatorio y calculará el valor de la operación hash SHA256 del bloque de datos anterior. El nodo de minería sigue intentando repetidamente hasta que el número de ajuste aleatorio que encuentra hace que el valor hash generado sea menor que un objetivo determinado.
(Fuente: Red)
(Fuente: Enciclopedia Baidu)

En segundo lugar, el algoritmo simplificó la simulación

1. Título

Parámetros: La función hash adopta SHA-256; la dificultad de minería es un entero d (> 0), que representa el número de cadenas iniciales del valor hash a 0. Cuanto menor es el valor de d, menor es la dificultad, mayor el valor de d, mayor es la dificultad

  1. Genera aleatoriamente un número entero x
  2. Genere un valor hash para x h = H (x)
  3. Juzgue la cadena principal de h: si es d 0, la minería es exitosa; de lo contrario, vuelva al paso 1 y
    obtenga: d = 1, 2, 3, 4, 5 cuando se alcance el consumo de energía de minería (el valor promedio de 3 grupos se pueden tomar)

2. Análisis de temas e introducción al módulo

①Módulo de números aleatorios

Para generar números aleatorios, puede utilizar numpylas funciones random.randint(a,b)de este módulo para generar números enteros aleatorios en el intervalo [a, b).

import numpy as np

②Módulo de función hash

Para utilizar el cifrado SHA-256 de función hash, puede utilizar hashlibel sha256()cifrado en el módulo .
hashlibMódulo también proporciona ha1(), sha224(), sha384(), sha512()y blake2b(), blake2s(), md5()y otros algoritmos de cifrado.

import hashlib as ha

Para usar el cifrado sha256, primero debe str()convertir el número aleatorio x en una cadena, luego usar string.encode('utf-8')la utf-8codificación de la cadena , luego update()cargarla y finalmente usarla para hexdigest()obtener el valor hash cifrado.

③Módulo de temporización

En Python, el método timeproporcionado time.perf_counter()por el módulo de tiempo devuelve el tiempo de ejecución del código actual (incluida la hora en que el sistema está inactivo), o el time.time()método aplicable devuelve la marca de tiempo del reloj del sistema (el número de segundos de punto flotante que han pasado desde la época de 1970).
La diferencia entre los dos valores de tiempo desde el inicio de la minería hasta el retorno exitoso de la minería se puede utilizar para calcular el tiempo de ejecución del código, es decir, el tiempo de minería.

import time

3. Escriba el código

Escribir código de acuerdo a los requerimientos de la asignatura y análisis.

import numpy as np
import hashlib as ha
import time

t=[]#存储挖矿时间

def find_gold(d):
    startTime = time.perf_counter()#记录开始时间
    text=""
    for i in range(0,d):
        text = text + '0'
    n = 1
    while True:
        x = np.random.randint(0,100000000)
        string = str(x)#随机数x转换为字符串
        utf_str=string.encode('utf-8')#进行'utf-8'编码

        h = ha.sha256()    #采用sha256加密
        h.update(utf_str)    #加载数据
        b = h.hexdigest()       #获取哈希值
        n= n + 1#计算次数
        if b[0:d] == text:
            costTime = time.perf_counter() - startTime#耗时=结束时间-开始时间
            print('随机数:{}'.format(x),'用时:{}'.format(costTime))
            print('哈希值:%s'%b)
            print('挖矿次数:%d'%n)
            print('挖矿成功!')
            break;
    t.append(costTime)#将此次耗时加入列表中
    
if __name__ == '__main__':
    for d in range(1,6):
        print('挖矿难度d:%d'%d)
        for i in range(0,3):
            find_gold(d)
        average_t = sum(t[3*(d-1):3*d]) / 3.0
        print('平均时间:{}'.format(average_t))
        print('\n')

4. Ejecución de resultados

Los resultados son los siguientes:
1
2
3

5. Pensando

La pregunta requiere tres promedios, pero después de muchos experimentos, puede llevar diez segundos o menos de un segundo extraer con éxito una vez cuando d = 5. La aleatoriedad es relativamente grande. Para calcular el tiempo promedio, se necesitan más datos.


para resumir

A través de este tema, aprendí sobre el algoritmo de "minería", aprendí sobre el módulo de tiempo y el módulo hsahlib a través del aprendizaje y completé la tarea.
Al principio, el número aleatorio que establecí era relativamente pequeño, entre 0 y 10, lo que provocó que d = 1 se ejecutara durante mucho tiempo y no pudiera agotarse. Y como no entendía nada, agregué un montón de texto impreso declaraciones y generar el valor hash. El número aleatorio de veces y así sucesivamente es fácil de verificar, lo que prolonga seriamente el tiempo de ejecución, y una vez se pensó que era la causa del algoritmo. Después de discutir con los compañeros de clase, cambié a un número aleatorio más grande. Cuanto más grande sea el número aleatorio, más larga será la cadena de valor hash generada y más fácil será hacer coincidir con éxito. Paso a paso, intente aumentar cada vez más. el principio, poner todas las declaraciones de impresión se eliminan, ahorrando tiempo.

Supongo que te gusta

Origin blog.csdn.net/weixin_47585015/article/details/110456948
Recomendado
Clasificación