Hallo zusammen,
kann mir einer sagen wie die Miner die Nonce auswählen. Gibt es da irgendwelche Kriterien? Mir ist aufgefallen, dass die letzten Blöcke, egal welcher pool den Block gemined hat, alle mit „0x………“ anfangen. Warum?
Und ich möchte gerne wissen, ob ich den Mining Prozess grob verstanden habe. Dazu würde ich kurz zusammenfassen, was ich bis jetzt gelernt habe und offene Fragen stellen.
Die Miner sammeln lukrative Transaktionen mit möglichst hohen Gebühren. Die Transaktionen werden dann als Paare zu einer Merkle root gehashed, die bei jedem Miner anders ist. Wenn der Miner keine Transaktionen mehr in den Block schreibt, beginnt das eigentliche Mining. Zusammen mit den restlichen Informationen aus dem Block Header, versucht der Miner eine Nonce zu finden die, je nach difficulty mit einer bestimmten Anzahl an Nullen beginnen muss. Durch den Zeitstempel, der sich jede sekunde ändert, können die selben Nonce in jder sekunde verwendet werden und man bekommt immer einen anderen Hash. Wenn nach zwei SHA256 Durchläufen keine passenden Nonce gefunden wird, hat der Miner noch die Möglichkeit Transaktionen in der Merkle root zu verändern, um dann zwei neue SHA256 Durchläufe zu starten, um eine gültige Nonce zu finden. Frage: Haben die Miner, die schneller mit dem Mining beginnen und dafür weniger Transaktionen hashen einen Vorteil schneller die passende Nonce zu finden? Oder bekommen alle Miner mit, wenn der erste Miner anfängt und fangen dann auch alle an? Wie man an den letzten Blöcken sieht, werden ja nicht alle voll gemacht.
Ich würde mich freuen, wenn ihr mir meine Fragen beantworten könnt und auf Verständnis Probleme aufmerksam macht.
Vielen Dank Darkis
Das ist der Prefix für eine Hexadezimale Zahl und nicht Teil der Nonce.
Sie fangen bei 0 an und zählen sie für jede Berechnung einfach hoch. Ob das garantiert immer so ist kann ich dir nicht sagen, es ist absolut egal wie man die Nonce wählt, solange der Input insgesamt halt irgendwie anders ist.
Die Nonce ist allerdings so klein (4 Bytes) dass sie im Bruchteil einer Sekunde schon komplett ausgeschöpft ist.
Deswegen wird die Coinbase Transaktion zusätzlich als Extra Nonce verwendet, denn da haben die Miner deutlich mehr Platz. Siehe hier. Für jede neue Extra Nonce (oder sonstige Veränderung) können sie dann die Nonce im Block Header einmal komplett durch rattern lassen.
Der Timestamp verändert sich sowieso jede Sekunde (und wird auch oft gestreckt), d.h. es geht darum genug Noncen zu haben um eine Sekunde „durchhalten“ zu können.
Es geht nicht nur um die Nonce. Der Miner verändert Timestamp, Nonce und passt Transaktionen im Block an um den Hashwert zu beeinflussen. (Transaktionen komplett neu anzuordnen ist allerdings sehr teuer, da der Miner den kompletten Merkle Tree neu ausrechnen muss. Verändert er nur etwas an der Coinbase Transaktion, dann ist es „nur der eine Pfad“ der neu berechnet werden muss)
Es geht darum eine Zahl zu finden die kleiner als eine vorgegebene Zahl ist (daraus folgen dann logischerweise die Nullen am Anfang – aber es geht nicht direkt um Nullen).
Ja, zumindest am Anfang. Deswegen gibt es auch öfters mal leere Blöcke die direkt nach einem vorherigen Block gefunden wurden. Der Miner fängt sobald er den neuen Block kennt sofort an weiter zu hashen, bevor er die Merkle Root der Transaktionen überhaupt berechnet hat.
Damit verzichtet er aber auch auf die Transaktionsgebühren weshalb es keinen Anreiz dafür gibt.
Das liegt aber daran dass nicht genug Transaktionen im Mempool sind.
Erst mal vielen Dank für die Ausführliche Erklärung
Bedeutet „leere Blöcke“ das in den Blöcken keine Transaktionen sind, wenn ein gültiger Hash gefunden wird bevor die Merkle Root berechnet wurde? Bekommt der Miner dann trotzdem den reward von aktuell 6,25BTC?
Genau, exklusive der Coinbase Transaktion. Die muss in jedem Block stehen.
Ein Miner kann, wenn er will, die Transaktionen einfach komplett weg lassen. Niemand kann ihn daran hindern. Den Block Reward von 6.25 BTC erhält er trotzdem, er hat schließlich einen gültigen Block gefunden und damit das Netzwerk gesichert.
Wie gesagt: Der Anreiz der Transaktionsgebühren steuert dagegen.
Ach krass, und aus dieser einen Coinbase Transaktion ergibt sich dann die Merkle Root. Das bedeutet ja das die Miner nicht nur in ständiger Konkurrenz stehen einen gültigen Hash zu berechnen, sondern auch das Timing eine Rolle spielt. Um so mehr Transaktionen man aufnimmt um so mehr Gebühren würde man kassieren aber um so mehr Zeit geht verloren bis man die Merkle Root berechnet hat um danach einen gültigen Hash zu finden. Einfaches Besispiel: Miner A und Miner B fangen zeitgleich an. Miner A schreibt 10 Transaktionen in den Block und berechnet dann die Merkle Root. Dafür braucht er insgesamt 1 Minute. Danach braucht er 70 Sekunden um einen gültigen Block zu finden. Miner B schreibt 20 Transaktionen in den Block und berechnet dann die Merkle Root. Dafür braucht er insgesamt 2 Minuten. Er hat gerade mal 10 Sekunden gehashed, da hat Miner A einen Gültigen Block gefunden.
Miner B hat also viel weniger Zeit gehabt. Natürlich hätte Miner B einen gültigen Block auch nach 5 Sekunden finden können aber die Wahrscheinlichkeit ist geringer. Ist sehr vereinfacht dargestellt, aber habe ich das so in etwa richtig verstanden?
Sicher hat man einen Timing Vorteil, wenn man die Merkle Root bzw. den Merkle Tree nicht sehr oft (komplett) neu berechnen muss. Es lohnt sich beim Mining also, wenn man Block-Parameter variiert, bei denen das nicht der Fall ist.
Allerdings ist der Zeitvorteil lange nicht so groß wie du ihn darstellst. Ich habe leider keinen genauen Zahlen, aber eine CPU kann schon mehr als 10⁶ Hashes pro Sekunde berechnen; ein ASIC mehr als 10¹⁴.
Ich weiß zwar nicht, ob die Merkle Roots auf dem ASIC berechnet werden. Aber unabhängig davon wird die Berechnung nur den Bruchteil einer Sekunde benötigen.
Ich würde das wie @skyrmion schreibt auch nicht überbewerten. Das sind kleinere Optimierungen über die wir hier reden, die zufällig eben zu einem dieser leeren Blöcke führen können.
Es geht einfach darum seine Hardware nicht ungenutzt rum stehen zu lassen und jede einzelne Nanosekunde ausnutzen. Alles andere wäre schließlich verschenktes Potential.
Wir reden hier übrigens über Zeiträume weit innerhalb einer Sekunde
Um das etwas zu verdeutlichen:
Sobald der eigene Miner 4 GH/s überschreitet muss die Merkle Root zwangsläufig mehrmals pro Sekunde verändert werden! Ein einziger S19 kann 110 000 GH/s.
Also ganz grob überschlagen muss ein S19 über 20 000 mal die Merkle Root neu ausrechnen um genug Noncen zu haben, innerhalb jeder Sekunde!(Natürlich nur den Pfad der Coinbase TX)
Bei jeder Transaktion die neu im Mempool landet und auch nur wenige Satoshi mehr abwirft, wird der Block sofort dementsprechend angepasst. Das kommt dann noch dazu!
Würde mich echt mal interessieren wie Mining Software hier konkret vorgeht.
Muss ja, oder? Merkle Tree ist hier ja auch nur SHA-256.
Ich muss ehrlich sagen, dass ich keine Ahnung habe welche Arbeit der ASIC genau übernimmt.
Aber du hast wahrscheinlich Recht. Angenommen der ASIC würde bei vorgegebener Transaktionsmenge nicht alle Blockvariationen komplett selbständig durchführen, würde man nicht > 100 TH/s schaffen.
In den 10 Femtosekunden pro Hash würde ein elektrisches Signal nur einige Mikrometer weit kommen. Es würde deshalb z.B. nicht funktionieren, dass der ASIC immer nur den Hash eines einzelnen vorgegebenen Blockkandidaten berechnet.
Ich hätte mir aber beispielsweise vorstellen können, dass der ASIC immer komplette Blöcke bis auf die Nonce vorgegeben bekommt und nur die 32 Bit Nonce hochzählt. Andere Variationen müssten dann von der ansteuernden CPU durchgeführt werden.
Vielen Dank für eure aufschlussreichen Antworten.
Es ist wirklich faszinierend. Mich hat in meinem Leben noch nie ein Thema so krass interessiert und gefesselt wie Bitcoin und alles was damit zusammenhängt. Ich finde es toll, dass es so viele Menschen gibt bei denen das so ähnlich ist, und das diese so hilfsbereit sind. Daumen hoch!