Δεκέμβριος 6, 2021
Εισαγωγή
Η Λογαριασμός Η ομάδα μας ζήτησε να εξετάσουμε και να ελέγξουμε ένα σύνολο συμβάσεων με τελικό στόχο να βελτιώσουμε τις συμβάσεις κοινής διακυβέρνησης και να τους δώσουμε μεγαλύτερη ευελιξία. Εξετάσαμε τον κώδικα και τώρα δημοσιεύουμε τα αποτελέσματά μας.
Επισκόπηση Συστήματος
Το σύστημα βασίζεται σε τρεις κύριες συμβάσεις:
- A
SafeGuard
πρότυπο σύμβασης. Αυτή η σύμβαση είναι ηadmin
μιαςTimelock
συμβόλαιο και προσθέτει ένα επίπεδο αρθρωτών ρόλων πάνω από τοTimelock
τις ενέργειες του. Αυτή η σύμβαση ορίζει πολλούς ρόλους που έχουν ξεχωριστή ευθύνη και πρόσβαση στην κατάσταση μιας πρότασης (ουρά, ακύρωση και εκτέλεση). - A
SafeGuardFactory
σύμβαση αναπτύσσει ένα νέοSafeGuard
και ένα αντίστοιχο νέοTimelock
σύμβαση. Στη συνέχεια, ορίζει τη διεύθυνση χρονικού κλειδώματος μέσα στοSafeGuard
συμβόλαιο και καταχωρεί το νέοSafeGuard
μέσα στοRegistry
. - A
Registry
που περιέχει μια λίστα με αναπτυγμένεςSafeGuards
με τα αντίστοιχα τους Αριθμός έκδοσης.
Η SafeGuardFactory
βασικά θα γεννήσει α νέος SafeGuard
όποτε λέγεται. ΕΝΑ SafeGuard
είναι ένα περιτύλιγμα Timelock
επιχειρήσεις που προσθέτει διαφορετικούς και χωριστούς ρόλους για κάθε ενέργεια. Οι ρόλοι δομούνται μέσω της χρήσης του OpenZeppelin's AccessControlEnumerable
συμβόλαιο που παρέχει μεγαλύτερη ευελιξία και συμβατότητα στα πορτοφόλια multisig και στις περιπτώσεις επαγγελματικής χρήσης όπου πολλές διευθύνσεις μπορούν να έχουν τον ίδιο κοινό ρόλο.
Ενημέρωση: Στο PR # 10, η ομάδα Tally αποφάσισε να αφαιρέσει το Registry
σύμβαση. Η λίστα των εφαρμοζόμενων διασφαλίσεων είναι πλέον αποθηκευμένη στο SafeGuardFactory
συμβόλαιο, στο safeGuards
αναρίθμητο σύνολο, μαζί με την έκδοσή τους που είναι αποθηκευμένη στο safeGuardVersion
χαρτογράφηση.
ρόλους
Η SafeGuard
Η σύμβαση ορίζει τους ακόλουθους ρόλους:
Ενημέρωση: Η CREATOR_ROLE
Ο ρόλος έχει αφαιρεθεί ως επιδιόρθωση για το ζήτημα L02.
Έκταση
Ελέγξαμε τη δέσμευση b2c63a9dfc4090be13320d999e7c6c1d842625d3
του safeguard
αποθήκη. Στο πεδίο εφαρμογής είναι τα έξυπνα συμβόλαια στο contracts
Ευρετήριο. Ωστόσο, το mocks
κατάλογος κρίθηκε εκτός πεδίου εφαρμογής.
Υποθέσεις
Το σύστημα δεν προορίζεται να αναβαθμιστεί. ο Registry
έχει οριστεί η διεύθυνση στον κατασκευαστή του SafeGuardFactory
και το καθένα SafeGuard
μπορεί να έχει το Timelock
ρυθμίστε μόνο μία φορά. Αυτό σημαίνει ότι εάν ένα νέο Registry
αναπτύσσεται ένα νέο SafeGuardFactory
πρέπει επίσης να αναπτυχθεί. Αν το Timelock
αλλαγές εφαρμογής, το παλιό SafeGuard
s θα καταστεί απαρχαιωμένο και θα πρέπει να αναπτυχθούν νέα.
Επιπλέον, το σύστημα βασίζεται σε μεγάλο βαθμό στην εφαρμογή του α Timelock
σύμβαση που κρίθηκε εκτός του πεδίου εφαρμογής αυτού του ελέγχου. Η ομάδα δεν έχει ακόμη ολοκληρώσει την εφαρμογή του Timelock
σύμβαση. Κατά τη σύνταξη αυτής της έκθεσης, την εφαρμογή του χρονικού κλειδώματος από το Σύνθετο χρησιμοποιείται στο έργο.
Η βάση κωδικών έχει ελεγχθεί από δύο ελεγκτές κατά τη διάρκεια μιας εβδομάδας και εδώ παρουσιάζουμε τα ευρήματά μας.
Κρίσιμη σοβαρότητα
Καμία.
Υψηλή σοβαρότητα
[H01] Το ETH μπορεί να κλειδωθεί μέσα στο Timelock
σύμβαση
Η Tally
η ομάδα βασίστηκε αρχικά τις υλοποιήσεις της στο έδαφος του GovernorBravoDelegate
Σύνθετη σύμβαση.
Κατά τη διάρκεια αυτού του ελέγχου, η Tally
ανακάλυψε η ομάδα έναν περιορισμό στον κυβερνήτη του Compound όπου η ETH απέστειλε απευθείας στο Timelock
δεν είναι διαθέσιμο για χρήση από προτάσεις διακυβέρνησης και, παρόλο που δεν έχει κολλήσει μόνιμα, απαιτεί μια περίπλοκη λύση για να ανακτηθεί.
Αυτό συμβαίνει επειδή η εφαρμογή του κυβερνήτη απαιτεί να επισυναφθεί όλη η αξία μιας πρότασης ως msg.value
από τον λογαριασμό που ενεργοποιεί την εκτέλεση, χωρίς να χρησιμοποιεί με κανέναν τρόπο το Timelock
Ταμεία ETH.
Η το ίδιο θέμα εντοπίστηκε αργότερα στο SafeGuard
εκτέλεση και η ομάδα γνωρίζει το πρόβλημα και βρίσκεται στη διαδικασία να το διορθώσει.
Κατά την επίλυση του προβλήματος, εξετάστε το ενδεχόμενο να χρησιμοποιήσετε την προσέγγιση που υιοθετήθηκε από τη βιβλιοθήκη OpenZeppelin για το ίδιο τεύχος.
Ενημέρωση: Διορθώθηκε σε δέσμευση 7337db227edda83533be586135d96ddac4f5bf29
.
[H02] Το SafeGuardFactory μπορεί να παγώσει
Η Registry
η σύμβαση έχει σκοπό να παρακολουθεί όλα τα SafeGuards
ότι η SafeGuardFactory
παράγει. Έχει το εξωτερικό register
λειτουργία που χρησιμοποιείται για το σκοπό αυτό.
Ταυτόχρονα, το SafeGuardFactory
έχει στον κατασκευαστή του την ανάθεση του τοπικού registry
τιμή στην τιμή εισόδου. Δεν υπάρχει δυνατότητα αλλαγής της τιμής του registry
μεταβλητή και για το λόγο αυτό, εάν είναι νέα Registry
θα αναπτυχθεί, ένα νέο εργοστάσιο πρέπει επίσης να αναπτυχθεί.
Η SafeGuardFactory
έχει την createSafeGuard
λειτουργία, υπεύθυνος πρώτος την ανάπτυξη ενός νέου SafeGuard
, Τότε ένα νέο Timelock
με τη διεύθυνση του SafeGuard
as admin
, στη συνέχεια ρυθμίζοντας το timelock
μεταβλητή του SafeGuard
σύμβαση και τέλος εγγραφή του SafeGuard
στο μητρώο.
Το θέμα είναι ότι οποιαδήποτε κλήση σε createSafeGuard
μπορεί να αναγκαστεί να αποτύχει από έναν εισβολέα που μπορεί να καταχωρήσει απευθείας την ντετερμινιστική διεύθυνση του νέου SafeGuard
πριν από τη δημιουργία του. Όποτε ένα συμβόλαιο δημιουργεί ένα new
παράδειγμα, η μη ύπαρξη της σύμβασης αυξάνεται και η διεύθυνση όπου θα αναπτυχθεί το νέο στιγμιότυπο της σύμβασης μπορεί να καθοριστεί από την αρχική διεύθυνση της σύμβασης και τη μη. Επομένως, ένας εισβολέας μπορεί να υπολογίσει εκ των προτέρων πολλές από τις διευθύνσεις όπου το νέο SafeGuards
θα αναπτυχθούν και θα καταχωρηθούν αυτές οι διευθύνσεις στο Registry
καλώντας το register
λειτουργία. Αυτό θα είχε ως αποτέλεσμα τις κλήσεις προς createSafeGuard
προς την Επαναφορά δεδομένου ότι η Registry
περιέχει ήδη τη διεύθυνση.
Για να αποφύγετε εξωτερικούς παράγοντες να καλούν δημόσια το Register
σύμβαση, εξετάστε το ενδεχόμενο να περιορίσετε την πρόσβαση στο register
λειτουργία αποδοχής κλήσεων αποκλειστικά από το SafeGuardFactory
.
Ενημέρωση: Διορθώθηκε το PR # 10. Η ομάδα Tally έχει αφαιρέσει το Registry
σύμβαση.
Μέση σοβαρότητα
Καμία.
Χαμηλή σοβαρότητα
[L01] Κωδικός σχολιασμού
Η Registry
η σύμβαση περιλαμβάνει μια σχολιασμένη γραμμή κώδικα. Για να βελτιώσετε την αναγνωσιμότητα, εξετάστε το ενδεχόμενο να το αφαιρέσετε από τη βάση κώδικα.
Ενημέρωση: Διορθώθηκε το PR # 10 και δεσμευτείτε 7fd27df16fc879d990d36a167a0b6e719e578558
.
[L02] Ο διαχειριστής του SafeGuard μπορεί να αναθέσει το ρόλο του δημιουργού σε οποιαδήποτε διεύθυνση
Η SafeGuard
σύμβαση ορίζει το ρόλο του α CREATOR_ROLE
η οποία, όπως υποδηλώνει το όνομα, ανατίθεται στον δημιουργό της διασφάλισης.
Ωστόσο, με την επίκληση ο grantRole
λειτουργία του AccessControlEnumerable
σύμβαση στη βιβλιοθήκη συμβάσεων OpenZeppelin, ένας διαχειριστής μπορεί να εκχωρήσει αυτόν τον ρόλο σε οποιαδήποτε διεύθυνση. Αυτό θα μπορούσε να προκαλέσει σύγχυση επειδή το δημιουργός του SafeGuard
μπορεί να είναι μόνο το SafeGuardFactory
.
Σε όλη τη βάση κώδικα, αυτός ο ρόλος έχει χρησιμοποιηθεί μόνο για να περιορίσει τους χρήστες από την αλληλεπίδραση με το setTimelock
λειτουργία του SafeGuard
σύμβαση. Με σχεδιασμό, το σύστημα το διασφαλίζει setTimelock
λειτουργία μπορεί να κληθεί μόνο μία φορά, από την μέσα στο SafeGuardFactory
σύμβαση.
Σκεφτείτε να αφαιρέσετε το CREATOR_ROLE
ρόλο από το SafeGuard
σύμβαση και χρησιμοποιώντας το onlyOwner
αλλαγή στο setTimelock
λειτουργία.
Ενημέρωση: Διορθώθηκε το PR # 10.
[L03] Εσφαλμένος ορισμός και υλοποίηση διεπαφής
Η ISafeGuard
διεπαφή δεν ορίζει το queueTransactionWithDescription
λειτουργία υλοποιείται στο SafeGuard
σύμβαση, και ταυτόχρονα, ορίζει το __abdicate, __queueSetTimelockPendingAdmin και __executeSetTimelockPendingAdmin λειτουργίες αλλά δεν υλοποιούνται.
Για να βελτιώσετε την ορθότητα και τη συνέπεια στη βάση κώδικα, εξετάστε το ενδεχόμενο να αναδιαμορφώσετε το ISafeGuard
διεπαφή για να ταιριάζει ακριβώς με το SafeGuard
εφαρμογή.
Ενημέρωση: Διορθώθηκε σε δέσμευση 7fd27df16fc879d990d36a167a0b6e719e578558
.
[L04] Λείπουν συμβολοσειρές εγγράφων
Ορισμένες από τις συμβάσεις και τις λειτουργίες στη βάση κώδικα στερούνται τεκμηρίωσης. Για παράδειγμα, μερικές λειτουργίες στο SafeGuard
σύμβαση.
Επιπλέον, ορισμένες συμβολοσειρές εγγράφων χρησιμοποιούν άτυπη γλώσσα, όπως αυτή πάνω από το setTimelock
λειτουργία στο SafeGuard
σύμβαση.
Αυτό εμποδίζει τους αναθεωρητές να κατανοήσουν την πρόθεση του κώδικα, η οποία είναι θεμελιώδης για τη σωστή αξιολόγηση όχι μόνο της ασφάλειας αλλά και της ορθότητας. Επιπλέον, οι συμβολοσειρές εγγράφων βελτιώνουν την αναγνωσιμότητα και διευκολύνουν τη συντήρηση. Θα πρέπει να εξηγούν ρητά τον σκοπό ή την πρόθεση των συναρτήσεων, τα σενάρια σύμφωνα με τα οποία μπορεί να αποτύχουν, τους ρόλους που επιτρέπεται να τις καλέσουν, τις τιμές που επιστρέφονται και τα συμβάντα που εκπέμπονται.
Εξετάστε το ενδεχόμενο να τεκμηριώσετε διεξοδικά όλες τις λειτουργίες (και τις παραμέτρους τους) που αποτελούν μέρος του δημόσιου API των συμβάσεων. Οι λειτουργίες που υλοποιούν ευαίσθητες λειτουργίες, ακόμη και αν δεν είναι δημόσιες, θα πρέπει επίσης να τεκμηριώνονται με σαφήνεια. Όταν γράφετε συμβολοσειρές εγγράφων, σκεφτείτε να ακολουθήσετε το Μορφή φυσικών προδιαγραφών Ethereum (NatSpec).
Ενημέρωση: Εν μέρει σταθερό σε PR # 10. Οι κατάλληλες συμβολοσειρές εγγράφων έχουν προστεθεί σε διάφορες λειτουργίες σε όλη τη βάση κώδικα. Ωστόσο, εκτός από τις τρέχουσες αλλαγές, εξετάστε το ενδεχόμενο να κάνετε τις ακόλουθες αλλαγές:
- Πρόσθεση
description
καθώς η@param
στη συμβολοσειρά παραπάνωqueueTransactionWithDescription
λειτουργία - Πρόσθεση
@param
στο docstring πάνω από τοcreateSafeGuard
λειτουργία στοSafeGuardFactory
σύμβαση - Πρόσθεση
@return
σε συμβολοσειρές εγγράφων πάνω από τις συναρτήσεις στοSafeGuardFactory
σύμβαση.
[L05] Άχρηστος ή επαναλαμβανόμενος κωδικός
Υπάρχουν μέρη στη βάση κωδικών όπου ο κώδικας είτε επαναλαμβάνεται είτε δεν χρειάζεται. Μερικά παραδείγματα είναι:
- Γραμμές 29-32 του
Registry
συμβόλαιο είναι άχρηστα, γιατί το_add
λειτουργία τουEnumerableSet
σύμβαση εκτελεί ήδη αυτούς τους ελέγχους έναντι των τιμών που έχουν ήδη καθοριστεί. - γραμμές 62, 67, 73 και 78 του
SafeGuard
όλα τα συμβόλαια επαναλαμβάνουν την ίδια ακριβώς λειτουργία. Εξετάστε το ενδεχόμενο να το ενθυλακώσετε σε μια εσωτερική λειτουργία για να αποφύγετε την αντιγραφή κώδικα. - Γραμμές 62-63 και 67-68 of
SafeGuard
επαναλαμβάνονται. Εξετάστε το ενδεχόμενο να τα ενθυλακώσετε σε μια ενιαία εσωτερική λειτουργία. - Η χρήση του
gasleft
για να καθορίσετε πόση ποσότητα αερίου πρέπει να προωθηθεί στην κλήση της συνάρτησηςexecuteTransaction
είναι περιττή. Αυτό συμβαίνει επειδή, σε εκείνο το σημείο της εκτέλεσης, ολόκληρο το αέριο που απομένει θα χρησιμοποιηθεί για να συνεχιστεί η εκτέλεση. Εάν αυτό δεν είναι για λόγους σαφήνειας, εξετάστε το ενδεχόμενο να αφαιρέσετε τοgas
παράμετρος από την κλήση.
Εξετάστε το ενδεχόμενο να εφαρμόσετε την προτεινόμενη επιδιόρθωση για να δημιουργήσετε έναν καθαρότερο κώδικα και να βελτιώσετε τη συνοχή και την αρθρωτή βάση σε σχέση με τη βάση κωδικών.
Ενημέρωση: Διορθώθηκε το PR # 10 και δεσμευτείτε 7fd27df16fc879d990d36a167a0b6e719e578558
.
Σημειώσεις και πρόσθετες πληροφορίες
[N01] Ασυνεπές στυλ
Υπάρχουν ορισμένα σημεία στη βάση κώδικα, όπου οι διαφορές στο στυλ επηρεάζουν την αναγνωσιμότητα, καθιστώντας πιο δύσκολη την κατανόηση του κώδικα. Μερικά παραδείγματα είναι:
- Η
Registry
συμβόλαιο χρησιμοποιεί διαφορετικά στυλ για docstrings σε ολόκληρο το συμβόλαιο. - Η
SafeGuard
σύμβαση εκπέμπει ένα γεγονός ότανqueueTransactionWithDescription
καλείται αλλά δεν εκπέμπονται γεγονότα σε άλλες συναρτήσεις που αφορούν συναλλαγές. - Στο
SafeGuard
συμβόλαιο, μερικές φορές αξία χρησιμοποιείται ως ονομαστική παράμετρος και μερικές φορές _αξία χρησιμοποιείται.
Λαμβάνοντας υπόψη την αξία που προσθέτει ένα συνεπές στυλ κωδικοποίησης στην αναγνωσιμότητα του έργου, εξετάστε το ενδεχόμενο επιβολής ενός τυπικού στυλ κωδικοποίησης με τη βοήθεια εργαλείων linter, όπως το Solhint.
Ενημέρωση: Διορθώθηκε το PR # 10 και δεσμευτείτε 7fd27df16fc879d990d36a167a0b6e719e578558
.
[N02] Λείπει η άδεια
Από τα ακόλουθα συμβόλαια στη βάση κώδικα λείπει ένα αναγνωριστικό άδειας SPDX.
Για να θέσετε σε σίγαση τις προειδοποιήσεις μεταγλωττιστή και να αυξήσετε τη συνοχή σε ολόκληρη τη βάση κώδικα, εξετάστε το ενδεχόμενο να προσθέσετε ένα αναγνωριστικό άδειας χρήσης. Ενώ το κάνετε σκεφτείτε να αναφερθείτε σε spdx.dev κατευθυντήριων γραμμών.
Ενημέρωση: Διορθώθηκε το PR # 10 και δεσμευτείτε 7fd27df16fc879d990d36a167a0b6e719e578558
.
[N03] Η εξάρτηση του OpenZeppelin Contract δεν είναι καρφιτσωμένη
Για να αποφευχθούν απροσδόκητες συμπεριφορές σε περίπτωση αλλαγών που κυκλοφορούν σε μελλοντικές ενημερώσεις του Βιβλιοθήκη OpenZeppelin Contracts, σκεφτείτε να καρφιτσώσετε την έκδοση αυτής της εξάρτησης στο πακέτο.json αρχείο.
Ενημέρωση: Διορθώθηκε το PR # 10.
[N04] Η έκδοση μεταγλωττιστή Solidity δεν είναι καρφιτσωμένη
Σε όλη τη βάση κώδικα, σκεφτείτε να καρφιτσώσετε την έκδοση του Μεταγλωττιστής Solidity στην τελευταία του σταθερή έκδοση. Αυτό θα βοηθήσει στην αποφυγή της εισαγωγής απροσδόκητων σφαλμάτων λόγω μη συμβατών μελλοντικών εκδόσεων. Για να επιλέξουν μια συγκεκριμένη έκδοση, οι προγραμματιστές θα πρέπει να λάβουν υπόψη τόσο τις δυνατότητες του μεταγλωττιστή που απαιτούνται από το έργο όσο και τη λίστα των γνωστών σφαλμάτων συσχετίζεται με κάθε έκδοση μεταγλωττιστή Solidity.
Ενημέρωση: Διορθώθηκε το PR # 10.
[N05] Τυπικό λάθος
Σε διάφορες περιπτώσεις σε όλη τη βάση κώδικα, η λέξη role
γράφεται λάθος ως rol
. Ένα τέτοιο παράδειγμα είναι στο το docstring εντός του constructor
του SafeGuard
σύμβαση.
Εξετάστε το ενδεχόμενο να διορθώσετε αυτά τα τυπογραφικά λάθη για να βελτιώσετε την αναγνωσιμότητα του κώδικα.
Ενημέρωση: Εν μέρει σταθερό σε PR # 10. Ενώ η ορθογραφία του role
έχει διορθωθεί, το σχόλιο "ορισμός ρόλου διαχειριστή η καθορισμένη διεύθυνση διαχειριστή" πρέπει να είναι "ορισμός ρόλου διαχειριστή σε καθορισμένη διεύθυνση διαχειριστή". Επιπλέον, το "execute" γράφεται λάθος στο SafeGuard
συμβόλαιο για γραμμή 69, γραμμή 82, γραμμή 96 και γραμμή 110 και το «διαθέσιμο» είναι γραμμένο λάθος γραμμή 70, γραμμή 83, γραμμή 97, γραμμή 111. Επίσης, σκεφτείτε να αντικαταστήσετε άτυπες λέξεις όπως π.χ "θα" in SafeGuard
συμβόλαιο με επίσημες εναλλακτικές λύσεις, όπως το «πρόκειται να».
[N06] Δηλώστε το uint ως uint256
Υπάρχουν αρκετές εμφανίσεις στη βάση κώδικα όπου δηλώνονται οι μεταβλητές uint
τύπος δεδομένων αντί για uint256
. Για παράδειγμα, το eta
μεταβλητή στο QueueTransactionWithDescription
συμβάν του SafeGuard
σύμβαση.
Για να ευνοηθεί η σαφήνεια, όλες οι περιπτώσεις του uint
θα πρέπει να δηλωθεί ως uint256
.
Ενημέρωση: Διορθώθηκε το PR # 10 και δεσμευτείτε 7fd27df16fc879d990d36a167a0b6e719e578558
.
[N07] Μη χρησιμοποιημένη εισαγωγή
Η SafeGuard
συμβολαιακές εισαγωγές το console
συμβόλαιο αλλά δεν το χρησιμοποιεί ποτέ.
Για να βελτιώσετε την αναγνωσιμότητα του κώδικα, εξετάστε το ενδεχόμενο να αφαιρέσετε τυχόν αχρησιμοποίητες εισαγωγές.
Ενημέρωση: Διορθώθηκε το PR # 10.
συμπεράσματα
Βρέθηκαν ένα υψηλό και αρκετές άλλες δευτερεύουσες ευπάθειες και έχουν προταθεί συστάσεις και διορθώσεις.
- &
- πρόσβαση
- Λογαριασμός
- απέναντι
- Ενέργειες
- ενεργειών
- Πρόσθετος
- διεύθυνση
- διαχειριστής
- Όλα
- ήδη
- Αν και
- api
- πλησιάζω
- γύρω
- έλεγχος
- Βασικα
- είναι
- σφάλματα
- επιχείρηση
- κλήση
- περιπτώσεις
- Αιτία
- αλλαγή
- χρέωση
- κωδικός
- Κωδικοποίηση
- Κοινός
- Χημική ένωση
- σύγχυση
- εξέταση
- Περιέχει
- ΣΥΝΕΧΕΙΑ
- σύμβαση
- συμβάσεις
- θα μπορούσε να
- δημιουργός
- Ρεύμα
- ημερομηνία
- μοιρασιά
- Υπηρεσίες
- προγραμματιστές
- διαφορετικές
- ανακάλυψαν
- Λεπτομερής
- ETH
- Συμβάν
- εκδηλώσεις
- παράδειγμα
- εργοστάσιο
- Χαρακτηριστικά
- Τελικά
- Όνομα
- σταθερός
- Ευελιξία
- Βρέθηκαν
- λειτουργία
- χρήματα
- μελλοντικός
- GAS
- Δίνοντας
- γκολ
- διακυβέρνησης
- Κυβερνήτης
- κατευθυντήριων γραμμών
- που έχει
- βοήθεια
- εδώ
- Ψηλά
- Πως
- HTTPS
- εφαρμοστεί
- Αυξάνουν
- αυξημένη
- περιβάλλον λειτουργίας
- IT
- γνωστός
- Γλώσσα
- αργότερο
- Βιβλιοθήκη
- Άδεια
- γραμμή
- Λίστα
- τοπικός
- κλειδωμένη
- κοίταξε
- Κατασκευή
- Ταίριασμα
- σπονδυλωτή
- Πολυσήμαντο
- ΑΛΛΑ
- παρόν
- διαδικασια μας
- σχέδιο
- πρόταση
- δημόσιο
- δημοσιεύει
- κάντε ΕΓΓΡΑΦΗ
- Δελτία
- αναφέρουν
- Αποθήκη
- Αποτελέσματα
- ανασκόπηση
- ασφάλεια
- σειρά
- τον καθορισμό
- Shared
- έξυπνος
- Έξυπνα συμβόλαια
- στερεότητα
- Κατάσταση
- στυλ
- σύστημα
- Μέσω
- παντού
- ώρα
- εργαλεία
- τροχιά
- Συναλλαγές
- ενημερώσεις
- us
- Χρήστες
- αξία
- Θέματα ευπάθειας
- Πορτοφόλια
- εβδομάδα
- Ο ΟΠΟΊΟΣ
- εντός
- λόγια
- γραφή