Wie kann man den Bergbauwettbewerb zwischen Bergleuten und Onkeln modellieren?

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.

Antworten (1)

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
Vielen Dank für diese Antwort. könnten Sie bitte klarstellen, was Sie hier mit Zeitstempel meinen und warum es 0,01 ist? Außerdem verstehe ich die IF-Bedingung in der Schleife nicht. Ich habe den Code ausprobiert und er funktioniert einwandfrei. Nehmen wir für die Blockausbreitungszeit (Verzögerung) an, sobald ein Miner einen Block gefunden hat, gibt es eine Verzögerung mit einer Zufallszahl von durchschnittlich 12 Sekunden, damit der Block alle anderen Miner erreichen kann. Wie berechnet man dann Onkel, modelliert deren Inklusion und löst Forks?. Ich würde mich freuen, wenn Sie dies verlängern könnten (die Blocklaufzeit kann eine zufällige Zeit sein und hängt nicht von Standorten oder anderen Netzwerkattributen ab).
Ein Zeitschritt ist ein diskreter Zeitschritt in einer Simulation (das kleinste Quant). Es bezieht sich auch auf die aktuelle Iteration einer Simulation. Sie können die Genauigkeit des Modells immer verbessern, bis Sie ein reales Experiment haben, also überlasse ich das Ihnen. Und was Sie modellieren möchten, hängt stark davon ab, was Sie herausfinden möchten. Und es ist nicht klar, was Sie modellieren. Statistische Modelle liefern eine bessere Ausgabe ohne lange Simulationen (und unterliegen keinen Zufallsläufen). Zum Beispiel ethereum.stackexchange.com/questions/18201/…
Danke. Wenn die Blocklaufzeit 12 Sekunden beträgt, muss ich TIMESTEP sowohl in der if-Bedingung als auch in der letzten Anweisung, wo time += TIMESTEP, ersetzen, indem ich 0,01 in 12 ändere?
Die Blocklaufzeit wird in dieser Simulation nicht modelliert. Sie können die Sperrzeit auf 12 Sekunden ändern, indem Sie nur die Zeile ändern BLOCKTIME = 15.
@MWH Ich habe meine Antwort aktualisiert, um einen Link zu einem Programm aufzunehmen, das ich geschrieben habe, um eine eingehendere Simulation durchzuführen.
Danke. Es scheint, dass es einen Fehler in Zeile 68 für Uncles gibt, da ich ihn nicht ausführen konnte. Es sieht gut aus! Aber ich konnte nicht herausfinden, wo Blockinformationen gespeichert sind. Zum Beispiel scheint Chainstate eine Gegenbelohnung zu sein, die jeder Miner bekommt. Wie bekomme ich heraus, wie viele Blöcke jeder Miner erfolgreich abgebaut hat und wie viele Onkelblöcke jeder Miner produziert hat? Wenn beispielsweise Alice und Bob innerhalb einer kurzen Zeitspanne (15 Sekunden) Blöcke generiert haben, wird ein Block bestätigt und der andere ist Onkel.
Gepatcht (scheint, als hätte ich vor dem Speichern in meinem Editor auf Rückgängig gemacht). Wenn Sie wissen möchten, wie viele Onkel und Blöcke ein einzelner Miner in jeder Kette hat, können Sie den Codeblock ab Zeile 68 erweitern und eine Onkelzählung führen (anstatt oder zusätzlich zum Zählen der Blockbelohnungen). Im wirklichen Leben (noch in dieser Simulation, wenn sie auf die gleiche Weise gefüllt ist) ist nicht garantiert, dass Alice und Bob gleichzeitig Blöcke generieren, was dazu führt, dass einer von ihnen Blöcke hat, die von jedem als Onkel verwendet werden können. Und natürlich kommt es immer wieder zu Forks, also wer was hat, ist immer eine Frage der Perspektive.
Oder, wenn Sie die Anzahl der Onkel und abgebauten Blöcke bestimmen möchten, können Sie es wie gewohnt tun: Wählen Sie eine Kette aus, für die Sie Statistiken zählen möchten, und gehen Sie durch die Kette. Die Onkel jedes Blocks und Miner für jeden Block (einschließlich der Uncles) werden in den simulierten Ketten gespeichert.