Kann ein Miner meinen Lotterie Smart Contract „betrügen“?

Ich habe einen intelligenten Vertrag entwickelt, mit dem Sie:

1) Senden Sie 1 Ether an eine Adresse, der Vertrag speichert Ihre Adresse

2) Nachdem 5 Personen einen Ether gesendet haben, wählt der Vertrag zufällig eine Adresse aus und sendet die 5 Ether an diese Adresse

Ich lese hier: Wie ist das Reihenfolge- und Gleichzeitigkeitsverhalten mehrerer Aufrufe eines Vertrags in einer einzigen Transaktion?

dass der Miner die Reihenfolge der Transaktionen bestimmt.

Wenn mehr als 5 Transaktionen innerhalb desselben Blocks an den Vertrag gesendet werden, kann der Miner das System so spielen, dass er seine eigene Transaktion eingibt und den Smart Contract für die Bestellung ausführt, die er jedes Mal gewinnen möchte?

Die Gewinneradresse wird mit ausgewählt

        random = uint(block.blockhash(block.number-1))%5 + 1;

Ich weiß, dass ein Miner 5 Ether pro abgebautem Block + Gebühren erhält, deshalb habe ich die Eingaben auf insgesamt 5 Ether begrenzt. Die Zufallsfunktion ist nicht so zufällig, aber die niedrige Auszahlung (dachte ich) sollte Miner dazu bringen, sich nicht darum zu kümmern, sie zu spielen. Hier ist der Code der Funktion:

function () payable {
    require(msg.value == 1 ether);

    my_length +=1;

    gamblers[my_length] = msg.sender;

    if (my_length == 5) {
        // pick a random number between 1 and 5
        random = uint(block.blockhash(block.number-1))%5 + 1;
        gamblers[random].transfer(5 ether);
        my_length = 0;
    }

Vielen Dank

Antworten (2)

ja, sie können

Sind Zeitstempel (jetzt block.timestamp) zuverlässig?

Das hängt davon ab, was Sie unter „zuverlässig“ verstehen. Sie werden in der Regel von Minern versorgt und sind daher angreifbar.

(...)

Verwenden Sie now oder block.hash niemals als Zufallsquelle, es sei denn, Sie wissen, was Sie tun!

Dok

Es gibt einen zuverlässigeren Weg, um Zufälligkeit mit einem Orakel zu erhalten. Aber anstatt Minern zu vertrauen, müssen Sie dem Oracle und der Datenquelle (wie random.org) vertrauen. Hier finden Sie weitere technische Möglichkeiten, dies zu erreichen.

Technisch gesehen könnten einige Spieler dieses System zusätzlich zu den Minern spielen. Da Sie den vorherigen Block-Hash verwenden, kann ein Miner einfach warten, um eine Transaktion in Ihre Lotterie aufzunehmen, bis der vorherige Block einen günstigen Hash hat. Benutzer können auch versuchen, ihre Transaktion in den nächsten Block zu bekommen, wenn der neue Kettenkopf einen günstigen Zeitstempel enthält.

Wenn beide Benutzerklassen versuchen, das System zu spielen, kann der Miner gewinnen, indem er seine Transaktion zuerst in den Block einbezieht.

Beachten Sie, dass dies wahrscheinlich ein wenig benutzerdefinierte Infrastruktur auf ihrer Seite erfordern würde und wahrscheinlich nicht sehr wahrscheinlich ist ... aber die Spieler, die das System spielen können, sind ein dringenderes Problem.