fair playengineeringprovably fair
Server με αυθεντία σημαίνει ότι ο server κρατά το μόνο αντίγραφο του παιχνιδιού που μετράει. Η συσκευή σου στέλνει την κίνηση που θέλεις να παίξεις, ο server την ελέγχει με τα δικά του ζάρια και τους δικούς του κανόνες, και μόνο τότε αλλάζει το ταμπλό. Μια τροποποιημένη εφαρμογή μπορεί να ισχυρίζεται ό,τι θέλει: η αλήθεια ζει κάπου που δεν φτάνει.
Το τάβλι αξίζει αυτή την πειθαρχία. Είναι παιχνίδι με ζάρια, με σκάλα και με πότ, που σημαίνει ότι υπάρχουν δύο τρόποι να κλέψεις: να πλαστογραφήσεις τις κινήσεις σου ή να λυγίσεις τις ζαριές. Ένας δίκαιος server πρέπει να κλείσει και τις δύο πόρτες. Η δεύτερη πόρτα περιλαμβάνει κι εμάς, και θα φτάσουμε εκεί.
Τι σημαίνει στην πράξη server με αυθεντία;
Κάθε ζωντανός αγώνας του Orion υπάρχει σε ακριβώς ένα μέρος: στον server μας. Το ταμπλό στο κινητό σου είναι παράθυρο, όχι το παιχνίδι. Όταν σέρνεις ένα πούλι, η εφαρμογή δεν το μετακινεί. Στέλνει ένα μικρό μήνυμα που λέει: να τι θέλω να παίξω. Ο server ξαναπαίζει αυτή την πρόθεση πάνω στο δικό του ταμπλό, με τη δική του μηχανή κανόνων, με τα ζάρια που έριξε για εκείνον τον γύρο. Οι νόμιμες κινήσεις προχωρούν το παιχνίδι, και οι δύο παίκτες παίρνουν την ίδια νέα θέση. Οι παράνομες κινήσεις δεν συνέβησαν ποτέ.
Ένας server για όλους. Η εφαρμογή iOS είναι native SwiftUI, η Android native Jetpack Compose, και οι δύο είναι παράθυρα στο ίδιο backend και στην ίδια δεξαμενή παικτών. Άλλο τζάμι, ίδια αλήθεια.
Γιατί τα παιχνίδια που εμπιστεύονται τον client δέχονται κλεψιά;
Επειδή η συσκευή του αντιπάλου σου ανήκει στον αντίπαλό σου. Ό,τι τρέχει πάνω της μπορεί να αλλάξει. Ένας τροποποιημένος client μπορεί να στείλει κινήσεις που ποτέ δεν ήταν νόμιμες. Ένας επεξεργαστής μνήμης μπορεί να ξαναγράψει έναν αριθμό επιτόπου, και η οθόνη θα δείξει πιστά το ψέμα. Τίποτα από αυτά δεν είναι εξωτικό. Τα εργαλεία είναι δωρεάν, τεκμηριωμένα και παλιότερα από τα smartphone.
Ένα παιχνίδι που εμπιστεύεται τον client ζητά από κάθε παίκτη να υποσχεθεί ότι δεν θα κοιτάξει κάτω από το καπό. Κάποιοι θα κοιτάξουν. Έτσι κάναμε τη γνώμη του client άσχετη. Στο Orion η εφαρμογή έχει ακριβώς τρεις δουλειές:
- Να σχεδιάζει: το ταμπλό, τα πούλια, τον κύβο, το χρονόμετρο.
- Να ζητά: να ζητήσει από τον server να παίξει μια κίνηση, να προσφέρει διπλασιασμό, να παραιτηθεί.
- Να λαμβάνει: να δείχνει τη θέση που ο server λέει ότι είναι αληθινή.
Το ρίξιμο των ζαριών, η κρίση της νομιμότητας και η μετακίνηση ενός πουλιού δεν είναι σε αυτή τη λίστα. Τίποτα που κρίνει αποτέλεσμα δεν γεννιέται σε συσκευή.
Τι γίνεται όταν παίζω μια κίνηση;
Παίζεις.. Η εφαρμογή σου στέλνει την πρόθεση: αυτό το πούλι, αυτές οι θέσεις. Τίποτα στη συσκευή σου δεν αλλάζει το πραγματικό ταμπλό.
Ο server την ξαναπαίζει.. Η μηχανή κανόνων μας τρέχει την κίνηση πάνω στο ταμπλό του server και στα ζάρια του server. Αν είναι νόμιμη, το παιχνίδι προχωρά. Αν όχι, απορρίπτεται στην πηγή, όποια εφαρμογή κι αν την έστειλε.
Και οι δύο πλευρές παίρνουν την ίδια αλήθεια.. Η νέα θέση φεύγει και προς τους δύο παίκτες. Αν πέσει η σύνδεσή σου, η περίοδος χάριτος επανασύνδεσης του χρονομέτρου κρατά τη θέση σου, και επιστρέφεις στο ταμπλό όπως είναι πραγματικά, όχι όπως το θυμόταν τελευταία το κινητό σου.
Τα ποντα ακολουθούν τον ίδιο κανόνα. Όταν αρχίζει αγώνας με είσοδο, ο server δεσμεύει και τα δύο αρχικά ποσά. Το πότ ζει σε ένα μόνο κατάστιχο, στον server, και εκεί εκκαθαρίζεται όταν το παιχνίδι τελειώνει. Κανένας client δεν ρωτιέται ποτέ τι νομίζει ότι κέρδισε. Τα νομίσματα και τα πετράδια είναι εικονικά, χωρίς πραγματική αξία και χωρίς εξαργύρωση, κι όμως κρατάμε αυτό το κατάστιχο σαν να περιέχει κάτι πολύτιμο, γιατί περιέχει: την εμπιστοσύνη σου στο σκορ.
Τι εμποδίζει τον ίδιο τον server να κλέψει;
Αυτή είναι η σωστή ερώτηση, και τα περισσότερα παιχνίδια ελπίζουν να μην τη ρωτήσεις ποτέ. Ένας server που ρίχνει ζάρια στα κρυφά θα μπορούσε να τα ρίχνει ευνοϊκά για όποιον προτιμά, και δεν θα το έβλεπες ποτέ. Κάθε ζαριά μοιάζει εύλογη. Αυτό κάνουν τα ζάρια.
Έτσι αφαιρέσαμε αυτή τη δύναμη από εμάς τους ίδιους. Πριν αρχίσει ένα παιχνίδι, ο server παράγει μυστικό σπόρο και δημοσιεύει δέσμευση SHA-256 σε αυτόν. Κάθε ζαριά παράγεται μετά από τον σπόρο με HMAC-SHA256, μία τη φορά, με τη σειρά. Όταν τελειώσει το παιχνίδι, ο server αποκαλύπτει τον σπόρο. Οποιοσδήποτε μπορεί να ελέγξει ότι ο σπόρος ταιριάζει με τη δέσμευση που δόθηκε πριν από την πρώτη ζαριά, και ότι κάθε ζαριά του παιχνιδιού προκύπτει από αυτόν. Με την κρυπτογραφική έννοια, τα ζάρια σου ήταν καθορισμένα πριν αγγίξει κανένας παίκτης πούλι. Δεν θα μπορούσαμε να λυγίσουμε τη δωδέκατη ζαριά χωρίς να σπάσουμε την υπόσχεση που δημοσιεύσαμε στη ζαριά μηδέν.
Δεν χρειάζεται να μας πιστέψεις για τίποτα από αυτά. Ο επαληθευτής στο orion.arthea.ai/verify ξαναϋπολογίζει όλη την αλυσίδα στον browser σου, με Web Crypto, στο μηχάνημά σου, από το δημόσιο αρχείο του παιχνιδιού. Χωρίς λογαριασμό. Χωρίς εφαρμογή.
Πώς κλειδώνουν μεταξύ τους τα δύο μισά;
Η αυθεντία του server και τα ζάρια commit-reveal είναι δύο μισά ενός σχεδίου, και το καθένα καλύπτει το τυφλό σημείο του άλλου. Ένας server που επικυρώνει κινήσεις αλλά ρίχνει στα κρυφά σου ζητά να εμπιστευτείς το κατάστημα. Δεσμευμένα ζάρια σε έναν server που εμπιστεύεται σου ζητούν να εμπιστευτείς την εφαρμογή κάθε αγνώστου. Μαζί κλείνουν τον κύκλο. Ο client δεν μπορεί να πλαστογραφήσει κίνηση, γιατί ο server ξαναπαίζει κάθε κίνηση στην πηγή. Ο server δεν μπορεί να στήσει ζαριά, γιατί κάθε ζαριά είναι αλυσοδεμένη σε δέσμευση που δημοσιεύτηκε πριν το παιχνίδι. Κανείς στο τραπέζι, ούτε αυτοί που το έφτιαξαν, δεν κρατά ανεξέλεγκτη εξουσία πάνω στο αποτέλεσμα.
Ο client δεν μπορεί να πλαστογραφήσει κίνηση. Ο server δεν μπορεί να πλαστογραφήσει ζαριά. Όλα τα άλλα είναι διακόσμηση.
Η πόρτα στο orion.arthea.ai/go κουβαλά τους συνδέσμους για App Store και Google Play και δείχνει πάντα τι είναι διαθέσιμο αυτή τη στιγμή. Ο επαληθευτής ήρθε πρώτος, επίτηδες: η απόδειξη της δικαιοσύνης πρέπει να υπάρχει πριν παιχτεί το πρώτο αληθινό πότ.