Wo wird das Schwierigkeitsziel eingefügt?

Alle Miner müssen sich jederzeit über das „ Schwierigkeitsziel “ einig sein, um die korrekte Nonce (als Antwort des Proof-of-Work) erreichen zu können.

Angenommen, das Ziel wurde aktualisiert (das bedeutet, dass 2016-Blöcke entdeckt wurden), stellt sich die Frage, „ wer “ dieses neue Ziel so berechnet, dass jeder Miner dasselbe Ziel erreicht, das benötigt wird, um den Proof-of-Work des nächsten zu lösen Block?

Stimmt es, dass es einem Angreifer nicht möglich ist, den Zielwert zu manipulieren, um die anderen Miner so auszutricksen, dass sie eine falsche Nonce für den Proof-of-Work erreichen?

Mit anderen Worten, wie kann jeder Miner wissen, dass der Zielwert geändert wurde ?

--> Liegt es am Blockheader des letzten Blocks in der Blockchain?

Wenn ja, ist dieser Ansatz dafür verantwortlich, ein eindeutiges Ziel zu erreichen?

Angenommen, 2016-Blöcke wurden entdeckt und das Ziel muss mithilfe der folgenden Gleichung aktualisiert werden:

Zeit = (Schwierigkeit x 2^32) / Hashleistung des Netzwerks

Ist es richtig? Es ist mir unklar, wie ich den Wert für die Hashing-Power des Netzwerks bestimmen kann .

PS Angenommen, ein Gegner löst den Proof-of-Work und generiert dann einen neuen Block, fälscht jedoch den Zeitstempel des Blocks, um das Netzwerk zum Zeitpunkt der Zielaktualisierung auszutricksen. Da das Ziel mit dem Zeitstempel der Blöcke aktualisiert wird.

Ich glaube, du bist etwas verwirrt. Niemand muss die aktuelle Hashing-Power des Netzwerks kennen, um das Ziel zu berechnen. Sie kann anhand der durchschnittlichen Blockzeit während der letzten 2016 Blöcke bestimmt werden. Die Gleichung, die Sie auflisten, berechnet nicht die Schwierigkeit, sondern die geschätzte Zeit, bis ein Block entdeckt wird. Alles, was benötigt wird, um ein neues Ziel zu berechnen, sind die vergangenen 2016-Blöcke.
Kurze Antwort: Die Hashing-Power des Netzwerks lässt sich anhand der Zeitstempel in den Block-Headern abschätzen. Da alle denselben Algorithmus auf dieselben Blockheader anwenden, erhalten alle dasselbe Ergebnis. Es ist natürlich nur eine Schätzung der Hashing-Power des Netzwerks.

Antworten (4)

Unter der Annahme, dass der Miner eine aktuelle Version der Blockchain ist, kann er die Schwierigkeit aus den Daten über die vorherigen Blöcke berechnen. Eine Erklärung, wie die Schwierigkeit berechnet wird, finden Sie in dieser anderen Antwort .

Bei einer bestimmten Kette ergibt die Berechnung der Schwierigkeit nämlich immer das gleiche Ergebnis. Jeder Miner kann diese neue Schwierigkeit selbst berechnen und das Ergebnis wird dasselbe sein, da die Berechnung auf dem Blockslot 2016 basiert. Es ist nicht erforderlich, die Hashrate des Netzwerks zu kennen, es reicht aus, zu wissen, wie viel Zeit benötigt wurde, um die 2016-Blöcke zu generieren, indem man sich ihre Zeitstempel ansieht.

Zusätzlich codieren Block-Header auch den Zielschwellenwert durch das nBits-Feld . Der Grund ist in dieser Antwort zu finden .

PS: Damit ein Block als gültig betrachtet wird, muss auch sein Zeitstempel gültig sein, d.h. er muss sein:

größer als der mittlere Zeitstempel der vorherigen 11 Blöcke und kleiner als die netzwerkbereinigte Zeit + 2 Stunden.

Die Auswirkungen des "Angriffs" sind also sehr eingeschränkt.

Da die Schwierigkeitsberechnung deterministisch ist, kann jeder die Schwierigkeit selbstständig berechnen. Da sie sich über die Blockchain geeinigt haben (welche Blöcke in welcher Reihenfolge), sollten sie alle den gleichen Wert berechnen. Auf diese Weise verlässt sich das Protokoll niemals darauf, jemandem zu vertrauen, was die richtige Schwierigkeit ist.

Denken Sie auch daran, dass es nicht nur Miner sind, die dazu verleitet werden müssten, einen Block mit unzureichender Arbeit zu akzeptieren. Vollständige Knoten überprüfen auch Blöcke, wenn sie sie erhalten, und weisen Blöcke zurück, die keine Nonces haben, die ihre eigenen berechneten Schwierigkeitsanforderungen erfüllen. Da Full Nodes eine wichtige Rolle bei der Weiterleitung von Blöcken spielen, sollte dies nicht übersehen werden.

Wenn Sie sich ansehen möchten, wie die Schwierigkeitsberechnung durchgeführt wird, finden Sie sie im Code unter: https://github.com/bitcoin/bitcoin/blob/master/src/pow.cpp

Um die Bemerkung in der PS zu adressieren, dh

P.S. Assume also an adversary solves the proof-of-work and then generates a new block but forges the block's times-stamp to trick the network at the time of updating target. Since the target will be updated using the blocks' time-stamp.

Das ist tatsächlich möglich, man nennt es „ Timejacking “ oder die Zeitreisenden-Attacke, mehr darüber erfährst du hier:

http://culubas.blogspot.de/2011/05/timejacking-bitcoin_802.html

oder hier:

Bitcoins aus der Zukunft

Es geschieht durch Konsens. Sie können nachlesen, wie es berechnet wird, und sich auch den Quellcode ansehen. Die Antwort finden Sie im Developer's Guide: https://bitcoin.org/en/developer-guide#proof-of-work

Ich glaube, der eigentliche Code befindet sich in bitcoin/src/chain.h

Auszug:

Neue Blöcke werden nur dann zur Blockchain hinzugefügt, wenn ihr Hash mindestens so anspruchsvoll ist wie ein vom Konsensprotokoll erwarteter Schwierigkeitswert. Alle 2.016 Blöcke verwendet das Netzwerk Zeitstempel, die in jedem Block-Header gespeichert sind, um die Anzahl der Sekunden zu berechnen, die zwischen der Erzeugung des ersten und letzten dieser letzten 2.016 Blöcke vergangen sind. Der Idealwert liegt bei 1.209.600 Sekunden (zwei Wochen).

Ich glaube nicht, dass Sie die richtige Quelldatei haben, zumindest nicht für die Berechnung des Schwierigkeitsziels. Die Berechnung der mittleren Blockzeit finden Sie in chain.h, falls Sie das meinen. Wenn ja, sollten Sie das klären.