¿Cómo modelar la competencia minera entre mineros y tíos?

Me gustaría entender realmente la minería de energía mediante la implementación de uno simple, pero aún tengo problemas.

supongamos que tenemos cinco mineros, m1,...,m5. Cada minero tiene una tasa de hash, m1=30%, m=20%,m3=15,m4,25, m5=10%, en total 100%

Cómo simular (por ejemplo, en código python simple) la competencia de minería entre estos mineros de tal manera que cada 15 segundos uno de ellos encuentre un nuevo bloque teniendo en cuenta su tasa de hash. por ejemplo, podría ser posible que dos o tres mineros obtuvieran un bloque al mismo tiempo. por lo tanto, cada bloque se distribuye (digamos tiempo de acuerdo) y otros lo confirman. ¿Cómo modelar esto? decidir el número de bloques obsoletos/tíos, etc.

¿Alguien podría ayudar y aconsejar en esto?

Respuestas (1)

Editar : pasé algunas horas escribiendo un código que simula el tiempo de propagación del bloque y los tíos. Puede encontrarlo en mi repositorio de GitHub aquí: https://github.com/lungj/ethtools . El programa en cuestión es mine_sim.py. Pensé que sería un poco extraño publicar un programa tan largo en StackExchange.

La madriguera del conejo puede volverse bastante profunda, dependiendo de qué tan profundo quieras modelar las cosas. En el mundo real de la minería, los mineros calculan hashes de valores particulares. Cuando los hash cumplen algunas condiciones, los datos que se codifican se pueden propagar a la cadena de bloques. Cuando la cadena de bloques está en equilibrio para la dificultad y la tasa de hash y el tiempo de bloque es b , para cada paso de tiempo ts en su simulación, existe una ( tasa de hash / tasa de hash total ) * b / ts ) posibilidad de que un minero en particular extraiga un bloque.

Aquí hay una simulación que ignora los tiempos de propagación de bloques. Por supuesto, puedes agregar eso. Cómo lo hace depende de las propiedades de la red que desea simular. Puede crear un cálculo de tío crudo cambiando TIMESTEP al tiempo de propagación de su bloque y, cada vez que más de un minero encuentra un bloque en el mismo paso de tiempo de simulación, puede contarlo como un tío. Si desea un modelo más complejo, para cada nodo, puede almacenar el estado de la cadena desde la perspectiva de ese nodo (suponiendo que algunos nodos también son mineros). Puede modelar los retrasos de propagación entre nodos individuales para simular las propagaciones de bloques de forma más realista. A continuación, querrá elegir un número realista de fan-in/fan-out para cada nodo (o simular conexiones que se forman y se interrumpen) y tal vez modelar la distribución geográfica de varios nodos. Y por supuesto,

#!/usr/bin/env python3
import random

class Miner(object):
    def __init__(self, name, hashrate):
        '''Initialize a new miner named name with hashrate measured in hashes per second.'''
        self.name = name
        self.hashrate = hashrate

MINERS = [
    Miner('Alice', 30e6),
    Miner('Bob', 20e6),
]

TIMESTEP = 0.01     # Timestep of simulation
BLOCKTIME = 15      # Average number of seconds per block

TOTAL_HASHPOWER = sum([miner.hashrate for miner in MINERS])
time = 0

while True:
    for miner in MINERS:
        if (random.random() * (TOTAL_HASHPOWER / miner.hashrate)) < (TIMESTEP / BLOCKTIME):
            print("t=%0.3f: %s mined a block" % (time, miner.name))
    time += TIMESTEP
Muchas gracias por esta respuesta. ¿Podría aclarar qué quiere decir con marca de tiempo aquí y por qué es 0.01? Además, no entiendo la condición IF en el ciclo. Probé el código y funciona bien. Para el tiempo de propagación del bloque (retraso), supongamos que una vez que un minero encuentra un bloque, hay un retraso con un número aleatorio en promedio de 12 segundos para que el bloque llegue a todos los demás mineros. ¿Cómo calcular tíos entonces, modelar su inclusión y resolver bifurcaciones?. Le agradecería que pudiera extender esto (el tiempo de propagación del bloque puede ser aleatorio y no depende de las ubicaciones u otros atributos de la red).
Un paso de tiempo es un paso de tiempo discreto en una simulación (el cuanto más pequeño). También se refiere a la iteración actual de una simulación. Siempre puedes mejorar la fidelidad del modelo hasta que tengas un experimento del mundo real, así que te lo dejo a ti. Y lo que elige modelar es una fuerte función de lo que quiere descubrir. Y no está claro lo que estás modelando. Los modelos estadísticos dan mejores resultados sin largas simulaciones (y no están sujetos a ejecuciones fortuitas). Por ejemplo, ethereum.stackexchange.com/questions/18201/…
Gracias. si el tiempo de propagación del bloque es de 12 segundos, ¿tengo que reemplazar TIMESTEP tanto en la condición if como en la última declaración, donde time += TIMESTEP, cambiando 0.01 a 12?
El tiempo de propagación del bloque no se modela en esta simulación. Puede cambiar el tiempo de bloqueo a 12 segundos cambiando solo la línea BLOCKTIME = 15.
@MWH Actualicé mi respuesta para incluir un enlace a un programa que escribí para hacer una simulación más profunda.
Gracias. Parece que hay un error en la línea 68 para tíos porque no pude ejecutarlo. ¡Se ve bien! pero no pude saber dónde se almacena la información del bloque. por ejemplo, chainstate parece recompensa de retorno obtenida por cada minero. ¿Cómo obtener cuántos bloques extrajo con éxito cada minero y cuántos bloques tío produjo cada minero? por ejemplo, si Alice y Bob generaron bloques dentro del mismo período de tiempo (15 segundos), se confirmará un bloque y el otro será tío.
Parchado (parece que presioné deshacer en mi editor antes de guardar). Si desea saber cuántos tíos y bloques tiene un minero individual en cada cadena, puede aumentar el bloque de código a partir de la línea 68 y mantener un recuento de tíos (en lugar o además de contar las recompensas del bloque). En la vida real (ni en esta simulación, si se completa de la misma manera), no se garantiza que Alice y Bob generen bloques al mismo tiempo que resulte en que cualquiera de ellos tenga bloques que cualquiera pueda usar como tío. Y, por supuesto, las bifurcaciones ocurren todo el tiempo, así que quién tiene qué es siempre una cuestión de perspectiva.
O, si desea determinar el número de tíos y bloques extraídos, puede hacerlo de la forma habitual: elija una cadena para la que desee contar las estadísticas y recorra la cadena. Los tíos de cada bloque y los mineros de cada bloque (incluidos los tíos) se almacenan en las cadenas simuladas.