Ich würde den Pow-Mining gerne wirklich verstehen, indem ich einen einfachen umsetze, aber ich kämpfe immer noch.
Angenommen, wir haben fünf Miner, m1, ..., m5. Jeder Miner hat eine Hash-Rate, m1=30 %, m=20 %, m3=15, m4,25, m5=10 %, insgesamt 100 %
Wie man (z. B. in einfachem Python-Code) den Mining-Wettbewerb zwischen diesen Minern so simuliert, dass alle 15 Sekunden ein neuer Block von einem von ihnen unter Berücksichtigung ihrer Hash-Rate gefunden wird. Beispielsweise könnte es möglich sein, dass zwei oder drei Miner gleichzeitig einen Block erhalten. also wird jeder Block verteilt (sagen wir mal time dealy) und von anderen bestätigt. Wie kann man das modellieren? Entscheiden Sie die Anzahl der veralteten / Onkel-Blöcke usw
Könnte jemand helfen und beraten in diesem.
Bearbeiten : Ich habe ein paar Stunden damit verbracht, Code zu schreiben, der die Blockausbreitungszeit und Onkel simuliert. Sie finden es in meinem GitHub-Repo hier: https://github.com/lungj/ethtools . Das betreffende Programm ist mine_sim.py
. Ich dachte, es wäre etwas seltsam, ein so langes Programm in StackExchange zu posten.
Das Kaninchenloch kann ziemlich tief werden, je nachdem, wie tief Sie die Dinge modellieren möchten. In der eigentlichen Welt des Minings berechnen Miner Hashes mit bestimmten Werten. Wenn die Hashes einige Bedingungen erfüllen, können die gehashten Daten an die Blockchain weitergegeben werden. Wenn die Blockchain hinsichtlich Schwierigkeit und Hash-Rate im Gleichgewicht ist und die Blockzeit b ist, besteht für jeden Zeitschritt ts in Ihrer Simulation eine ( Hashrate / Gesamt-Hashrate ) * b / ts ) Chance, dass ein Block von einem bestimmten Miner abgebaut wird.
Hier ist eine Simulation, die Blocklaufzeiten ignoriert. Das kannst du natürlich ergänzen. Wie Sie dabei vorgehen, hängt von den Eigenschaften des Netzwerks ab, das Sie simulieren möchten. Sie können eine grobe Onkelberechnung erstellen, indem Sie TIMESTEP in Ihre Blocklaufzeit ändern, und wenn mehr als ein Miner einen Block im selben Simulationszeitschritt findet, können Sie dies als Onkel zählen. Wenn Sie ein komplexeres Modell wünschen, können Sie für jeden Knoten den Kettenzustand aus der Perspektive dieses Knotens speichern (unter der Annahme, dass einige Knoten auch Miner sind). Sie können Ausbreitungsverzögerungen zwischen einzelnen Knoten modellieren, um Blockausbreitungen realistischer zu simulieren. Sie möchten dann für jeden Knoten eine realistische Fan-in/Fan-out-Zahl wählen (oder das Bilden und Trennen von Verbindungen simulieren) und vielleicht die geografische Verteilung verschiedener Knoten modellieren. Und natürlich,
#!/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
MWH
lungj
MWH
lungj
BLOCKTIME = 15
.lungj
MWH
lungj
lungj