{"id":18756091,"url":"https://github.com/lefosg/cryptosos","last_synced_at":"2025-08-02T21:37:32.422Z","repository":{"id":216703927,"uuid":"742089385","full_name":"lefosg/CryptoSOS","owner":"lefosg","description":"The SOS game for ethereum based platforms","archived":false,"fork":false,"pushed_at":"2024-01-11T18:48:31.000Z","size":215,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-05-20T13:55:59.701Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Solidity","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/lefosg.png","metadata":{"files":{"readme":"Readme.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null}},"created_at":"2024-01-11T18:33:26.000Z","updated_at":"2024-01-11T18:47:46.000Z","dependencies_parsed_at":"2024-01-12T05:17:35.481Z","dependency_job_id":"c5ab9fec-2130-46cd-b813-ad3bf784fe84","html_url":"https://github.com/lefosg/CryptoSOS","commit_stats":null,"previous_names":["lefosg/cryptosos"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/lefosg/CryptoSOS","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lefosg%2FCryptoSOS","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lefosg%2FCryptoSOS/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lefosg%2FCryptoSOS/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lefosg%2FCryptoSOS/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/lefosg","download_url":"https://codeload.github.com/lefosg/CryptoSOS/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lefosg%2FCryptoSOS/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":268457614,"owners_count":24253463,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-08-02T02:00:12.353Z","response_time":74,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-07T17:35:06.894Z","updated_at":"2025-08-02T21:37:32.360Z","avatar_url":"https://github.com/lefosg.png","language":"Solidity","funding_links":[],"categories":[],"sub_categories":[],"readme":"## Term Assignment \n### CryptoSOS \nΤηρήθηκε το ίδιο public API με αυτό που περιγράφεται στην εκφώνηση. Οι μόνες συναρτήσεις \nπου υλοποιήθηκαν εξτρά είναι όλες private, και έχουν βοηθητικό ρόλο. Γενικά, στην αρχή το \nsmart contract έχει τα πεδία του (μεταβλητές), τα events, μετά ο constructor, modifiers, public \nσυναρτήσεις και τέλος οι private. \\\n\u003cem\u003ePublic functions\u003c/em\u003e: \n\u003cul\u003e\n\u003cli\u003e play \u003c/li\u003e\n\u003cli\u003e sweepProfit \u003c/li\u003e\n\u003cli\u003e placeS \u003c/li\u003e\n\u003cli\u003e placeO \u003c/li\u003e\n\u003cli\u003e getGameState \u003c/li\u003e\n\u003cli\u003e cancel \u003c/li\u003e\n\u003cli\u003e tooslow \u003c/li\u003e\n\u003c/ul\u003e\n\u003cem\u003ePrivate functions\u003c/em\u003e: \n\u003cul\u003e\n\u003cli\u003e containsSOS: καλείται μετά από κάθε κίνηση και ελέγχει εάν η παρτίδα περιέχει την \nλέξη SOS με βάση τους κανόνες (γραμμή, στήλη, διαγώνια) -\u003e επιστρέφει bool \n(true/false, για να γίνει emit Winner) \u003c/li\u003e\n\u003cli\u003e outOfPlaces: ελέγχει εάν η παρτίδα πλέον δεν επιδέχεται άλλες κινήσεις, δηλαδή εάν \nγέμισε ο πίνακας με σύβολα S, O (για να γίνει emit Tie). \u003c/li\u003e\n\u003c/ul\u003e\n\u003cem\u003eModifiers\u003c/em\u003e: \n\u003cul\u003e\n\u003cli\u003e onlyOwner: ο γνωστός onlyOwner modifier, επιτρέπει μόνο στον ιδιοκτήτη του smart \ncontract να κάνει την κλήση (θέτεται στον constructor ο owner). \n\u003cli\u003e noReentrant: λύνει το πρόβλημα της επίθεσης re-entrancy. \u003c/li\u003e\n\u003cli\u003e checksBeforePlacing: ελέγχει εάν είναι έγκυρη η κίνηση που πάει να γίνει σε μία θέση \nτου πίνακα. \u003c/li\u003e\n\u003cli\u003e checksAfterPlacing: ελέγχει εάν πρέπει το παιχνίδι να τερματίσει με νίκη ή ισοπαλία, \nαλλιώς αν η παρτίδα δεν λήγει, απλά ενημερώνει την σειρά του επόμενου παίκτη που \nπρέπει να παίξει. \u003c/li\u003e\n\u003c/ul\u003e\nΌσον αφορά την tooslow, εάν την καλεί ένας παίκτης που \nτυχαίνει να είναι και ο owner, με το πέρας του 1 λεπτού η παρτίδα τελειώνει με νίκη, και μετά \nτα 5 λεπτά, με ισοπαλία, όπως αναγράφεται στην εκφώνηση. \nΥπάρχει επίσης το πρόβλημα ασφάλειας των time constraints. Αυτό περιορίζεται βάζοντας \nχρησιμοποιώντας την εντολή require για να ελέγξουμε τα χρονικά περιθώρια, πότε και ποιος \nμπορεί να κάνει μία κλήση (time locks). Στα require αυτά θα μπορούσε να προστεθεί ένα delta, \nτο οποίο προστατεύει από time manipulations, αλλά δεν βρήκα κάποια πηγή να δίνει έναν \nξεκάθαρο αριθμό για αυτό (λένε 15 δευτερόλεπτα), οπότε άφησα την υλοποίηση χωρίς αυτό.  \n\u003ch3\u003e MultiSOS \u003c/h3\u003e\nΤα παιχνίδια όλα αποθηκεύονται σε ένα array (ονομάζεται games), το οποίο περιέχει structs \nτύπου Game. Πλέον, ότι χρειαζόμασταν στο CryptoSOS για ένα παιχνίδι, μπήκε σε αυτό το \nstruct, οπότε με πολλά structs έχω πολλά παιχνίδια. Αυτό που γίνεται είναι ότι σε κάθε κλήση, \nγίνεται αναζήτηση του παιχνιδιού στο games array για να μπορέσουμε να ανανεώσουμε το \nstate (π.χ., τοποθετήσεις συμβόλων). Ένας παίκτης δεν μπορεί να παίζει ταυτόχρονα δύο \nπαιχνίδια, και μπορούν να παίζονται ταυτόχρονα πολλές παρτίδες. Μάλιστα, επειδή η ίδια \nδιεύθυνση μπορεί να παίξει πολλά παιχνίδια (όχι ταυτόχρονα), γίνονται όλοι οι απαραίτητοι \nέλεγχοι ώστε να μην μπλεχτούν οι παρτίδες, και, π.χ., όταν μία διεύθυνση καλέσει την play, να \nξέρει το smart contract ότι αυτή η διεύθυνση έχει ιστορικό, τελειωμένων παρτίδων όμως. \u003cbr\u003e\nΤα public functions είναι τα ίδια. \u003cbr\u003e\n\u003cem\u003eΕπιπλέον private functions\u003c/em\u003e:  \n\u003cul\u003e\n\u003cli\u003e matchPlayerToGame: καλείται στην play, και ευθύνη της είναι να ταιριάζει έναν παίκτη \nσε ένα παιχνίδι, είτε με έναν παίκτη που περιμένει, είτε φτιάχνοντας νέο Game, και \nβάζοντας τον παίκτη αυτόν να περιμένει για δεύτερο να καλέσει την play (κάνει και \nemit τα αντίστοιχα events). \u003c/li\u003e\n\u003cli\u003e lookupGame: επιστρέφει ένα Game για μία δοσμένη διεύθυνση -\u003e επιστρέφει Game \nmemory \u003c/li\u003e\n\u003cli\u003e lookupGameStorage: επιστρέφει ένα Game για μία δοσμένη διεύθυνση -\u003e επιστρέφει \nGame storage, για λόγους ασφάλειας φτιάχτηκε η lookupGame, να μην είναι όλες οι \nμεταβλητές storage και αλλάζει επικίνδυνα εύκολα το global state. \u003c/li\u003e\n\u003cli\u003e getLastGame: βρίσκει το τελευταίο παιχνίδι που έπαιξε ένας παίκτης -\u003e επιστρέφει το \nindex μέσα στον games πίνακα, όχι το ίδιο το Game. \u003c/li\u003e\n\u003c/ul\u003e\nΕπιπλέον modifiers: \n\u003cul\u003e\n\u003cli\u003e gameExists: ελέγχει εάν ένα παιχνίδι υπάρχει, για να ξέρουμε ότι οι κλήσεις που \nγίνονται αντιστοιχούν σε υπάρχοντα παιχνίδια. \u003c/li\u003e\n\u003c/ul\u003e\nΓια την tooslow πως αναφέρθηκε σε διάλεξη, ο όowner δεν έχει κάποια ευθύνη για να λήξει \nκάποιο παιχνίδι, την καλούν μόνο οι παίκτες ενός τρέχοντος παιχνιδιού. \n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flefosg%2Fcryptosos","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flefosg%2Fcryptosos","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flefosg%2Fcryptosos/lists"}