Was wann festgelegt wird
Ein Mines-Spiel beginnt mit einer einzigen On-Chain-Transaktion (mines_start), die drei Dinge gleichzeitig erledigt – bevor du irgendein Feld wählst:
- Sie legt den Beitrag des Betreibers per Commit fest. Das Backend erzeugt einen zufälligen 32-Byte-
server_seed, und die Transaktion speichert dessen SHA-256-Hash – den Commit. Der Seed selbst bleibt bis zum Spielende verborgen. - Sie erfasst Entropie aus der Chain. Das Programm liest den neuesten Slot-Hash aus Solanas
SlotHashes-Sysvar und speichert ihn im Spiel. - Sie friert die Konditionen ein. Hausvorteil, Auszahlungsobergrenze und Rückerstattungs-Timeout werden als Snapshot in deinem Spiel gespeichert; nichts kann ein Spielfeld neu bepreisen, auf dem du bereits spielst.
Wie wird das Mines-Spielfeld abgeleitet?
Die 25 Felder sind von 0 bis 24 durchnummeriert, Zeile für Zeile im 5×5-Raster (index = row × 5 + column). Das Spielfeld ist eine 25-Bit-Maske: Ist Bit t gesetzt, verbirgt Feld t eine Mine.
- Die Reihenfolge der Hash-Eingaben ist exakt: Seed, Slot-Hash, Adresse des Nutzerkontos, Nonce (8 Bytes Little-Endian), der ASCII-Tag
"mines", dann der Blockzähler (8 Bytes Little-Endian, beginnend bei 0). - Jeder 4-Byte-Abschnitt wird Big-Endian gelesen. Ein Block liefert höchstens 8 Ziehungen; bei Bedarf wird der Strom mit dem nächsten Zählerwert nachgefüllt.
- Die Rejection-Sampling-Schleife macht jede Ziehung exakt gleichverteilt: Am Shuffle gibt es keine Verzerrung, über die man streiten könnte.
Welche Auszahlungsformel setzt das Programm durch?
Jedes sicher aufgedeckte Feld multipliziert deinen Cashout mit dem exakten Kehrwert deiner Überlebenswahrscheinlichkeit, wobei der Hausvorteil genau einmal angewendet wird:
Die erwartete Rendite beträgt
1 − Hausvorteil für jede Kombination aus Minen und aufgedeckten Feldern. Die aktuellen Werte findest du unter Gebühren und Limits.
Was das Programm bei der Abrechnung durchsetzt
Die Abrechnungstransaktion (mines_settle) deckt den server_seed auf und beansprucht ein Ergebnis: einen Cashout mit einer Menge aufgedeckter Felder oder einen Minentreffer auf einem bestimmten Feld. Das Programm prüft dann alles on-chain:
sha256(server_seed)muss dem bei Spielstart gespeicherten Commit entsprechen; mit einem anderen Seed lässt sich das Spiel nicht abrechnen.- Das Spielfeld wird mit der obigen Formel von Grund auf neu abgeleitet. Ein als aufgedeckt gemeldetes Feld, das tatsächlich eine Mine ist, wird abgelehnt; ein gemeldetes Minenfeld, das keine Mine ist, wird abgelehnt; ein Minenfeld, das zugleich als aufgedeckt gemeldet wurde, wird abgelehnt.
- Der Multiplikator wird on-chain aus dem per Snapshot eingefrorenen Hausvorteil und deiner tatsächlichen Anzahl aufgedeckter Felder berechnet, sodass die Auszahlung nicht falsch gemeldet werden kann.
- Das Abrechnungs-Event veröffentlicht dauerhaft den Seed, den Slot-Hash, die vollständige Minenmaske, deine aufgedeckten Felder und das Ergebnis.
Was garantiert ist – und was nicht
Vom Programm durchgesetzt:- Das Spielfeld steht vor deinem ersten Zug fest – durch den Commit plus den gespeicherten Slot-Hash. Minen können sich mitten im Spiel nicht verschieben.
- Bei der Abrechnung kann der Betreiber über das Spielfeld nicht lügen: Ein falscher Seed, eine als sicher gemeldete Mine oder ein vorgetäuschter Minentreffer lassen die Transaktion scheitern.
- Die Konditionen, mit denen du gestartet bist (Hausvorteil, Auszahlungsobergrenze, Timeout), gelten bis zum Ende des Spiels.
- Dein Einsatz kann niemals gesperrt werden: Rechnet der Betreiber nie ab, kann nach dem Timeout des Spiels jeder den Abbruch auslösen, der dir deinen Einsatz zurückerstattet. Im Normalbetrieb kommt es nie so weit: Ein verlassenes Spielfeld wird vor dem Timeout zum aktuellen Multiplikator ausgecasht (siehe Mines), sodass du deine Gewinne behältst und nicht nur deinen Einsatz. Der für jeden aufrufbare Abbruch ist die darunterliegende Garantie für den Fall, dass der Betreiber nicht mehr da ist.
- Der Betreiber kennt das Spielfeld, während du spielst. Das ist strukturell bedingt und kein Fehler dieses speziellen Designs: Aufgedeckte Felder werden sofort off-chain ausgeliefert, und wer sie ausliefert, muss wissen, wo die Minen liegen. Kein Zufallsverfahren ändert daran etwas: Selbst ein per VRF erzeugtes Spielfeld wäre dem Betreiber in dem Moment bekannt, in dem er dein erstes Feld aufdeckt. Was der Commit garantiert: Dieses Wissen kann weder dazu genutzt werden, das Spielfeld zu verändern, noch das Ergebnis falsch zu melden.
- Zeitpunkt des Starts. Das Spielfeld hängt vom Slot-Hash ab, der beim Start deines Spiels erfasst wird, und die Start-Transaktion wird vom Backend eingereicht – dieselbe Timing-Überlegung wie bei den anderen Spielen. Ein Spielfeld im Voraus zu kennen hilft nur, wenn deine Züge vorhersehbar sind; wenn du variierst, wo du klickst, läuft eine timingbasierte Spielfeldauswahl ins Leere.
- Annullierungen. Der Betreiber kann ein laufendes Spiel abbrechen (grundsätzlich auch eines, das du gerade gewinnst). Ein Abbruch erstattet den vollen Einsatz zurück (einen Einbehalt gibt es nicht) und löst immer ein öffentliches Event aus, sodass jeder die Häufigkeit von Annullierungen on-chain nachprüfen kann.
- Jedes Spiel muss einen frischen Seed verwenden: Ein aufgedeckter Seed ist öffentlich, und seine Wiederverwendung würde das nächste Spielfeld öffentlich ableitbar machen. Das Programm lehnt eine direkt aufeinanderfolgende Wiederverwendung on-chain ab, und das Backend erzwingt globale Eindeutigkeit.
Wie überprüfst du ein Mines-Spiel?
Das Abrechnungs-Event (MinesGameSettled) in der letzten Transaktion deines Spiels enthält server_seed, slothash, user, nonce, mines_count, mines_mask, revealed_mask, bust_tile, multiplier_bps und is_win. So überprüfst du es:
- Prüfe den Commit:
sha256(server_seed)muss demcommit_hashentsprechen, der in der Start-Transaktion deines Spiels veröffentlicht wurde (EventMinesGameStarted) – das beweist, dass das Spielfeld vor deinem ersten Zug festgelegt war. - Leite die Minenmaske mit der obigen Formel neu ab und vergleiche sie mit dem
mines_maskdes Events. - Prüfe das Ergebnis anhand der Maske: Jedes Bit von
revealed_maskmuss ein sicheres Feld sein, und ein Minentreffer muss auf einer Mine liegen. - Prüfe den Multiplikator mit der Auszahlungsformel.