Για να διασφαλίσουμε διαφάνεια και αποδείξιμη δικαιοσύνη έχουμε δημιουργήσει μια αλυσίδα 10 εκατομμυρίων SHA256 hash για κάθε παιχνίδι πολλαπλών παικτών, ξεκινώντας με ένα μυστικό διακομιστή στο οποίο έχει τροφοδοτηθεί επανειλημμένα η έξοδος SHA256 πίσω στον εαυτό του 10 εκατομμύρια φορές
Το SHA256 του τελικού hash για το Platform είναι: eeb4d340bfaed702601b9a08faba2f8088c4810c3e3a883293accaf25053b883
Το SHA256 του τελικού hash για το Crash είναι: c46f0705f6ba4df891ce44accda8f89f5a6fa8b987eb7c7b445280cf6cabfbc6
Το SHA256 του τελικού hash για το Battle είναι: 63cb1eb64ec4eb4de02f6bad85e42365d08f37497a1b7e907bd0b9183f27e1b3
Δημοσιεύοντάς το εδώ αποτρέπουμε οποιαδήποτε δυνατότητα επιλογής εναλλακτικής αλυσίδας SHA256. Τώρα ο διακομιστής παιχνιδιού παίζει μέσα από αυτή την αλυσίδα hash σε αντίστροφη σειρά, χρησιμοποιώντας αυτές τις τιμές για να υπολογίσει τα αποτελέσματα του παιχνιδιού με αποδείξιμη δικαιοσύνη.
1. Μυστικό Αρχικό Hash: Κάθε τύπος παιχνιδιού πολλαπλών παικτών έχει το δικό του ιδιωτικό αρχικό hash (γνωστό μόνο στον διακομιστή), σχηματίζοντας τη ρίζα μιας μοναδικής αλυσίδας hash.
2. Δημιουργία Αλυσίδας Hash: Από το αρχικό μυστικό hash, δημιουργούμε μια αλυσίδα 10.000.000 hash εφαρμόζοντας επανειλημμένα SHA256.
func HashSeed(seed string) string {
hash := sha256.Sum256([]byte(seed))
return hex.EncodeToString(hash[:])
}
func CalculateHashChain(firstHash string) []string {
hashes := make([]string, 10_000_000)
for i := int64(0); i <= 10_000_000; i++ {
firstHash = HashSeed(firstHash)
hashes[i] = firstHash
}
return hashes
}
3. Αντίστροφη Κατανάλωση: Αποκαλύπτουμε το τελικό hash στην αλυσίδα στο κοινό. Κάθε γύρος παιχνιδιού καταναλώνει τα hash σε αντίστροφη σειρά: Ο Γύρος 1 χρησιμοποιεί το hash[10_000_000] Ο Γύρος 2 χρησιμοποιεί το hash[9_999_999] και ούτω καθεξής…
4. Αυτός ο σχεδιασμός καθιστά αδύνατη την πλαστογράφηση μελλοντικών hash, ενώ επιτρέπει σε οποιονδήποτε να επαληθεύσει όλα τα προηγούμενα hash.
Απροβλεψιμότητα: Τα μελλοντικά αποτελέσματα παιχνιδιού δεν μπορούν να γίνουν γνωστά ή να επηρεαστούν, ακόμη και από τον διακομιστή.
Επαληθευσιμότητα: Οι παίκτες μπορούν να επαληθεύσουν την ακεραιότητα οποιουδήποτε προηγούμενου γύρου χρησιμοποιώντας μόνο το δημοσίως αποκαλυφθέν τελικό hash.
Απομόνωση Παιχνιδιού: Κάθε τύπος παιχνιδιού έχει τη δική του αλυσίδα, αποτρέποντας τη χειραγώγηση μεταξύ παιχνιδιών.
Για να διασφαλίσουμε αποδείξιμη δικαιοσύνη σε παιχνίδια ενός παίκτη, η πλατφόρμα μας χρησιμοποιεί ένα σύστημα βασισμένο σε τρία κύρια στοιχεία για τη δημιουργία του seed αποτελέσματος:
1. Client Seed: Αυτό είναι ένα seed που ελέγχεται από τον χρήστη. Δημιουργείται αυτόματα όταν ένας χρήστης εγγράφεται, αλλά ο χρήστης μπορεί να το αλλάξει ανά πάσα στιγμή. Η αλλαγή του client seed ξεκινά τη δημιουργία ενός νέου server seed.
2. Server Seed: Αυτό δημιουργείται από τον διακομιστή χρησιμοποιώντας εσωτερικές παραμέτρους που δεν αποκαλύπτονται στον χρήστη. Είναι μοναδικά συνδεδεμένο με το τρέχον client seed. Για κάθε client seed, υπάρχει ένα αντίστοιχο server seed. Όταν ο χρήστης αλλάζει το client seed, το προηγούμενο server seed αποκαλύπτεται για σκοπούς επαλήθευσης.
3. Nonce: Ένας μοναδικός αριθμός που βασίζεται στη χρονοσφραγίδα του στοιχήματος (σε χιλιοστά του δευτερολέπτου). Διασφαλίζει ότι ακόμη και επαναλαμβανόμενες ενέργειες παράγουν διαφορετικά αποτελέσματα.
Αυτές οι τρεις τιμές συνδυάζονται και κατακερματίζονται χρησιμοποιώντας HMAC-SHA256 για να δημιουργήσουν το τελικό seed παιχνιδιού, το οποίο στη συνέχεια χρησιμοποιείται για να καθορίσει το αποτέλεσμα του παιχνιδιού.
func GenerateUserGameSeed(userSeed string, userServerSeed string, nonce int64) (string, error) {
data := fmt.Sprintf("%s:%s:%d", userServerSeed, userSeed, nonce)
mac := hmac.New(sha256.New, []byte(data))
gameSeed := hex.EncodeToString(mac.Sum(nil))
return gameSeed, nil
}
Ο διακομιστής παρέχει την κατακερματισμένη έκδοση του τρέχοντος server seed πριν πραγματοποιηθεί οποιοδήποτε στοίχημα.
Αφού ο χρήστης αλλάξει το client seed του, το προηγουμένως χρησιμοποιημένο server seed αποκαλύπτεται.
Αυτό επιτρέπει στους χρήστες να επαληθεύσουν ότι όλα τα αποτελέσματα που δημιουργήθηκαν με το προηγούμενο server seed ήταν συνεπή και δίκαια.