Dokumentation

Der Vertrag: wie und warum er funktioniert

Alle Mittel und alle Regeln von FAIRDRUM liegen in einem einzigen Programm im Solana-Netzwerk — einem Smart Contract. Die Website sendet ihm nur Befehle und zeigt die Antwort an. Im Folgenden: was der Vertrag speichert, welche Befehle er versteht, wie aus der Zufallszahl ein Ergebnis wird und was der Administrator kann und was nicht.

Was der Vertrag ist und wo er liegt

Ein Smart Contract ist ein Programm, das von den Knoten des Solana-Netzwerks ausgeführt wird und nicht auf dem Server des Projekts. Sein Code ist für alle gleich, und jede Aktion ist eine öffentliche Transaktion. Der FAIRDRUM-Vertrag ist in Rust mit der Bibliothek Anchor geschrieben; sein Quellcode ist offen.

Die Programmadresse erscheint hier, sobald die Website mit dem Vertrag verbunden ist.

Eine wichtige Folge: Sollte die Website fairdrum.to verschwinden, bleiben die Mittel der Spieler im Vertrag und lassen sich mit jedem Programm auszahlen, das den Auszahlungsbefehl mit der Signatur Ihrer Wallet senden kann.

Was der Vertrag speichert

  • Der Tresor. Ein einziges Konto in Wrapped SOL, über das nur das Programm selbst verfügt. Darin liegt alles: die Guthaben der Spieler, die Gewinnbank, die Jackpots, die Reserve und der noch nicht entnommene Anteil des Administrators.
  • Das gemeinsame Spielkonto. Ein Eintrag darüber, wie der Betrag im Tresor aufgeteilt ist: Gewinnbank, Jackpot, Mini-Jackpot, Super-Jackpot, Startreserve, Anteil des Administrators, Startbeträge der Jackpots, Rundenzähler je Spiel.
  • Das Spielerkonto. Es wird mit dem Befehl register angelegt, den die Website zusammen mit der ersten Aufladung sendet, und ist an die Wallet-Adresse gebunden: Spielguthaben, Zeitpunkt der letzten Aufladung, nicht abgeschlossene Runde, noch nicht ausgezahlter Teil eines Jackpots.
  • Das Sitzungskonto (wenn „Spiel ohne Signaturen“ eingeschaltet ist): ein temporärer Schlüssel, eine Laufzeit und ein Einsatzlimit.

Die Buchführung ist so aufgebaut, dass die Summe aller Guthaben und Töpfe dem Betrag im Tresor entspricht. Ein Test prüft diese Gleichheit nach jedem von Zehntausenden zufälliger Vorgänge.

Welche Befehle der Vertrag versteht

