?
Hallo,
eine Blockchain besteht aus einzelnen verlinkten Blöcken. Jeder einzelne Block sieht in etwa so aus:
Struct Block
{
- Zeitstempel
- Index
- Daten
- Proof of Work
- Hash des Vorgängerblocks
}
Da der Hash des Vorgängerblocks mit eingeht schützt der jeweils aktuelle Block den Vorgängerblock, der wieder seinen Vorgängerblock schützt usw.
Der "Trick" ist nun, dass für den Block ein Hashwert bestimmt werden muss, der bestimmte Regeln erfüllt. Damit diese Regel erfüllbar ist, ist der "Proof of Work" eine frei bestimmbare Zahl. Wie schon in vorherigen Posts angemerkt wurde, ist die Hashoperation nicht einfach umkehrbar. Die Vorgehensweise ist also, viele verschiedene Werte für "Proof of Work" auszuprobieren, wobei für jeden Versuch der Hashwert über den gesamten Block zu berechnen ist.
Beispiel:
Sagen wir mal die Regel würde besagen, es muss ein Hashwert < 1000 gefunden werden. Dann setzen wir als Proof of Work z.B 1 ein. Jetzt kommt als Hashwert blöderweise z.B. 345634 raus. Also setzen wir als Proof of Work nun 2 ein und berechnen wieder den Hashwert über den Block. Jetzt kommt z.B. 545234 raus. Dies wiederholt man mit neuen Poof of Work Werten, bis der Hash einen Wert < 1000 ergibt. Dies ist dann die Lösung.
Hierfür können Milliarden (oder mehr) von Versuchen nötig sein. Wenn aber ein "Proof of Work" gefunden wurde der einen Hashwert < 1000 erzeugt ist die Überprüfung einfach. Setzte den gefunden Proof of Work ein und berechne den einen Hashwert. Ist dieser < 1000 ist es eine gültige Lösung.
Findet man einen gültigen Proof of Work Wert, wird dieser bekannt gegeben. Einige andere Berechnen diesen einen Hashwert nach. Stellen fest, dass er korrekt ist (oder eben nicht), akzeptieren den neuen Block (oder eben nicht). Wurde der neue Block akzeptiert wird mit dem nächsten Block begonnen.
Beim Mining von Ethereum setzt also der Computer stupide immer neue Zahlen für den "Proof of Work" ein berechnet den Hashwert und bestimmt ob das Ergebnis mit der Regel übereinstimmt. Da dies für jeden Versuch unabhängig von jedem anderen Versuch ist lässt sich das schön parallelisieren. Daher werden ja auch Grafikkarten (GPUs) verwendet.
In der Realität ist es etwas komplizierter. So weit ich weiß muss das Ergebnis (Hashwert) in einem Bereich liegen [x,y]. Damit wird die "Schwierigkeit" des Mining angepasst. Um so mehr sich beteiligen, desto kleiner wird dieser Bereich in dem die Hashwerte akzeptiert werden.
Aber was ist nun beim Pool Mining? Hier werden die zu überprüfenden "Proof of Work" an die Mitglieder des "Mining Pools" verteilt. Aber warum reicht dann der "Finder" nicht den gefundenen "Proof of Work" wert für sich alleine ein?
Weil der Algorithmus abgewandelt wird. Vom Mining Pool werden nicht nur Hash Ergebnisse im Bereich [x,y] akzeptiert, sondern alle im Bereich [0,y]. Der Bereich wird also vergrößert. Ein "Proof of Work" der ein Hash in diesem weiteren Bereich generiert ist ein "Share". (Daher sieht man auch diese "Share" Accepted Nachrichten. Man bekommt also schon anteilig Belohnung ab, wenn man ein Ergebnis in diesem erweiterten Bereich findet. Der Mining Pool selbst berechnet dann von all den eintreffenden "Shares" ob diese auch die Wirkliche Regel mit Hashwerten im Bereich [x,y] erfüllen. Wenn dies so ist, wird der neue Block akzeptiert und die Belohnung an alle die mit "Shares" dazu beigetragen haben verteilt.
Ein "Stale Share" ist dann einfach ein Share, der von einem Miner eingereicht wird, obwohl für den aktuellen Block schon ein Share mit einem Hashwert im Bereich [x,y] gefunden wurde. Der also "zu spät" eingereichte "Stale" Share wird abgelehnt (da nicht mehr nötig).
Um zur eigentlichen Frage zurückzukommen. Wenn ein Miner falsche "Prof of Work" Werte (Shares) einreicht, muss jeweils nur ein Hashwert nachgerechnet werden. Dieser besagt dann, dass die Lösung falsch war. Daher ist das Nachrechnen von Ergebnissen um Größenordnungen "einfacher" als eine Lösung zu finden.