Hash-Berechnung für Anfänger erklärt + Frage HashRate Validierung

Hallo,

im Video „World Economic Forum WEF widerlegt! BITCOIN und die Energiewende!“ ab 45:00 (https://youtu.be/WctSkKmsc9c?t=2700) antwortet Roman auf die Frage:

„Wie kann es aber sein das man ein Verfahren entwickelt das man selbst nicht zurückrechnen kann?“

Seine Erklärung mit 3+5+7=15 geht zwar in die richtige Richtung, aber 15 lässt sich ja auch mit vielen anderen Ausgangs-Zahlen ermitteln, und das ohne großen Aufwand.

Für Einsteiger vergleiche ich die Hash-Ermittlung gerne mit dem math. Wurzelziehen.

Hash entspricht dem Quadrat der gesuchten Zahl. Also wäre z.B. die Aufgabe, finde die Wurzel aus 137. (Vergleich: finde den Ausgangs-Wert für den Hash 137)
Da man die Wurzel aus 137 nur mit einem Näherungs-Verfahren ermitteln kann, dauert es viel länger den Ausgangswert zu finden, als die eigentliche Validierung, dass 11,71 eine Lösung wäre.

Die Difficulty gibt dabei an, auf wie viele Stellen genau das Ergebnis stimmen muss.
Difficulty 1 → alle Ergebnisse im Format 137,0x sind gültig: 11,7047 bis 11,70897
Difficulty 3 → alle Ergebnisse im Format 137,000x sind gültig: 11,7047 bis 11,70474

Oder die Difficulty könnte auch bestimmen, aus wie viele Ziffern das Quadrat besteht.
(und es reicht dann evtl. die Vorkommastellen richtig zu haben)

Man könnte die Berechnung auch spielerisch im Unterricht behandeln:

Jeder Schüler ist ein Miner, und die gesamte Klasse ist ein Mining-Pool.
Der Lehrer schreibt den Hash (Quadratzahl) an die Tafel und die Kinder legen los.
Ähnlich wie beim Mining-Pool könnte der Lehrer auch vorgeben, dass die Kinder in bestimmte „Bereiche“ aufgeteilt werden.
Am einfachsten z.B. dass die Hälfte der Klasse immer mit einer Zahl beginnt, dessen letzte Ziffer gerade ist, und die andere Hälfte mit einer ungerade Ziffer startet.
So wird vermieden, dass bei Hash 137 alle mit 11,9 starten.
Bei Hash 137 werden die Schüler vermutlich mit 11,9 11,8 11,7 und 11,6 starten.

Das Kind, welches zuerst eine gültige Zahl findet erhält eine Packung Nüsse.
Da aber alle Kind in einem Mining-Pool sind, werden die Nüsse aufgeteilt.
Pro Berechnung die ein Kind gemacht hat, erhält es eine Nuss.
Es kann sein, dass das Kind, welches die Zahl gefunden hat, lediglich 3 Berechnung benötigte, da es die Zahlen gut geraten hat.
Ein Kind, welches sehr schnell rechnen kann, hat aber 5 Berechungen geschafft, und erhält dafür 5 Nüsse.

Problem:

Das trickreiche Kind hat 6 Berechungen gemacht:
11x11=121
11,1x11,1=123,21
11,11x11,11=1234321
11,111x11,111=123,454321
11,1111x11,1111=123,45654321
11,11111x11,11111=123,4567654321

Sollte es dafür wirklich 6 Nüsse erhalten?

Darüber habe ich heute Nacht nachgedacht, statt zu schlafen.

Mögliche Lösung in der Klasse:
Jedes Kind ruft nach jeder Berechnung seinen Zwischenstand - also: 11,8 11,75 usw.
Der Lehrer schreibt diese auf, und sobald die Lösung gefunden wurde, werden die Nüsse anteilig verteilt, je nach dem, wie prozentual dicht die einzelnen Schüler an der Lösung waren.

Frage 1:
Wie wird im Mining-Pool die Hashrate der einzelnen Teilnehmer validiert?
SHA265 ist ja komplett zufällig, d.h. es man kann sich ja nicht langsam annähern.
Und es können ja auch nicht alle gemachten Berechnungen innerhalb eines Pools validiert werden, weil dies ja die Gesamtrechenleistung massiv reduzieren würde!?
Und wenn alle Miner ein Protokoll von Ausgangswert und Hashwert übermitteln, dann könnten diese ja auch einfach große Lookup-Tabellen erstellen.
Und der Poolbetreiber kann ja auch nicht alle zig Milliarden/Trilliarden Berechnungen speichern und prüfen.
Wie wird sichergestellt, dass die Berechnungen wirklich hilfreich sind?

Frage 2:
Wie wird verhindert, dass ein Miner seine Berechnungen parallel in verschiedene Pools broadcastet?
In meiner Annahme könnte ein großer Miner ja einen Pseudo-Miner als Proxy benutzen, um dort seine gespiegelten Berechungen in einen zweiten Pool zu geben.
→ dadurch würde er zusätzliche Rewards kassieren

3 „Gefällt mir“

Willkommen im Forum!

Das sind viele gute Überlegungen! :slight_smile:

Über sogenannte „Shares“, siehe z.B. hier: Mining: Blocks vs. Shares

Richtig, deshalb wird die Validierung eben nur für die Shares gemacht, deren Anzahl wesentlich geringer als die Anzahl aller Hash-Berechnungen ist, die aber ein gutes Maß für die Gesamtanzahl ist.

Erstens werden die zu hashenden Block-Kandidaten heutzutage noch meistens vom Pool vorgegeben. Ändern wird sich das (falls gewünscht) erst mit Stratum V2, siehe z.B. hier: Stratum V2: Wie Bitcoin-Mining effizienter und unabhängiger wird!

Zweitens enthält jeder Block, den du hashst, eine Coinbase-Transaktion. Also die Transaktion, über welche die Rewards an den Miner ausgezahlt werden. Die Rewards erhält man strenggenommen nicht für das Bekanntgeben eines neuen gültigen Blocks, sondern durch die enthaltene Coinbase-Transaktion.

Wenn du für einen Pool minest, muss die Coinbase-Transaktion eines Blocks also an eine Adresse dieses Pools gehen. Solltest du solch einen Block gleichzeitig auch an andere Pools übermitteln, werden sie dir etwas pfeifen. Schließlich ist in dem Block nicht deren Adresse eingetragen. Würde ein anderer Pool also am Ende solch einen Block broadcasten, würde er keinerlei Rewards erhalten.

Kann man schon machen. Allerdings kommt dabei ein wesentlicher Aspekt nicht zum Ausdruck.

Beim Wurzelziehen kannst du dich nämlich iterativ schnell und stetig der Lösung nähern, was du ja schon selbst angemerkt hast. Beim Hashen eben nicht.

Ein übliches, besseres Verhleichsbeispiel, ist das Faktorisieren einer großen Zahl.

Du kannst sicher schnell bestätigen, dass 67 * 83 = 5561 ist.

Du brauchst aber andersherum wesentlich länger, bei Vorgabe der Zahl 5561 die beiden Primfaktoren zu ermitteln.

Auch hierfür gibt es zwar Algorithmen. Diese sind bei ausreichend großen Zahlen aber zu langsam, um sie praktisch anwenden zu können.

2 „Gefällt mir“

Danke für die schnelle und ausführliche Antwort!
Da habe ich einiges zum Lesen.

Bei Frage 2 war meine Annahme nicht, dass der Miner den Block in beiden Pools hasht, sondern dass der Miner seine Berechungen in mehrere Pools gleichzeitig spiegelt und dann ja anteilig Reward kassiert, auch wenn er den Block selber nicht hasht.
Aber wenn die Block-Kandidaten vorgegeben werden, dann ist dies ja nicht möglich. Außer es gäbe Überschneidungen.

Es hängt nicht direkt damit zusammen, dass die Block Templates vorgegeben werden. Auch Solo bzw. wenn du dir das Template selbst zusammen baust, kannst du nicht an mehreren Templates gleichzeitig arbeiten, ohne dabei auch die Arbeit bzw. Hashrate selbst aufzuteilen.

Jeder berechnete Hash bildet schließlich eindeutig ein Template ab – mit einer eindeutigen Auszahlungsadresse in der Coinbase-Transaktion. Du legst also immer vor der Berechnung eines Hashwertes fest, an wen die potenzielle Belohnung gehen würde.

Was du mit „Überschneidungen“ meinst, ist mir deshalb nicht ganz klar. Hashfunktionen wie SHA-256 haben eine starke Diffusionseigenschaft, d.h. ähnliche Eingaben führen zu komplett unterschiedlichen Ausgaben (die du außerdem nicht vorhersehen kannst).

Es bringt dir also nichts, wenn ein Template von Mining-Pool A nahezu identisch mit dem von Mining-Pool B ist. Solange sich nur ein einzelnes Bit unterscheidet, was alleine durch den von @skyrmion erwähnten Output in der Coinbase-Transaktion zwingend ist, sind es zwei unabhängige Berechnungen. Genau das gilt natürlich auch für die Shares! Ein Share über Template A, den du an Mining-Pool B schickst, wäre schlichtweg ungültig. :)

2 „Gefällt mir“