BefehlWer ihn aufrufen kannWas er tut
registerSpielerLegt das Spielerkonto an. Die Website sendet ihn zusammen mit der ersten Aufladung.
depositSpielerAufladung des Spielguthabens. Merkt sich den Zeitpunkt: Ab ihm laufen die 12 Stunden bis zur Auszahlung.
withdrawSpielerAuszahlung auf die eigene Wallet. Wird abgelehnt, solange seit der letzten Aufladung keine 12 Stunden vergangen sind.
spin_commitder Spieler oder sein SitzungsschlüsselEinsatz: bucht die Runde vom Guthaben ab, merkt sich das Spiel und die geltenden Chancen und fordert beim Orakel eine Zufallszahl an.
spin_settlejederAbrechnung: liest die Zahl des Orakels, berechnet den Gewinn und schreibt ihn dem Spieler gut. Aufrufen kann sie jeder – das Ergebnis hängt davon nicht ab.
spin_expirejederSchließt eine Runde, die nicht innerhalb von 20 Minuten abgerechnet wurde. Hat das Orakel nicht geantwortet, wird der Einsatz dem Spieler vollständig erstattet. Hat das Orakel geantwortet und ist die Runde versiegelt, werden die regulären Gewinne ohne Jackpot-Ziehung ausgezahlt.
spin_sealjederVersiegelt die Runde: hält den Hash des Blocks mit dem Einsatz fest, solange er verfügbar ist (etwa 3,5 Minuten). Sie wird nur gebraucht, wenn das Orakel länger für die Antwort braucht; normalerweise ruft der Wächterdienst sie auf. Eine Runde, die nicht rechtzeitig abgerechnet und nicht versiegelt wurde, wird ohne Ergebnis geschlossen.
skip_nonceSpielerVerschiebt die Nummer der nächsten Zufallsanfrage, falls die Adresse der Anfrage bereits belegt ist.
session_open / session_closeSpielerErlaubt einem temporären Schlüssel, innerhalb von Laufzeit und Limit Einsätze zu tätigen; der Schlüssel kann weder auszahlen noch aufladen.
donatejederZahlt SOL in die Startreserve der Jackpots ein. Einen umgekehrten Befehl gibt es nicht.
set_jackpot_startsAdministratorLegt neue Startbeträge für Jackpot und Super-Jackpot fest; sie treten nach 24 Stunden in Kraft.
rescale_poolsAdministratorÜberträgt einen Teil der Startreserve in die Gewinnbank der Spiele. Nur in diese Richtung; in die Jackpots lässt sich nichts übertragen – sie füllen sich nach einem Gewinn von selbst aus der Reserve auf.
set_pausedAdministratorSetzt die Annahme neuer Einsätze aus oder nimmt sie wieder auf — für den Fall einer Störung des Orakels. Bereits getätigte Einsätze werden abgerechnet, Gewinnauszahlungen und Auszahlung funktionieren wie gewohnt.
set_guardian / guard_pauseAdministratorDer Administrator ernennt einen Hüter — einen Schlüssel des Wächterdienstes, der nur eines kann: die Annahme neuer Einsätze aussetzen, wenn das Orakel nicht mehr antwortet. Die Pause aufheben kann nur der Administrator.
propose_dev_authority / accept_dev_authorityAdministratorÜbertragung der Administratorrechte auf einen anderen Schlüssel in zwei Schritten: Der aktuelle Schlüssel benennt den neuen, der neue bestätigt selbst.
roll_epoch / checkinjederDienstbefehle: Sie aktualisieren die Wochenstatistik und die Tagesmarke. Mittel bewegen sie nicht.
claim_devAdministratorEntnimmt den angesammelten Anteil des Administrators – und nur ihn.
initialize / fund_poolsAdministratorEinmaliger Start. initialize legt die Konten an (es signiert der Inhaber des Update-Rechts des Programms); fund_pools trägt einmalig die eingezahlte Startbank auf die Töpfe verteilt ein und den Überschuss darüber in eine eigene Zeile, die der Administrator mit dem Befehl promo_pay entnehmen kann.

Einen Befehl, der die Gewinnbank, die Jackpots oder die Guthaben der Spieler an den Administrator überweisen würde, gibt es im Code nicht.

Die Runde Schritt für Schritt

  1. Einsatz. Der Befehl spin_commit bucht die Runde von Ihrem Guthaben ab und legt in derselben Transaktion beim Orakel ORAO eine Anfrage nach einer Zufallszahl an. Die Adresse der Anfrage wird aus Ihrer Wallet und der Rundennummer berechnet, deshalb lässt sich keine fremde Anfrage unterschieben.
  2. Zahl. Mehrere unabhängige ORAO-Knoten signieren die Zufallszahl und schreiben sie ins Netzwerk. Bis zu diesem Eintrag kennt sie niemand: weder Sie noch das Projekt noch ein einzelner Knoten.
  3. Abrechnung. Der Befehl spin_settle liest die Zahl aus dem Eintrag des Orakels, prüft, dass es die Anfrage genau Ihrer Runde ist, und berechnet den Gewinn. Die Website sendet ihn selbst; ist die Seite geschlossen, erledigt das das Bereitschaftsprogramm des Projekts oder Sie beim nächsten Besuch.
  4. Darstellung. Karten, Minen, Rakete, Steine – das sind Arten, einen bereits berechneten Gewinn zu zeigen. Ihre Klicks im Spiel beeinflussen ihn nicht.

Warum sich das Ergebnis weder im Voraus erfahren noch fälschen lässt. Die endgültige Zahl der Runde ist die Zahl des Orakels, vermischt mit dem Hash des Blocks, in dem der Einsatz festgehalten ist. Im Moment des Einsatzes existiert dieser Hash noch nicht, und die Zahl des Orakels kommt später und von einer dritten Seite: Niemand kann den Ausgang im Voraus berechnen – weder der Spieler noch das Projekt noch das Orakel selbst. Das Spiel, die Startbeträge der Jackpots und die Gewinnobergrenze werden im Moment des Einsatzes festgehalten, die Abrechnungsformel steht im offenen Code. Eine verspätete Abrechnung ist nie günstiger als eine rechtzeitige. Die Regeln lassen sich nur ändern, indem der Code des Programms ersetzt wird, und das sehen alle (siehe den Abschnitt über den Administrator).

