Arbeitsverteilung in einem Mining-Pool

Wie wird die Arbeit unter den Mitgliedern eines Pools verteilt?

Wie wird der Satz von Lösungen für Nonces in Bezug auf den Block-Hashing-Algorithmus und gültige Hashes eines neuen Knotens unter den Bergleuten „verteilt“?
Wird zum Beispiel eine Nonce mehrfach von verschiedenen Minern im Pool ausprobiert? Oder teilen Miner den Lösungsraum untereinander auf und arbeiten jeweils mit einer begrenzten und sich gegenseitig ausschließenden Auswahl an Nonces?

Im Allgemeinen wird die Arbeit so verteilt, dass die gleiche Arbeit nie zweimal gemacht wird, da dies einfach Verschwendung wäre. Beachten Sie jedoch, dass dies getan werden kann, um die Ehrlichkeit des Miners zu überprüfen: Schicken Sie ihm einige Arbeiten, von denen der Poolbetreiber bereits weiß, dass sie sehr schnell eine Lösung haben sollten, und prüfen Sie, ob der Miner tatsächlich mit dieser Lösung antwortet.
@Jannes: Die Überprüfung der Ehrlichkeit auf diese Weise funktioniert nicht mehr wirklich, da die Arbeitsverteilung jetzt erfolgt, indem dem Miner eine Vorlage für die Arbeit gegeben wird (Stratum- und Getblocktemplate-Protokolle). Dem Miner wird keine spezifische Arbeit mehr gegeben (wie beim alten Getwork-Protokoll).

Antworten (2)

Der Mining-Server des Pools gibt jedem Miner eine Vorlage zur Generierung von Blöcken. Wenn der Server aktualisieren möchte, welche Transaktionen enthalten sind oder welcher Block darauf aufgebaut werden soll, wird er eine neue Vorlage an jeden Miner senden.

Um Arbeit für sich selbst zu generieren, darf der Miner die Nonce, den Zeitstempel und die Extranonce ändern.

Die Nonce ist nur eine 32-Bit-Zahl ohne besondere Bedeutung. Alle möglichen Nonce-Werte werden schnell von moderner Bitcoin-ASIC-Hardware gescannt, sodass Sie mit demselben Zeitstempel und derselben Extranonce nur einen winzigen Arbeitsaufwand haben.

Die Extranonce ist Teil der Generierungstransaktion, der Transaktion, die neue Münzen generiert, die die erste Transaktion im Block ist. Die Extranonce hat keine besondere Bedeutung.

Der Server darf niemals dieselbe Blockvorlage zweimal senden, um sicherzustellen, dass dieselbe Arbeit nicht mehrmals ausgeführt wird. Im Stratum-Protokoll wird die Extranonce in Extranonce 1 und Extranonce 2 aufgeteilt. Extranonce 1 gehört zum Server und befindet sich in einem Teil des Block-Templates, das der Miner nicht ändern darf. Um zu verhindern, dass dieselbe Arbeit zweimal gesendet wird, darf der Server niemals denselben Extranonce-1-Wert wiederverwenden, es sei denn, etwas anderes (das vom Miner nicht geändert werden kann) in der Vorlage hat sich geändert. Zum Beispiel die anderen (nicht generierten) Transaktionen oder der vorherige Block (der Block, auf dem wir aufbauen). Als Teil der Vorlage teilt der Server dem Miner mit, wie groß die Extranonce 2 sein sollte, normalerweise 4 Bytes. Wenn der Miner alle möglichen Nonce-Werte ausprobiert hat, kann er neue Arbeit generieren, indem er den Wert von Extranonce 2 ändert.

Der Zeitstempel (bekannt als ntime) kann auch nützlich sein, um Arbeit zu generieren. Dies kann die Arbeitsbelastung eines langsamen Controllers verringern, der Arbeit an schnelle ASIC-Chips weiterleitet. Der Controller muss nur genug Arbeit erzeugen, um die ASICs für 1 Sekunde beschäftigt zu halten, indem er verschiedene Extranonce 2-Werte verwendet. Danach kann ntime jede Sekunde um 1 erhöht werden und die gleichen extranonce 2 Werte wiederverwendet werden. Dies wird als "roll ntime" oder "roll time" bezeichnet, da das ntime-Feld des Blocks vorwärtsgerollt wird. Der ntime-Wert kann auch jede Sekunde inkrementiert werden, um genauere Zeitstempel auf Blöcken zu erhalten, ohne Extranonce-2-Werte wiederzuverwenden.

Auf diese Weise arbeiten Server und Client zusammen, um Arbeit zu generieren, und derselbe Block wird nie zweimal gehasht.

Danke für deine Antwort! Eine Sache ist mir immer noch nicht klar: "Auf diese Weise arbeiten Server und Client zusammen, um Arbeit zu generieren, und derselbe Block wird nie zweimal gehasht." - Meinst du mit "derselbe Block" denselben Block-Header-Hash oder meinst du, dass niemals ein anderer gültiger untergeordneter Block mit einem anderen Hash erstellt wird? Denn im Falle einer Gabelung zwischen einer egoistischen und einer ehrlichen Unterkette besteht die Möglichkeit, dass die Unterkette des ehrlichen Pools gegabelt wird, nicht wahr?
Sie möchten niemals denselben Block zweimal hashen (dieselbe Arbeit wiederholen), daher müssen Sie immer einen Teil des Blocks entweder im Header oder in der Gruppe von Transaktionen ändern.

Um dies zunächst zu verdeutlichen, ist der Header h, der von Bergleuten mit doppeltem SHA256 gehasht wird, eine Summierung von version v, hash pbroot hashof des vorherigen Blocks r, time t, Bits, bdie das Ziel (Schwierigkeit) sind, zusätzlich zu a nonce.
Denken Sie daran, dass das noncekeine wirklich große Zahl ist. Tatsächlich kann ein schneller ASIC-Miner alle verschiedenen Werte in einer nonce. Aber es gibt andere dynamische Attribute, wie tdas, das jede Sekunde eine neue Reihe von Möglichkeiten für eine Nonce bietet, und auch den Root-Hash r, der der Hash aller Transaktionen im Merkle-Root ist. Je nachdem, wie Sie die Transaktionen sortieren, werden unterschiedliche Wurzeln gebildet.
Je nach Pool sollte der Pool-Organisator versuchen, den Aufwand seiner Miner nicht zu verschwenden, indem er effizient das Beste daraus macht. Durch die Änderung der Position von Transaktionen kann der Pool-Organisator also unterschiedliche Arbeiten durchführen, rdie auch unterschiedliche Arbeiten für seine Miner ausführen können. Zusätzlich können sich Transaktionen ändern, die jede Sekunde hinzugefügt werden r.

Ich hatte den Eindruck, dass die Aktualisierung von extraNonce die üblichere Methode für Pool-Betreiber ist, um die Merkle-Root zu ändern – siehe diese SE-Antwort .