Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/lefosg/cryptosos
The SOS game for ethereum based platforms
https://github.com/lefosg/cryptosos
Last synced: 19 days ago
JSON representation
The SOS game for ethereum based platforms
- Host: GitHub
- URL: https://github.com/lefosg/cryptosos
- Owner: lefosg
- Created: 2024-01-11T18:33:26.000Z (about 1 year ago)
- Default Branch: main
- Last Pushed: 2024-01-11T18:48:31.000Z (about 1 year ago)
- Last Synced: 2024-11-07T17:55:48.160Z (2 months ago)
- Language: Solidity
- Size: 210 KB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: Readme.md
Awesome Lists containing this project
README
## Term Assignment
### CryptoSOS
Τηρήθηκε το ίδιο public API με αυτό που περιγράφεται στην εκφώνηση. Οι μόνες συναρτήσεις
που υλοποιήθηκαν εξτρά είναι όλες private, και έχουν βοηθητικό ρόλο. Γενικά, στην αρχή το
smart contract έχει τα πεδία του (μεταβλητές), τα events, μετά ο constructor, modifiers, public
συναρτήσεις και τέλος οι private. \
Public functions:
- play
- sweepProfit
- placeS
- placeO
- getGameState
- cancel
- tooslow
Private functions:
- containsSOS: καλείται μετά από κάθε κίνηση και ελέγχει εάν η παρτίδα περιέχει την
λέξη SOS με βάση τους κανόνες (γραμμή, στήλη, διαγώνια) -> επιστρέφει bool
(true/false, για να γίνει emit Winner) - outOfPlaces: ελέγχει εάν η παρτίδα πλέον δεν επιδέχεται άλλες κινήσεις, δηλαδή εάν
γέμισε ο πίνακας με σύβολα S, O (για να γίνει emit Tie).
Modifiers:
- onlyOwner: ο γνωστός onlyOwner modifier, επιτρέπει μόνο στον ιδιοκτήτη του smart
contract να κάνει την κλήση (θέτεται στον constructor ο owner). - noReentrant: λύνει το πρόβλημα της επίθεσης re-entrancy.
- checksBeforePlacing: ελέγχει εάν είναι έγκυρη η κίνηση που πάει να γίνει σε μία θέση
του πίνακα. - checksAfterPlacing: ελέγχει εάν πρέπει το παιχνίδι να τερματίσει με νίκη ή ισοπαλία,
αλλιώς αν η παρτίδα δεν λήγει, απλά ενημερώνει την σειρά του επόμενου παίκτη που
πρέπει να παίξει.
Όσον αφορά την tooslow, εάν την καλεί ένας παίκτης που
τυχαίνει να είναι και ο owner, με το πέρας του 1 λεπτού η παρτίδα τελειώνει με νίκη, και μετά
τα 5 λεπτά, με ισοπαλία, όπως αναγράφεται στην εκφώνηση.
Υπάρχει επίσης το πρόβλημα ασφάλειας των time constraints. Αυτό περιορίζεται βάζοντας
χρησιμοποιώντας την εντολή require για να ελέγξουμε τα χρονικά περιθώρια, πότε και ποιος
μπορεί να κάνει μία κλήση (time locks). Στα require αυτά θα μπορούσε να προστεθεί ένα delta,
το οποίο προστατεύει από time manipulations, αλλά δεν βρήκα κάποια πηγή να δίνει έναν
ξεκάθαρο αριθμό για αυτό (λένε 15 δευτερόλεπτα), οπότε άφησα την υλοποίηση χωρίς αυτό.
MultiSOS
Τα παιχνίδια όλα αποθηκεύονται σε ένα array (ονομάζεται games), το οποίο περιέχει structs
τύπου Game. Πλέον, ότι χρειαζόμασταν στο CryptoSOS για ένα παιχνίδι, μπήκε σε αυτό το
struct, οπότε με πολλά structs έχω πολλά παιχνίδια. Αυτό που γίνεται είναι ότι σε κάθε κλήση,
γίνεται αναζήτηση του παιχνιδιού στο games array για να μπορέσουμε να ανανεώσουμε το
state (π.χ., τοποθετήσεις συμβόλων). Ένας παίκτης δεν μπορεί να παίζει ταυτόχρονα δύο
παιχνίδια, και μπορούν να παίζονται ταυτόχρονα πολλές παρτίδες. Μάλιστα, επειδή η ίδια
διεύθυνση μπορεί να παίξει πολλά παιχνίδια (όχι ταυτόχρονα), γίνονται όλοι οι απαραίτητοι
έλεγχοι ώστε να μην μπλεχτούν οι παρτίδες, και, π.χ., όταν μία διεύθυνση καλέσει την play, να
ξέρει το smart contract ότι αυτή η διεύθυνση έχει ιστορικό, τελειωμένων παρτίδων όμως.
Τα public functions είναι τα ίδια.
Επιπλέον private functions:
- matchPlayerToGame: καλείται στην play, και ευθύνη της είναι να ταιριάζει έναν παίκτη
σε ένα παιχνίδι, είτε με έναν παίκτη που περιμένει, είτε φτιάχνοντας νέο Game, και
βάζοντας τον παίκτη αυτόν να περιμένει για δεύτερο να καλέσει την play (κάνει και
emit τα αντίστοιχα events). - lookupGame: επιστρέφει ένα Game για μία δοσμένη διεύθυνση -> επιστρέφει Game
memory - lookupGameStorage: επιστρέφει ένα Game για μία δοσμένη διεύθυνση -> επιστρέφει
Game storage, για λόγους ασφάλειας φτιάχτηκε η lookupGame, να μην είναι όλες οι
μεταβλητές storage και αλλάζει επικίνδυνα εύκολα το global state. - getLastGame: βρίσκει το τελευταίο παιχνίδι που έπαιξε ένας παίκτης -> επιστρέφει το
index μέσα στον games πίνακα, όχι το ίδιο το Game.
Επιπλέον modifiers:
- gameExists: ελέγχει εάν ένα παιχνίδι υπάρχει, για να ξέρουμε ότι οι κλήσεις που
γίνονται αντιστοιχούν σε υπάρχοντα παιχνίδια.
Για την tooslow πως αναφέρθηκε σε διάλεξη, ο όowner δεν έχει κάποια ευθύνη για να λήξει
κάποιο παιχνίδι, την καλούν μόνο οι παίκτες ενός τρέχοντος παιχνιδιού.