Wie aus einer Zufallszahl ein Ergebnis wird

Eine Runde besteht aus 1 bis 100 Einsätzen zu je 0,01 SOL (am Rad bis zu 1000). Die Zahl des Orakels wird für jeden Einsatz zu einem unabhängigen Zufallswert entfaltet, und für jeden beantwortet der Vertrag der Reihe nach die Fragen:

  1. Super-Jackpot, Jackpot, Mini-Jackpot? Die Chance jedes Topfs entspricht dem Beitrag des Einsatzes zu ihm, geteilt durch den Startbetrag des Topfs. Ein Topf wird nur ausgespielt, wenn er mindestens 25 % seines Startbetrags enthält.
  2. Gewinn des Spiels? Jedes Spiel hat seine eigene Gewinnchance und seine eigene Tabelle aus sechs Stufen mit Gewichten. Am Rad zum Beispiel fällt ein Gewinn bei 10 % der Einsätze. Die Tabellen aller Spiele stehen auf deren Seiten.
  3. „Nochmal“? Mit einer Chance von 11,6 % wird der Einsatz kostenlos auf Kosten der Gewinnbank wiederholt.
  4. Andernfalls bleibt der Einsatz ohne Gewinn. Aufgeteilt wird er wie jeder andere: Gewinnbank, Jackpots und Anteil des Administrators.

Die Tabellen der Spiele sind verschieden, die erwartete Ausschüttung ist aber bei allen gleich (auf Hundertstel Prozentpunkte genau; bei einer Gewinnbank ab 40 SOL, wenn die Gewinne nicht an die Obergrenze stoßen): etwa 77,5 % des Einsatzes als gewöhnliche Gewinne, zusammen mit den Wiederholungen „Nochmal“ etwa 88 % der bezahlten Einsätze. Die Gleichheit prüft der Compiler: Liegt der Erwartungswert eines Spiels über dem des Rads oder um mehr als einen halben Prozentpunkt darunter, lässt sich das Programm nicht bauen.

Wohin der Vertrag jeden Einsatz legt

WohinAnteil am bezahlten EinsatzWozu
Gewinnbank≈88%gewöhnliche Gewinne aller Spiele
Jackpot, Mini-Jackpot, Super-Jackpot und Startreserve2%drei gemeinsame Töpfe
Administrator10%Einnahme des Projekts; eine andere gibt es nicht

Im Code sind die Anteile auf jeden ausgeführten Einsatz bezogen, kostenlose Wiederholungen eingeschlossen; deshalb stehen dort 8,84 % und 1,77 %: Umgerechnet auf bezahlte Einsätze sind das im Schnitt 10 % und 2 %.

Die begrenzenden Regeln und wozu sie da sind

  • Ein einzelner Gewinn – höchstens ein Viertel der Gewinnbank. Der Vertrag kann nicht mehr versprechen, als er hat, und ein einzelner großer Gewinn leert die Bank nicht für die anderen. Was nicht ausgezahlt wird, bleibt in der Bank.
  • Auszahlung 12 Stunden nach der letzten Aufladung. Die Regel ist für alle gleich und als Konstante festgeschrieben: Ändern lässt sie sich nur mit einer neuen Version des Programms.
  • Die Startbeträge der Jackpots ändern sich mit 24 Stunden Verzögerung. Die Chancen einer Runde werden im Moment des Einsatzes festgelegt, deshalb lassen sie sich nicht „passend zu einem bereits getätigten Einsatz“ ändern.
  • 20 Minuten für die Abrechnung. Hat das Orakel nicht geantwortet, wird der Einsatz dem Spieler vollständig erstattet: Solange es die Zahl nicht gibt, kennt niemand den Ausgang, deshalb lässt sich ein Verlust auf diesem Weg nicht umgehen. Hat es geantwortet, aber die Abrechnung kam zu spät, werden die regulären Gewinne ausgezahlt, die Jackpots werden in dieser Runde jedoch nicht ausgespielt. Tresorschutz. Vor jeder Auszahlung und nach jeder Abrechnung prüft der Vertrag, dass im Tresor nicht weniger liegt, als er Spielern und Töpfen schuldet; andernfalls wird die Operation abgelehnt. Hüter. Wenn das Orakel nicht mehr antwortet, wird die Annahme neuer Einsätze automatisch ausgesetzt; Abrechnungen und Auszahlung funktionieren weiter.
  • Der Jackpot wird in Raten gezahlt: Dem Gewinner stehen 95 % des Topfs zu, davon 20 % sofort und je 8 % pro Woche. Der noch nicht ausgezahlte Teil ist auf dem Konto des Gewinners eingetragen.
  • Eine nicht abgeschlossene Runde pro Spieler. Solange die Runde nicht abgerechnet ist, wird kein neuer Einsatz angenommen.

