Nehmen wir an, wir haben n Miner in unserem Mining-Pool. Nun hat der Manager des Pools die Transaktionen verifiziert und in einen zu minenden Block gepackt. Dann hat es den Block an alle n Miner im Pool weitergegeben.
Nehmen wir an, dass unser Block wie folgt ist:
to_mine_block = {
Block No: 1000
Prev Block:999
timestamp: "1000-01-01 00:00:00"
Data : "XYZ"
nonce : ?
}
Nun wird to_mine_block an alle n Miner gesendet. Will n Miners führt den folgenden Code aus
String target = new String(new char[difficulty]).replace('\0', '0');
while(!hash.substring( 0, difficulty).equals(target)) {
nonce ++;
hash = calculateHash();
}
Werden alle n Miner diesen Code einzeln im Pool ausführen? Wenn dies der Fall ist, wird dieses Rennen immer von den Bergleuten mit der höchsten Bergbauleistung gewonnen. Denn derjenige mit der höchsten Mining-Power wird sich in der Schleife weiterbewegen als diejenigen mit geringer Hash-Power.
So funktioniert Mining normalerweise nicht in einem Pool. Die Mining-Software weist normalerweise extranonce
jedem Miner einen anderen zu, der Teil der Coinbase-Transaktion ist, und führt zu einem anderen Merkle-Root (und einem anderen Block-Header). Dann können sie alle bei Nonce 0 beginnen, wie Sie vorschlagen, aber sie werden kein Rennen fahren einander für denselben Block, weil sie unterschiedlich sind. Siehe https://bitcointalk.org/index.php?topic=9438.msg136344#msg136344 .
Nur zur Verdeutlichung, die Daten, die während des Minings gehasht werden, sind der Block-Header, der aus Folgendem besteht: