Wann kann BLOCKHASH sicher für eine Zufallszahl verwendet werden? Wann wäre es unsicher?

Ich habe kompliziertere Möglichkeiten für einen Vertrag gesehen, um eine Zufallszahl zu generieren. Aber das Ethereum Yellow Paper selbst schlägt eine „triviale Lösung“ unter Verwendung des BLOCKHASH-Opcodes vor (siehe unten, fett ist von mir).

Wenn ein Vertrag nur ein paar Zufallszahlen (nicht Hunderte) benötigt, wie sicher wäre diese Methode? Welche beispielhaften Anwendungsfälle wären mit dieser Methode zufriedenstellend? Welche Anwendungsfälle sind praktisch angreifbar, wenn diese Methode verwendet wurde?

Zufällige Zahlen. Die Bereitstellung von Zufallszahlen innerhalb eines deterministischen Systems ist natürlich eine unmögliche Aufgabe. Wir können jedoch mit Pseudozufallszahlen approximieren, indem wir Daten verwenden, die zum Zeitpunkt der Transaktion im Allgemeinen nicht bekannt sind. Solche Daten können den Hash des Blocks, den Zeitstempel des Blocks und die Empfängeradresse des Blocks umfassen. Um es böswilligen Minern schwer zu machen, diese Werte zu kontrollieren, sollte man die BLOCKHASH-Operation verwenden, um Hashes der vorherigen 256 Blöcke als Pseudozufallszahlen zu verwenden. Für eine Reihe solcher Zahlen wäre eine triviale Lösung, einen konstanten Betrag zu addieren und das Ergebnis zu hashen.

Ich habe eine Idee, die auf der gleichen Logik basiert, aber etwas sicherer ist. ethereum.stackexchange.com/questions/34988/… könnten Sie Ihre Meinung hinzufügen?

Antworten (1)

Nur zur Verdeutlichung: Bei der genannten "trivialen Lösung" geht es darum, wie eine Reihe von Zufallszahlen aus einem einzigen zufälligen Startwert erzeugt wird.

Als allgemeine Regel kann BLOCKHASH nur sicher für eine Zufallszahl verwendet werden, wenn der Gesamtwert, der auf der Qualität dieser Zufälligkeit beruht, niedriger ist als das, was ein Miner durch das Mining eines einzelnen Blocks verdient.

Um zu sehen, warum dies der Fall ist, können wir uns die umgekehrte Situation vorstellen, in der ein Wert von vielleicht Millionen auf der Zufälligkeit beruht, die aus einer BLOCKHASH-Operation gewonnen wird (z. B. um einen Lotteriegewinner auszuwählen, der diesen Betrag gewinnt). Aufgrund des großen Geldbetrags, der auf dem Spiel steht, hätte ein kapitalkräftiger Angreifer einen finanziellen Anreiz, ein Ticket zu kaufen und dann viele verschiedene alternative Blöcke zu generieren (möglicherweise unter Verwendung von Millionen von AWS - Instanzen für einen kurzen Zeitraum, aber zu erheblichen Kosten) . die Blockhöhe, ab der die Zeichnung berechnet werden soll. Wenn ein Block mit einem Hash gefunden wird, der zum Gewinn des Miner-Tickets führt, schürft der Miner sofort weitere Blöcke über diesem (um sicherzustellen, dass er erfolgreich ist) und sendet ihn dann an das Netzwerk.damit sie sich den Preis garantieren können . Diese Operation kann sehr teuer sein, aber solange der Preis groß genug ist, wird es immer noch ein profitabler Angriff sein.

Dies ist ein extremes Beispiel, aber die langweilige Version dieses Angriffs, bei der ein Miner zufällig diesen einen Block abbaut, prüft, ob er gewinnt, und dann die Antwort wegwirft, wenn er es nicht tut, könnte seine Gesamtzahl immer noch verdoppeln Gewinnchancen und ist immer noch eine "unfaire" statistische Manipulation, wenn auch eine schwache. Wenn das Wegwerfen des Blocks jedoch mehr kostet, als irgendjemand hoffen kann, zu gewinnen, ist es höchst unwahrscheinlich, dass jemand den Angriff durchführt , daher unsere allgemeine Regel.

Es ist wichtig zu beachten, dass einige Leute versuchen, eine Kombination von Zufallsquellen zu verwenden. NUR DER LETZTE ZÄHLT. Welche Zufälligkeit, sei es Blockhash oder Zeitstempel, zuletzt hinzugefügt wird, kann die gesamte Zufälligkeit des Systems brechen.
Kommentar zu Jeffs Antwort. Jeder gültige Block, den der Miner wegwirft, kostet ihn 5 eth. Wenn er 1 000 000 gültige Blöcke wegwerfen muss, kostet ihn das 5 000 000 eth. Wenn der Preis 1 000 000 beträgt, macht es keinen Sinn, 5 000 000 wegzuwerfen. Wenn der Preis 10 000 000 beträgt, dann macht es Sinn.
Dies ist genau die gleiche Regel, die wiederholt angewendet wird. Wenn jeder abgebaute Block eine „Chance“ oder einen „Schritt“ bietet und der Miner diesen „Zufall“ oder „Schritt“ auf mehr als 5 BTC schätzt, dann kann die BLOCKHASH-Operation nicht für die Anwendung (oder jede andere Anwendung, bei der > 5 ETH Chancen oder Schritte könnten Teil einer erfolgreichen Manipulationsstrategie sein). Wenn es durchschnittlich oder insgesamt 1.000.000 Blöcke braucht, um eine Belohnung von 10.000.000 zu erhalten, dann ruhen auf jedem Block mindestens 10 ETH an Wert.
Reduziert der Proof of Stake die Kosten für das Wegwerfen eines Blocks für einen Miner/Staker nicht drastisch? (im Grunde zu den Kosten der Gebühren + geringfügiger Bruchteil der Zinseszinsen für das spätere Staken)
Wie ändert sich diese Antwort angesichts der Umstellung von Ethereum von PoW auf PoS?
@TjadenHess, wenn ich also uint(keccak256(abi.encodePacked(now, block.coinbase, seed))) % 99 mache; also nur letzter Parameter, "Seed" nur zum Generieren von Zufallszahlen? Vielen Dank :)
Das letzte chronologisch, meine ich. Sie können sich das abi.encodePacked(...)als eine einzelne Eingabe für Ihr RNG vorstellen. Die Sicherheit wird dann durch die Anzahl der Bits bestimmt, die ein Angreifer in diesem Wert beeinflussen kann. In diesem Fall werden es einige Bits sein, daher ist dieses Schema sehr unsicher
Ich bin auch gespannt, wie PoS dazu beiträgt, mit dem Potenzial, einen Miner zu bestrafen. @TjadenHess, also wird der Zeitstempel des Blocks vom Miner zugewiesen, sodass er leicht zu manipulieren ist? Was ist mit block.difficulty, wird das dem Miner gegeben? Ist das Manipulieren des Zeitstempels in der Blockchain nicht auch nicht erlaubt und könnte herausgefunden werden und der Miner könnte bestraft werden?