Was der Administrator kann und was nicht

Er kann

  • seinen Anteil entnehmen – 10 % der bezahlten Einsätze;
  • SOL in die Reserve einzahlen und sie aus der Reserve in die Gewinnbank übertragen;
  • den Überschuss entnehmen, der beim Start über die Startbank hinaus im Tresor lag;
  • die Startbeträge der Jackpots ändern — mit Verzögerung und innerhalb festgelegter Grenzen;
  • die Annahme neuer Einsätze aussetzen, wenn das Orakel nicht antwortet, und seine Rechte auf einen anderen Schlüssel übertragen.

Er kann nicht

  • die Gewinnbank, die Jackpots, die Reserve oder die Guthaben der Spieler abziehen (als Spieler gewinnt er zu denselben Bedingungen wie alle);
  • die Gewinntabellen, die Gewinnchance der Spiele und die Anteile am Einsatz ändern: Das sind Konstanten des Codes;
  • die Zufallszahl einer Runde vor dem Einsatz erfahren oder sie auswählen;
  • die Abrechnung getätigter Einsätze oder die Auszahlung stoppen: Die Pause betrifft nur neue Einsätze.

Ein ehrlicher Vorbehalt. Das Programm hat ein Update-Recht: Solange es nicht widerrufen ist, kann sein Inhaber den Code durch eine neue Version ersetzen, und dann gilt alles oben Gesagte bereits für den neuen Code. Der Status dieses Rechts und jedes Update sind im Solana-Explorer sichtbar. Ein unabhängiges Audit des Vertrags gibt es nicht.

Womit das geprüft wurde

  • Tests des Vertrags: Anteil des Administrators von 10 % in jedem Spiel, nahezu gleiche Auszahlungsquote aller Spiele bei einer Bank von 50 SOL, die Viertel-Regel und die Gewinnobergrenze zum Zeitpunkt des Einsatzes, die Auszahlungssperre, die verzögerte Änderung der Startbeträge, eine späte Abrechnung ist nicht günstiger als eine rechtzeitige.
  • Prüfung der Mittelerhaltung: Zehntausende zufälliger Operationen, nach jeder wird der Betrag im Tresor mit der Summe der Guthaben und Töpfe abgeglichen.
  • Lange Durchläufe: je zwei Millionen Einsätze pro Spiel – wie viel an die Spieler ausgezahlt wurde und wie viel der Administrator erhalten hat.
  • Echte Transaktionen auf einem lokalen Solana-Knoten: Aufladung, abgelehnte Auszahlung vor Ablauf der Frist, Einzahlung in die Reserve, Änderung der Startbeträge.
  • Tests der Website: Die Website berechnet die Chancen mit denselben Formeln wie der Vertrag und gleicht sich mit Mustern ab, die der Vertrag aufgezeichnet hat.

Was nicht geprüft und nicht umgesetzt ist, steht ungeschönt auf der Seite „Warum FAIRDRUM“. Wie Sie jede Runde selbst prüfen, steht auf der Seite „Runde prüfen“.

Die Parameter des Vertrags in einer Tabelle

Einzeleinsatz
0,01 SOL
Runde
bis zu 100 Einsätze in den Spielen, bis zu 1.000 am Rad
Spiele (Modi)
16
Chance auf „Nochmal“
11,6%
Obergrenze eines Gewinns
1/4 der Gewinnbank
Kleinster Startbetrag
Jackpot 0,2 SOL, Super-Jackpot 2 SOL
Mini-Jackpot
startet bei 1/10 des Jackpots
An den Jackpot-Gewinner
95% · 5 % gehen in den Super-Jackpot
An den Gewinner des Super-Jackpots
90%
Auszahlungssperre
12 Stunden nach der letzten Aufladung
Frist für die Abrechnung einer Runde
3.000 Slots des Netzwerks, etwa 20 Minuten
Netzwerk- und Orakelgebühr
0,005 SOL pro Runde, nicht vom Projekt erhoben