Я хотел бы действительно понять майнинг pow, реализовав простой, но все еще борющийся.
предположим, что у нас есть пять майнеров, m1,...,m5. У каждого майнера хешрейт, m1=30%, m=20%,m3=15,m4,25, m5=10%, всего 100%
Как смоделировать (например, в простом коде на питоне) соревнование по майнингу между этими майнерами таким образом, чтобы каждые 15 секунд один из них находил новый блок с учетом их хешрейта. например, возможно, что два или три майнера получили блок одновременно. поэтому каждый блок распределяется (скажем, по времени) и подтверждается другими. Как это смоделировать? определить количество устаревших/дядей блоков и т. д.
Может кто поможет и подскажет в этом.
Редактировать : я потратил несколько часов на написание кода, который имитирует время распространения блока и дяди. Вы можете найти его в моем репозитории GitHub здесь: https://github.com/lungj/ethtools . Речь идет о программе mine_sim.py
. Я подумал, что было бы немного странно публиковать такую длинную программу в StackExchange.
Кроличья нора может быть довольно глубокой, в зависимости от того, насколько глубоко вы хотите моделировать объекты. В реальном мире майнинга майнеры вычисляют хэши определенных значений. Когда хэши удовлетворяют некоторым условиям, хешированные данные могут быть распространены в блокчейне. Когда блокчейн находится в равновесии по сложности и скорости хэширования, а время блока равно b , для каждого временного шага ts в вашей симуляции существует вероятность ( скорость хэширования / общая скорость хеширования ) * b / ts ) того, что блок будет добыт конкретным майнером.
Вот симуляция, которая игнорирует время распространения блока. Можно, конечно, добавить. То, как вы это сделаете, зависит от свойств сети, которую вы хотите смоделировать. Вы можете создать грубый расчет дяди, изменив TIMESTEP на время распространения вашего блока, и всякий раз, когда более одного майнера находят блок на одном и том же временном шаге моделирования, вы можете считать это дядей. Если вам нужна более сложная модель, для каждого узла вы можете сохранить состояние цепочки с точки зрения этого узла (с предположением, что некоторые узлы также являются майнерами). Вы можете моделировать задержки распространения между отдельными узлами, чтобы более реалистично имитировать распространение блоков. Затем вы захотите выбрать реалистичное число разветвлений для каждого узла (или смоделировать формирующиеся и разорванные соединения) и, возможно, смоделировать географическое распределение различных узлов. И, конечно же,
#!/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
МВт
легкие
МВт
легкие
BLOCKTIME = 15
.легкие
МВт
легкие
легкие