Δεκέμβριος 1, 2021
UMA είναι μια πλατφόρμα που επιτρέπει στους χρήστες να συνάπτουν οικονομικές συμβάσεις ελαχιστοποιημένες βάσει εμπιστοσύνης στο blockchain Ethereum. Ελέγχαμε προηγουμένως ο αποκεντρωμένος χρησμός, ένα συγκεκριμένο πρότυπο χρηματοοικονομικής σύμβασης, ορισμένα ad hoc αιτήματα έλξης, το πρότυπο Perpetual Multiparty και διάφορα αυξητικά αιτήματα έλξης για μεγαλύτερη αφοσίωση. Σε αυτόν τον έλεγχο εξετάσαμε έναν νέο μηχανισμό για γρήγορη αποστολή διακριτικών από μια αλυσίδα επιπέδου 2 στο κεντρικό δίκτυο Ethereum και σχετικές αλλαγές στο Optimistic Oracle. Η επισκόπηση ολοκληρώθηκε από 2 ελεγκτές σε διάστημα 3 εβδομάδων.
Έκταση
Η ελεγχόμενη δέσμευση είναι f24ad501c8e813cf685f72217e7f13c8f3c366df
και το αντικείμενο περιλαμβάνει τις ακόλουθες συμβάσεις:
- συμβόλαια/ασφαλισμένος-γέφυρα/* (εξαιρουμένων των συμβολαίων δοκιμής)
- συμβόλαια-ovm/insured-bridge/implementation/*
- συμβόλαια/κοινή/υλοποίηση/AcillaryData.sol
- contracts/oracle/implementation/SkinnyOptimisticOracle.sol
Εξετάσαμε επίσης τις αλλαγές στα αρχεία solidity Αίτημα έλξης 3445.
Όλοι οι εξωτερικοί κώδικες και οι εξαρτήσεις της σύμβασης υποτίθεται ότι λειτουργούν όπως τεκμηριώνονται
Επισκόπηση Συστήματος
Οι υποστηριζόμενες αλυσίδες επιπέδου 2 (L2), Optimism και Arbitrum, παρέχουν έναν μηχανισμό μεταφοράς κεφαλαίων στο κεντρικό δίκτυο Ethereum (L1). Ωστόσο, για λόγους ασφαλείας, υπάρχει σημαντική καθυστέρηση πριν οριστικοποιηθούν αυτές οι μεταφορές. Για να αντιμετωπιστεί αυτό, οι κάτοχοι διακριτικών L2 μπορούν να καταθέσουν κεφάλαια σε ένα συμβόλαιο UMA, το Deposit Box, γνωρίζοντας ότι τα μάρκες θα μεταφερθούν τελικά (ως παρτίδα) σε ένα συμβόλαιο L1 UMA, το Bridge Pool. Υπάρχει ξεχωριστή πισίνα Bridge για κάθε κουπόνι που θα μεταφερθεί.
Μετά από μια κατάθεση L2, οποιοσδήποτε μπορεί να αναμεταδώσει τις λεπτομέρειες στο L1 Bridge Pool, το οποίο περιμένει μια σύντομη περίοδο σε περίπτωση που κάποιος θέλει να αμφισβητήσει τις αναμεταδομένες πληροφορίες. Όλες οι διαφορές διεκπεραιώνονται από το Skinny Optimistic Oracle (περιγράφεται παρακάτω). Πριν αποδεχτούν την αναμετάδοση, οι πάροχοι ρευστότητας πρέπει να προχρηματοδοτήσουν τη σύμβαση Bridge Pool σε αντάλλαγμα για μάρκες LP. Τα αδιαμφισβήτητα ρελέ θεωρούνται έγκυρα και το Bridge Pool ολοκληρώνει τη μεταφορά χρησιμοποιώντας τα δικά του αποθέματα, όπου ένα κλάσμα της μεταφοράς εκτρέπεται στον αναμεταδότη και ένα κλάσμα διατηρείται ως τέλη ρευστότητας. Τα κεφάλαια θα αναπληρωθούν τελικά όταν οριστικοποιηθεί η κατάθεση L2 και οι προμήθειες ρευστότητας θα εκχωρηθούν στους κατόχους διακριτικών LP.
Το Bridge Pool επιτρέπει επίσης σε οποιονδήποτε να χρηματοδοτήσει μεμονωμένα μια μεταφορά (χωρίς τα αποθεματικά του Bridge Pool) πριν από τη λήξη της περιόδου διαφωνίας, με αντάλλαγμα ένα κλάσμα του ποσού μεταφοράς. Δεδομένου ότι η αναμετάδοση μπορεί ακόμα να αμφισβητηθεί, αυτά τα χρήματα θα χαθούν εάν η αναμετάδοση κριθεί λανθασμένη. Αναμένεται ότι στις περισσότερες περιπτώσεις, αυτός ο μηχανισμός θα επιτρέψει στους χρήστες να βιώσουν άμεσες μεταφορές διακριτικών L2 σε L1.
Το Skinny Optimistic Oracle είναι εννοιολογικά πολύ παρόμοιο με το υπάρχον Optimistic Oracle. Παρέχει έναν μηχανισμό κινήτρων για τους χρήστες να διεκδικούν απλώς το αποτέλεσμα ενός αιτήματος μαντείου, το οποίο υποτίθεται ότι είναι ακριβές εάν δεν αμφισβητείται. Οι διαφωνίες υποβιβάζονται στον πιο αργό μηχανισμό DVM που περιγράφεται στις προηγούμενες εκθέσεις ελέγχου μας. Η κύρια διαφορά είναι ότι η νέα έκδοση απαιτεί από τους χρήστες να παρέχουν όλες τις σχετικές πληροφορίες κατά την εκτέλεση κλήσεων συναρτήσεων, επομένως οι τιμές δεν χρειάζεται να αποθηκευτούν ή να ανακτηθούν από τον χώρο αποθήκευσης. Καταργεί επίσης τη δυνατότητα των αιτούντων να αλλάζουν τις παραμέτρους διαμόρφωσης σε ενεργά αιτήματα.
Έχουμε εξετάσει προηγουμένως τη σύμβαση Long-Short-Pair, η οποία παρέχει έναν γενικό μηχανισμό για τη δημιουργία διαφόρων χρηματοπιστωτικών μέσων. Αυτά τα συμβόλαια μπορούν να επιλυθούν όταν συμπληρωθεί ο χρόνος λήξης τους και γίνει γνωστή η τιμή διακανονισμού. Οι αλλαγές που εισάγονται από το Pull Request 3445 εισάγουν τη δυνατότητα πρόωρης επίλυσης των συμβολαίων εάν η τιμή διακανονισμού είναι γνωστή πριν από τη λήξη του χρόνου.
Προνομιακοί Ρόλοι
Οι θυρίδες καταθέσεων L2 έχουν πολλές παραμέτρους διαμόρφωσης, συμπεριλαμβανομένων των υποστηριζόμενων διακριτικών και του μέγιστου ποσοστού για την αποστολή ομαδοποιημένων κουπονιών μέσω της γέφυρας στο L1. Πρέπει επίσης να διαμορφωθούν έτσι ώστε να διασφαλίζεται η συνέπεια μεταξύ του συμβολαίου διακριτικού L1, του συμβολαίου διακριτικού L2 και του αντίστοιχου Bridge Pool. Αυτές οι παράμετροι ορίζονται από μια σύμβαση διαχειριστή στο L1, η οποία παραμετροποιεί επίσης τη διαδικασία επίλυσης διαφορών των δεξαμενών γεφυρών. Η σύμβαση αναμένεται να ελέγχεται από τον μηχανισμό διακυβέρνησης της UMA, επομένως οι χρήστες πρέπει να εμπιστεύονται αυτή τη διαδικασία για τη διαχείριση του συστήματος με σύνεση και δίκαιη διαχείριση.
Εξαρτήσεις οικοσυστήματος
Όλα τα αναθεωρημένα στοιχεία χρησιμοποιούν λογική που βασίζεται στον χρόνο, πράγμα που σημαίνει ότι εξαρτώνται από τη διαθεσιμότητα του Ethereum. Ειδικότερα, εάν οι συναλλαγές αμφισβήτησης καθυστερήσουν σημαντικά, τότε ενδέχεται να επιβεβαιωθούν εσφαλμένα τα μη έγκυρα ρελέ ή οι προτάσεις τιμών.
Επιπλέον, η γέφυρα διακριτικών υποθέτει σιωπηρά ότι όλα τα κεφάλαια που αποστέλλονται στις θυρίδες L2 θα μεταφερθούν τελικά στην αντίστοιχη ομάδα γέφυρας L1. Αυτό βασίζεται στη σωστή και συνεχή λειτουργία των γεφυρών Optimism και Arbitrum και στους μηχανισμούς επίλυσης διαφορών τους.
Τέλος, τα κουπόνια που αποστέλλονται στη θυρίδα L2 αντιστοιχίζονται στο bridge pool στο L1, όχι στον προβλεπόμενο παραλήπτη. Για να ανακτήσετε τα χρήματα από το pool, οι κάτοχοι κουπονιού L1 πρέπει πρώτα να τα ταιριάξουν με επιπλέον μάρκες. Επομένως, ο μηχανισμός βασίζεται σε μια αρκετά βαθιά αγορά διακριτικών L1 για να διασφαλιστεί ότι υπάρχει πάντα ρευστότητα.
Ζητήματα που αναφέρθηκαν από τον πελάτη
Κατά τη διάρκεια του ελέγχου, η ομάδα του UMA εντόπισε ανεξάρτητα μια σειρά ζητημάτων και συμπεριφορών που αξίζει να επισημανθούν:
Εάν οι παράμετροι Optimistic Oracle ή Bridge Admin αλλάξουν κατά τη διάρκεια της περιόδου πρόκλησης ενός ρελέ, τότε η αμφισβήτηση του ρελέ διαγράφει το ρελέ χωρίς πρόσθετη προσφυγή είτε για τον προτείνοντα είτε για τον αμφισβητούμενο. Για παράδειγμα, φανταστείτε ότι το ρελέ αποστέλλεται για το κουπόνι ασφάλειας
TOKEN_A
, αλλά στη μέση του ρελέTOKEN_A
αφαιρείται από τη λίστα επιτρεπόμενων εξασφαλίσεων. Μια διαφωνία θα επανέλθει τώρα, καθώς δεν μπορείτε να υποβάλετε αιτήματα τιμής στο OO ή το DVM για εξασφαλίσεις που δεν έχουν καταχωριστεί στη λίστα επιτρεπόμενων. Δεδομένου ότι δεν θέλουμε να αποκλείσουμε έγκυρα αιτήματα αμφισβήτησης, τοBridgePool
θα διαγράψει το εκκρεμές ρελέ γιαTOKEN_A
σε περίπτωση διαφωνίας. Οι συνέπειες αυτής της απόφασης σχεδιασμού είναι:
1. Μια αύξηση στην τελική χρέωση θα έχει ως αποτέλεσμα: Οποιαδήποτε εκκρεμή αναμετάδοση σε αυτό το διακριτικό θα είναι «ακυρώσιμη» λόγω αμφισβήτησης, είτε είναι σωστό είτε λάθος. Μια ακύρωση δεν ωφελεί κανένα από τα μέρη, επομένως προϋποθέτει την ύπαρξη έντιμων διαφωνούντων που είναι πρόθυμοι να σκοτώσουν το (σπάνιο) κακό αίτημα που τυγχάνει να υπάρχει κατά την εκτέλεση μιας τελικής αλλαγής χρέωσης. Αυτό σημαίνει επίσης ότι είναι δυνατό για έναν θλιμμένο να ξοδέψει αέριο για να ακυρώσει τα ρελέ και να τα αναγκάσει να επαναμεταδοθούν.
2. Η κατάργηση της λευκής λίστας του αναγνωριστικού ή του διακριτικού, η οποία δεν θα πρέπει να συμβεί εκτός εάν κάτι πάει πολύ στραβά θα προκαλέσει:
3. Παρατεταμένη περίοδος αδιαμφισβήτητων αιτημάτων όπου κάθε αίτημα μπορεί να ακυρωθεί και δεν υπάρχουν οικονομικά κίνητρα για αμφισβήτηση. Αυτό φαίνεται καλύτερο από την εναλλακτική λύση του πλήρους αποκλεισμού των διαφορών, αλλά είναι ομολογουμένως πολύ κακό, καθώς οποιοσδήποτε θλιμμένος μπορεί να μπλοκάρει τα ρελέ επ' αόριστον πληρώνοντας αέριο ή να στέλνει κακά ρελέ χωρίς τιμωρία (εκτός από τα τέλη αερίου).Σημείωση: αυτή είναι μια εναλλακτική λύση στο να έχετε το OO που "παγώνει" παραμέτρους όπως η τελική χρέωση ή η λίστα επιτρεπόμενων εξασφαλίσεων για κάποιο χρονικό διάστημα, αλλά αυτό θα απαιτούσε πρόσθετες κλήσεις στο OO, οι οποίες θα ήταν δαπανηρές για την ευτυχισμένη διαδρομή.
Τα ρελέ μπορούν να επιταχυνθούν μέσω
speedUpRelay()
αφού περάσουν ζωντάνια. Αν και δεν βλέπουμε κανέναν κίνδυνο με αυτό, ανοίγει τη δυνατότητα για δάνεια φλας + επιτάχυνση + διευθέτηση μετά τη ζωντάνια, δίνοντας στον οφειλέτη φλας την αμοιβή άμεσης αναμετάδοσης «δωρεάν». Αυτό το αποτρέπουμε σε αυτήν την πρόταση PR.
On
settle
, Εάν ηBridgePool
είναι έναWETH
πισίνα και ο παραλήπτης είναι μια σύμβαση που δεν είναιpayable
(δεν μπορεί να δεχτεί ETH), λοιπόνsettle
θα αποτύχει. Σκοπεύουμε να το διορθώσουμε και εναλλακτικά κατά την αποστολήWETH
, αλλά δεν έχει γίνει ακόμη καμία εξαιρετική δουλειά σε αυτό.
In
relayDeposit
, ελέγχουμε ότι τοBridgePool
Το υπόλοιπο του είναι μεγαλύτερο από το ποσό που πρέπει να αναμεταδοθεί ΣΥΝ το ομόλογο του προτείνοντος. Αυτός είναι ένας απαρχαιωμένος έλεγχος και πολύ συντηρητικός, καθώς το δεσμό του προτείνοντα αφαιρείται από τον χρήστη μετά τον έλεγχο. Το αντιμετωπίζουμε σε αυτήν την πρόταση PR.
Μόλις έπιασα ένα ζωύφιο που
chainId
inBridgePool
, περιλαμβάνεται ως μέρος τουDeposit
struct και ως είσοδος συνάρτησης σε όλες τις συναρτήσεις που σχετίζονται με το ρελέ (δηλrelayDeposit
,speedUpRelay
,settle
) είναι τύποςuint8
. Αυτό είναι πολύ μικρό για να χειριστεί το Arbitrum, για παράδειγμα, του οποίου το αναγνωριστικό είναι 421611. Στην πραγματικότητα εντοπίσαμε αυτό το σφάλμα και το διορθώσαμε στην πλευρά L2:BridgeDeposit
έχει ορίσει τοchainId
πληκτρολογήστε σεuint256
. Αυτό το PR θα κάνει τοchainId
onBridgePool
ταιριάζει με τον τύποBridgeDepositBox
: UMAprotocol/protocol#3463
Προηγουμένως, η συνάρτηση αμφισβήτησης δεν αφαιρούσε από το ποσό της κατάθεσης
pendingReserves
(αυτή είναι η μεταβλητή που παρακολουθεί πόσο μεγάλο μέρος του αποθεματικού χώρου είναι κλειδωμένο λόγω των ρελέ που δεν έχουν εγκατασταθεί ακόμα). Το αποτέλεσμα ήταν ότι κάθε διαφωνία θα κλείδωνε επ' αόριστον το ποσό του ρελέ στη δεξαμενή. Δεν μπορεί να αποσυρθεί από LP ή να χρησιμοποιηθεί από μελλοντικά ρελέ. Η επιδιόρθωση είναι εδώ: UMAprotocol/protocol#3473.
Βρήκαμε ένα bug in
BridgeDepositBox
όπουhasEnoughTimeElapsedToBridge
δεν ελέγχει εάν αuint256
η τιμή είναι ίση με0
από προεπιλογή: Διορθώθηκε στο PR 3484
Η μέθοδος συναλλαγματικής ισοτιμίας (η οποία τροποποιεί την κατάσταση) καλείται μεταξύ των κουπονιών που μεταφέρονται και των διακριτικών LP που κόβονται στη μέθοδο addLiquidity του συμβολαίου συγκέντρωσης γεφυρών. Αυτός ο υπολογισμός πρέπει να μετακινηθεί στην κορυφή της μεθόδου. Αυτό προκαλεί πολύ περίεργες αξίες κατάστασης. Δείτε PR εδώ να φτιάξω.
Η μέθοδος προβολής
liquidityUtilizationPostRelay
(το οποίο χρησιμοποιείται μόνο εκτός αλυσίδας), αναφέρει λανθασμένο αριθμό χρήσης. Ο παρονομαστής στις αυτή τη γραμμή δεν πρέπει να είναι απλάliquidReserves
, θα πρέπει να είναι μια αναπαράσταση αχρησιμοποίητων και χρησιμοποιημένων αποθεματικών. Σταθερός εδώ.
Ενημέρωση
Εκτός από τις επιδιορθώσεις ζητημάτων, εξετάσαμε επίσης τις ακόλουθες σταδιακές αλλαγές:
- PR3500 αφαιρεί την πλεονάζουσα παράμετρο διακριτικού από
BridgePool
γεγονότα. - PR3478 προσθέτει την τελική χρέωση του DVM στη λίστα των τοπικά αποθηκευμένων μεταβλητών.
- PR3460 αντιπροσωπεύει μια πιθανή αρνητική περίπτωση χρήσης ρευστότητας (επιπλέον της αντιμετώπισης N04)
- PR3482 αφαιρεί περιττά αρχεία και ενημερώνει τις σταθερές OVM σύμφωνα με τις αλλαγές του OVM 2.0.
- PR3585 ενημερώνει το
BridgeDepositBox
διεπαφή για συνέπεια και χρησιμοποιεί το OpenZeppelinSafeERC20
βιβλιοθήκη.
Κατά την εξέταση των επιδιορθώσεων εντοπίσαμε ένα άλλο ζήτημα. Κατά τον προσδιορισμό της τιμής του BridgePool
LP tokens, υπάρχει ένα ενδιάμεσος υπολογισμός που θα μπορούσε απροσδόκητα αρνητική υπερχείλιση, το οποίο θα απενεργοποιούσε προσωρινά την προσθήκη και την αφαίρεση ρευστότητας. Ο υπολογισμός θα πρέπει να αναδιαταχθεί για να προστεθούν τα χρησιμοποιημένα αποθεματικά πριν αφαιρεθούν τα αδιανεμήθη τέλη.
Κρίσιμη σοβαρότητα
[C01] Ανταμοιβή παγιδευμένου προτείνοντα
Η LongShortPair
σύμβαση ανακτά μια ανταμοιβή προτείνοντα από οποιαδήποτε διεύθυνση ενεργοποιεί τη λήξη, η οποία χρησιμοποιείται για την παροχή κινήτρων για προτάσεις τιμών στο Optimistic Oracle. Ωστόσο, το LongShortPairCreator
συμβόλαιο επίσης ανακτά και προωθεί τα κεφάλαια από τη διεύθυνση προγραμματιστή. Αυτά τα πρόσθετα κεφάλαια δεν περνούν στο Optimistic Oracle και, αντίθετα, παραμένουν παγιδευμένα εντός του LongShortPair
σύμβαση.
Εξετάστε το ενδεχόμενο κατάργησης της διπλής μεταφοράς.
Ενημέρωση: Διορθώθηκε από την δέσμευση 9bab1ff353a417952ba8c96a098773f340d9da17
in PR3523.
Υψηλή σοβαρότητα
[H01] Τα ταυτόχρονα ρελέ εξαντλούν τα αποθέματα
Η relayDeposit
λειτουργία του BridgePool
σύμβαση διασφαλίζει ότι η σύμβαση έχει επαρκή κεφάλαια για την εκτέλεση της μεταφοράς. Ωστόσο, δεν λαμβάνει υπόψη τα εκκρεμή αποθεματικά, το οποίο παρακολουθεί κεφάλαια που προορίζονται για ενεργές αναμεταδόσεις. Επομένως, πολλαπλά ταυτόχρονα ρελέ μπορεί να βασίζονται στα ίδια κεφάλαια και μπορεί να μην είναι όλα άμεσα διακανονίσιμα. Ειδικότερα, με μια σταθερή ροή μεταφορών, οι επιστροφές άμεσων αναμεταδοτών ενδέχεται να καθυστερούν επ' αόριστον.
Εξετάστε το ενδεχόμενο να αποτρέψετε τα ρελέ που θα προκαλούσαν τα εκκρεμή αποθέματα να υπερβούν τα αποθέματα υγρού.
Ενημέρωση: Διορθώθηκε από την δέσμευση 6290f3facbca8d878605a1d390ed59d4b6b6db02
in PR3501.
[H02] Τα όρια παραμέτρων γεφύρωσης δεν ταιριάζουν
Η deposit
λειτουργία του BridgeDepositBox
σύμβαση, που αναπτύσσεται σε αλυσίδες επιπέδου 2, χρησιμοποιείται για τη γεφύρωση κεφαλαίων μεταξύ των L2 και L1. Ειδικότερα, δίνονται κίνητρα στους αναμεταδοτές αναμετάδοση τα στοιχεία συναλλαγής στο σχετικό L1 BridgePool
. Ωστόσο, η θυρίδα χρησιμοποιεί περιεκτικά όρια για τον περιορισμό των τελών αναμετάδοσης, ενώ η πισίνα της γέφυρας χρησιμοποιεί αποκλειστικά όρια. Αυτό σημαίνει ότι ορισμένες καταθέσεις (με 25% τέλη αναμετάδοσης) δεν μπορούν να αναμεταδοθούν και τα κεφάλαια θα είναι απρόσιτα και στα δύο επίπεδα.
Εξετάστε το ενδεχόμενο να συγχρονίσετε τις επικυρώσεις και στα δύο επίπεδα για να διασφαλίσετε ότι όλες οι έγκυρες καταθέσεις μπορούν να αναμεταδοθούν.
Ενημέρωση: Διορθώθηκε σε δέσμευση 2345966b3a2ace0159379b3a13256cc1a4c5d52f
of PR3494. Αυτό αρχικά είχε χαρακτηριστεί ως Κρίσιμη σοβαρότητα, αλλά υποβαθμίστηκε όταν η ομάδα του UMA επεσήμανε ότι τα κεφάλαια δεν θα παγιδεύονταν αυστηρά και θα μπορούσαν να απελευθερωθούν εάν οι ψηφοφόροι του DVM συμφωνούσαν να αποδεχτούν μια τροποποιημένη περιγραφή αναμετάδοσης για τις επηρεαζόμενες καταθέσεις.
Μέση σοβαρότητα
[M01] Επανακλήσεις σε λάθος διεύθυνση
Η SkinnyOptimisticOracle
καλεί συναρτήσεις επανάκλησης στον αιτούντα τιμής, εάν υπάρχουν, έτσι ώστε ο αιτών να μπορεί να ανταποκριθεί σε σημαντικές αλλαγές κατάστασης. Ωστόσο, η επανάκληση επικαλείται εσφαλμένα τον προτείνοντα τιμή αντί για τον αιτούντα τιμής στο ο proposePriceFor
λειτουργία. Αυτό σημαίνει ότι ο αιτών τιμή δεν μπορεί να απαντήσει σε προτάσεις τιμών.
Ευτυχώς, αυτή η δυνατότητα δεν χρησιμοποιείται στην τρέχουσα βάση κώδικα. Ωστόσο, σκεφτείτε να επικαλεστείτε το priceProposed
επανάκληση στον αιτούντα.
Ενημέρωση: Διορθώθηκε κατά τη δέσμευση 7bd3faeb6f3706132f77b9ba2dce192d1a151e74
in PR3531.
[M02] Εσφαλμένη λειτουργία προσάρτησης
Η appendKeyValueBytes32
λειτουργία θα πρέπει να συνδυάζει τις εισόδους του σε μια μορφοποιημένη bytes
πίνακας. Ωστόσο, το currentAncillaryData
is απορρίφθηκε λανθασμένα.
Δεδομένου ότι τα επικουρικά στοιχεία επηρεάζει τη διαδικασία επίλυσης του μαντείου, μια εσφαλμένη τιμή θα μπορούσε να υπονομεύσει τα αποτελέσματα του μαντείου. Ευτυχώς, υπάρχει μόνο μια κλήση προς appendKeyValueBytes32
στη βάση κώδικα και χρησιμοποιεί ένα κενό currentAncillaryData
buffer, οπότε το σφάλμα δεν επηρεάζει αυτήν την περίπτωση.
Εξετάστε το ενδεχόμενο ενημέρωσης του appendKeyValueBytes32
λειτουργούν έτσι ώστε το currentAncillaryData
περιλαμβάνεται στον επιστρεφόμενο πίνακα bytes.
Ενημέρωση: Διορθώθηκε σε δέσμευση 5609433c154f47e8ee9c52f9b6d7c787fbe3e455
of PR3532.
[M03] Ελλιπής επικύρωση βοηθητικών δεδομένων
Η LongShortPair
κατασκευαστής επιβεβαιώνει ότι η customAncillaryData
είναι αρκετά μικρή. Ωστόσο, δεν λαμβάνει υπόψη το πεδίο πρόωρης λήξης. Αυτό σημαίνει το Αισιόδοξο Μαντείο μπορεί να απορρίψει απροσδόκητα αιτήματα τιμής πρόωρης λήξης, τα οποία θα απενεργοποιούσαν αυτήν τη δυνατότητα.
Εξετάστε το ενδεχόμενο να ενημερώσετε την επικύρωση για να λάβετε υπόψη το πρόσθετο πεδίο.
Ενημέρωση: Διορθώθηκε από την δέσμευση 4a56e66492f40e20254cebb145c2d91304f7cb43
in PR3524.
[M04] Εσφαλμένος χειρισμός μηδενικής χρονοσήμανσης
Στο LongShortPair
σύμβαση, είναι μηδενική χρονική σήμανση πρόωρης λήξης χρησιμοποιείται ως σημαία για να υποδείξει ότι κανείς δεν έχει ενεργοποιήσει τον μηχανισμό πρόωρης λήξης. Ωστόσο, είναι δυνατόν να ενεργοποιήστε αυτόν τον μηχανισμό με μηδενική χρονική σήμανση. Σε αυτό το σενάριο θα γίνει επίκληση του Optimistic Oracle αλλά το προστασία έναντι μεταγενέστερων αιτημάτων τιμών δεν θα είναι αποτελεσματική. Ευτυχώς, μια φορά επιλέγεται η τιμή διακανονισμού, δεν θα παρακαμφθεί, επομένως αυτό δεν θα οδηγήσει σε ασυνεπείς διευθετήσεις. Ωστόσο, ένα μεταγενέστερο αίτημα τιμής θα μπορούσε αλλάξτε την καταγεγραμμένη χρονική σήμανση πρόωρης λήξης, ακόμα κι αν η μηδενική χρονική σήμανση χρησιμοποιείται για τον προσδιορισμό της τιμής διακανονισμού. Θα μπορούσε επίσης εκπέμπουν ένα παραπλανητικό συμβάν.
Εξετάστε το ενδεχόμενο να αποτρέψετε την πρόωρη λήξη χρησιμοποιώντας τη μηδενική χρονική σήμανση.
Ενημέρωση: Διορθώθηκε από την δέσμευση 11d287c07c93c04f534b2ef3c869966d9f18ac60
in PR3526.
[M05] Πιθανός μηδενικός δεσμός
Η requestPrice
λειτουργία του SkinnyOptimisticOracle
σύμβαση χρησιμοποιεί την τελική αμοιβή ως ομόλογο εάν το ομόλογο δεν προσδιορίζεται. Ωστόσο, το requestAndProposePriceFor
λειτουργία μπορεί να χρησιμοποιήσει μηδενικό δεσμό, που έρχεται σε αντίθεση με αυτήν @notice
και @param
σχόλια. Ένα μηδενικό ομόλογο αποδυναμώνει το κίνητρο έναντι άκυρων προτάσεων ή διαφωνιών.
Ευτυχώς, το καλέστε μόνο σε αυτή τη λειτουργία στη βάση κώδικα ορίζει έναν δεσμό προτάτη. Ωστόσο, εξετάστε το ενδεχόμενο να χρησιμοποιήσετε την τελική αμοιβή εάν το ομόλογο δεν προσδιορίζεται.
Ενημέρωση: Διορθώθηκε από την δέσμευση daaabfc342ba1395a577159b6eb26adb20fcd232
in PR3534.
[M06] Περιττά δικαιώματα διαχειριστή
Η BridgePool
σύμβαση κληρονομεί από ExpandedERC20
ώστε να μπορεί να εκδίδει μάρκες LP σε παρόχους ρευστότητας. Αυτό κληρονομεί τη λειτουργικότητα του OpenZeppelin ERC20
σύμβαση και επίσης παρέχει δικαιώματα διαχειριστή στον προγραμματιστή συμβολαίου, που τους επιτρέπει να κόβουν και να καίνε μάρκες LP. Ωστόσο, αυτή η εξουσία δεν απαιτείται και, εάν ασκηθεί, θα μπορούσε να τιμωρήσει άδικα τους παρόχους ρευστότητας.
Εξετάστε το ενδεχόμενο τροποποίησης BridgePool
να κληρονομήσει απευθείας από ERC20
αντί του ExpandedERC20
.
Ενημέρωση: Διορθώθηκε σε δέσμευση 370e8b21b660543eadbd764fed984a5bdeddce24
in PR3492.
Χαμηλή σοβαρότητα
[L01] Δεν μπορεί να διευθετηθεί κατά τη λήξη
Η settle
λειτουργία του LongShortPair
σύμβαση εξετάζει τους όρους διακανονισμού όταν η τρέχουσα ώρα είναι αυστηρά πριν ή μετά τη χρονική σήμανση λήξης. Ωστόσο, επανέρχεται εσφαλμένα όταν η τρέχουσα ώρα ταιριάζει με τη χρονική σήμανση λήξης.
Εξετάστε το ενδεχόμενο να χρησιμοποιήσετε ένα δεσμευμένο χωρίς αποκλεισμούς για να ταιριάζει με το postExpiration
αλλαγή.
Ενημέρωση: Διορθώθηκε σε δέσμευση f03cdaa50b16d29e8f42f000bf7cd50a042cf616
in PR3527.
[L02] Λείπει το μήνυμα σφάλματος στη δήλωση απαίτησης
Υπάρχει μια δήλωση απαίτησης στο BridgePool
σύμβαση χωρίς μήνυμα σφάλματος.
Εξετάστε το ενδεχόμενο να συμπεριλάβετε συγκεκριμένα και ενημερωτικά μηνύματα σφάλματος σε όλες τις απαιτούμενες δηλώσεις.
Ενημέρωση: Διορθώθηκε από την δέσμευση 67e60faa3a44c842c37211d2e903a983ff192e57
in PR3536.
[L03] Λείπουν συμβολοσειρές εγγράφων
Υπάρχουν ορισμένες περιπτώσεις σε όλη τη βάση κώδικα όπου το Φυσικές προδιαγραφές Ethereum λείπει ή είναι ελλιπής. Τα παραδείγματα περιλαμβάνουν:
Εξετάστε το ενδεχόμενο να τεκμηριώσετε διεξοδικά όλες τις λειτουργίες (και τις παραμέτρους τους) που αποτελούν μέρος του δημόσιου API των συμβάσεων.
Ενημέρωση: Τα επισημασμένα σχόλια διορθώθηκαν στο commit e943e85a7dae60acd17a6d6aa027fbb1017c95ee
of PR3533. Δεν επικυρώσαμε την πληρότητα του NatSpec στην υπόλοιπη βάση κώδικα.
Σημειώσεις και πρόσθετες πληροφορίες
[N01] Η τιμή επιστροφής κλήσης δεν έχει επιλεγεί
Στο deposit
λειτουργία του L2 BridgeDepositBox
σύμβαση υπάρχει μια κλήση χαμηλού επιπέδου προς το l2Token
όταν η l1Token
is l1Weth
. Αυτή η κλήση χαμηλού επιπέδου είναι προς το deposit()
λειτουργία, η οποία ανήκει στο WETH διεπαφή. Εάν αυτό l2Token
συμπεριφέρεται ακριβώς όπως το WETH δεν πρέπει ποτέ να αποτύχει. Αλλά στην περίπτωση του l2Token
συμπεριφέρεται διαφορετικά και αποτυγχάνει, δεν θα υπάρξει επαναφορά αφού η σημαία επιτυχίας αυτής της κλήσης χαμηλού επιπέδου δεν ελέγχεται ποτέ.
Εξετάστε το ενδεχόμενο να ελέγξετε και να αντιδράσετε κατάλληλα στις τιμές επιστροφής όλων των κλήσεων χαμηλού επιπέδου.
[N02] Έλλειψη ευρετηριασμένων παραμέτρων στα συμβάντα
Πολλά από τα συμβάντα που ορίζονται σε αυτήν τη βάση κώδικα έχουν παραμέτρους που πρέπει να ευρετηριαστούν:
Εξετάστε ευρετηρίαση παραμέτρων συμβάντων για να αποφευχθεί η παρεμπόδιση του έργου της αναζήτησης και φιλτραρίσματος υπηρεσιών εκτός αλυσίδας για συγκεκριμένα συμβάντα.
Ενημέρωση: Μερικώς διορθωμένο σε δέσμευση d156b40b2ddb109806336c4d169dbdea91ed1c3e
of PR3535. ο chainId
παράμετρος του WhitelistToken
δεν ενημερώθηκε.
[N03] Ασυνέπεια σιωπηρής χύτευσης
Η LongShortPair
σύμβαση γενικά αντιμετωπίζει τις χρονικές σημάνσεις ως uint64
αξιών, τα οποία απορρίπτονται σιωπηρά σε uint256
τιμές όταν πέρασε στο Αισιόδοξο Μαντείο. Ωστόσο, το requestTimestamp
παράμετρος του ο _requestOraclePrice
λειτουργία χυτεύεται πρόωρα σε α uint256
. Αυτό δεν έχει λειτουργικές συνέπειες.
Ωστόσο, για λόγους συνέπειας, εξετάστε το ενδεχόμενο να χρησιμοποιήσετε α uint64
για αυτήν την παράμετρο και επιτρέποντάς της να μεταδοθεί σιωπηρά στο a uint256
όταν πέρασε στο Αισιόδοξο Μαντείο.
Ενημέρωση: Διορθώθηκε σε δέσμευση 1c3c5c000ef450f5e2da056e41caff468c3fcdcb
of PR3528. Η χρονική σήμανση έχει πλέον χυθεί ρητά.
[N04] Λανθασμένος τύπος
Η sendMessage
λειτουργία του iOptimism_CrossDomainMessenger
διεπαφή χρησιμοποιεί a uint256
όριο αερίου ενώ της Αισιοδοξίας OVM_CrossDomainEnabled
χρησιμοποιεί a uint32
όριο αερίου.
Για συνέπεια και προβλεψιμότητα, εξετάστε το ενδεχόμενο να ενημερώσετε το iOptimisim_CrossDomainMessenger
sendMessage
λειτουργία προς χρήση α uint32
όριο αερίου.
Ενημέρωση: Διορθώθηκε από την δέσμευση 381951aad988bbba6b2ef1b136ed5c48df50aa88
in PR3460.
[N05] Έλλειψη επικύρωσης
Όλες οι λειτουργίες σε BridgeAdmin
αυτή η κλήση _relayMessage
ας υποθέσουμε ότι η αξία συναλλαγής ταιριάζει με το l1CallValue
παράμετρο, αλλά αυτό δεν επιβάλλεται.
Εξετάστε το ενδεχόμενο να διασφαλίσετε το σωστό msg.value
έχει ρυθμιστεί.
Ενημέρωση: Διορθώθηκε από την δέσμευση f19b8d04c2343051ff2a8145abd41c39bd025063
in PR3537.
[N06] Αναγνωσιμότητα
Η _getDepositHash
λειτουργία του BridgePool
συμβόλαιο ξετυλίγει το depositData
struct to interstice το l1Token
ως επιχείρημα στη σύνθεση του keccak256
με abi
κωδικοποίηση. Αυτό καθιστά τη λειτουργία άσκοπα περίπλοκη και μπορεί να οδηγήσει σε σφάλματα όταν επαναδημιουργηθεί σε άλλα επίπεδα.
Εξετάστε το ενδεχόμενο να απλοποιήσετε τα ορίσματα ώστε να είναι απλώς το διατεταγμένο ζεύγος depositData
και l1Token
.
Ενημέρωση: Διορθώθηκε από την δέσμευση 31754be4a818109fa12131f854c3f70d6c72dba7
in PR3538.
[N07] Λειτουργία επανεισόδου
Η requestAndProposePriceFor
λειτουργία του SkinnyOptimisticOracle
συμβόλαιο κάνει μια κλήση σε έναν μη αξιόπιστο msg.sender
αλλά δεν φυλάσσεται από α nonReentrant
τροποποιητής. Ενώ, σε αυτήν την περίπτωση, αυτό δεν φαίνεται να αποτελεί ανησυχία για την ασφάλεια, αυτό μπορεί να προκαλέσει απροσδόκητη συμπεριφορά.
Σκεφτείτε να προσθέσετε το nonReentrant
τροποποιητής σε όλες τις λειτουργίες που πραγματοποιούν κλήσεις σε πιθανώς μη αξιόπιστα συμβόλαια.
Ενημέρωση: Διορθώθηκε σε δέσμευση b744d24e7579b7afa2c778f4dd680f26117b3990
of PR3539.
[N08] seqNum
δεν έχει καταγραφεί
Η relayMessage
λειτουργία του Arbitrum_Messenger
σύμβαση δεν εκπέμπει σχετικό συμβάν μετά την εκτέλεση μιας ευαίσθητης ενέργειας. ο relayMessage
κλήσεις συναρτήσεων ως υπορουτίνα sentTxToL2NoAliasing
η οποία η ίδια επιστρέφει το uint256
αξία seqNum
, αλλά αυτή η τιμή επιστροφής δεν καταγράφεται στο relayMessage
λειτουργία.
Εξετάστε το ενδεχόμενο εκπομπής συμβάντων μετά την πραγματοποίηση ευαίσθητων αλλαγών, για να διευκολυνθεί η παρακολούθηση και να ειδοποιηθούν οι πελάτες εκτός αλυσίδας μετά τη δραστηριότητα της σύμβασης.
Ενημέρωση: Διορθώθηκε από την δέσμευση 30343f33532a6c255dc4cc18c3b497d9b2767a7c
in PR3541.
[N09] Τυπογραφικά λάθη
Η βάση κώδικα περιέχει τα ακόλουθα τυπογραφικά λάθη:
Εξετάστε το ενδεχόμενο να διορθώσετε αυτά τα τυπογραφικά λάθη για να βελτιώσετε την αναγνωσιμότητα του κώδικα.
Ενημέρωση: Διορθώθηκε από την δέσμευση 2dccbe1c2c82fe2a21c179ac06c2d4f0d911a2ca
in PR3540.
[N10] Απαίτηση έγκρισης ERC20 χωρίς έγγραφα
Η requestEarlyExpiration
και expire
λειτουργίες του LongShortPair
κάθε σύμβαση υποθέτει ότι ο καλών έχει χορηγήσει στη σύμβαση ένα επίδομα τραβήξτε την ανταμοιβή του προτείνοντα.
Για λόγους προβλεψιμότητας, εξετάστε το ενδεχόμενο τεκμηρίωσης αυτής της απαίτησης στα σχόλια συνάρτησης.
Ενημέρωση: Διορθώθηκε σε δέσμευση da3754f50284480df57b90b80002da06a1ce0d02
in PR3529.
[N11] Μη χρησιμοποιημένος τροποποιητής
Στο BridgePool
σύμβαση, το onlyFromOptimisticOracle
αλλαγή ορίζεται αλλά δεν χρησιμοποιείται ποτέ στη βάση κωδικών και επομένως πρέπει να αφαιρεθεί.
Ενημέρωση: Διορθώθηκε σε δέσμευση 7abece6377637e8c4cd3bd07ab9adcfa051d4e94
in PR3542.
συμπεράσματα
Βρέθηκαν 2 κρίσιμα και 1 θέματα υψηλής σοβαρότητας. Ορισμένες αλλαγές προτάθηκαν για να ακολουθηθούν οι βέλτιστες πρακτικές και να μειωθεί η πιθανή επιφάνεια επίθεσης.
- &
- 7
- Λογαριασμός
- Ενέργειες
- ενεργός
- Ad
- Πρόσθετος
- διεύθυνση
- διαχειριστής
- Πλεονέκτημα
- Όλα
- Επιτρέποντας
- api
- επιχειρήματα
- έλεγχος
- διαθεσιμότητα
- είναι
- ΚΑΛΎΤΕΡΟΣ
- βέλτιστες πρακτικές
- blockchain
- Κουτί
- ΓΕΦΥΡΑ
- Έντομο
- σφάλματα
- κλήση
- περιπτώσεις
- αλιεύονται
- Αιτία
- πρόκληση
- αλλαγή
- έλεγχος
- κωδικός
- σχόλια
- διαμόρφωση
- Περιέχει
- σύμβαση
- συμβάσεις
- θα μπορούσε να
- Ρεύμα
- ημερομηνία
- Αποκεντρωμένη
- delay
- Υπηρεσίες
- καθορίζοντας
- DID
- Διαμάχη
- Όχι
- Νωρίς
- Οικονομικός
- άκρη
- Αποτελεσματικός
- ERC20
- ETH
- ethereum
- Εγκάρσια αλυσίδα
- Συμβάν
- εκδηλώσεις
- παράδειγμα
- ανταλλαγή
- αναμένεται
- εμπειρία
- Χαρακτηριστικό
- Τελη Εγγραφης
- οικονομικός
- Όνομα
- σταθερός
- φλας
- ακολουθήστε
- Βρέθηκαν
- λειτουργία
- κεφάλαιο
- χρήματα
- μελλοντικός
- GAS
- τέλη αερίου
- Δίνοντας
- διακυβέρνησης
- ευτυχισμένος
- που έχει
- εδώ
- Ψηλά
- Τόνισε
- Οι κάτοχοι
- Πως
- HTTPS
- κίνητρα
- περιλαμβάνονται
- Συμπεριλαμβανομένου
- Αυξάνουν
- πληροφορίες
- τόκος
- περιβάλλον λειτουργίας
- θέματα
- IT
- γνωστός
- οδηγήσει
- Βιβλιοθήκη
- Υγρό
- Ρευστότητα
- πάροχοι ρευστότητας
- Λιστα
- Δάνεια
- τοπικά
- κλειδωμένη
- LP
- LP
- αγορά
- Ταίριασμα
- πλέον
- ανοίξτε
- μαντείο
- ΑΛΛΑ
- πλατφόρμες
- πισίνα
- Πισίνες
- δύναμη
- πρόληψη
- τιμή
- διαδικασια μας
- πρόταση
- παρέχουν
- παρέχει
- δημόσιο
- λόγους
- μείωση
- Εκθέσεις
- ΠΕΡΙΦΕΡΕΙΑ
- Αποτελέσματα
- Επιστροφές
- ανασκόπηση
- Κίνδυνος
- ασφάλεια
- Υπηρεσίες
- σειρά
- επίλυση
- Κοντά
- σημαντικός
- παρόμοιες
- small
- So
- στερεότητα
- Κάποιος
- κάτι
- ταχύτητα
- δαπανήσει
- Κατάσταση
- Δήλωση
- χώρος στο δίσκο
- επιτυχία
- υποστηριζόνται!
- Επιφάνεια
- σύστημα
- δοκιμή
- Μέσω
- παντού
- ώρα
- ένδειξη
- κουπόνια
- κορυφή
- Παρακολούθηση
- συναλλαγή
- Συναλλαγές
- Εμπιστευθείτε
- Ενημέρωση
- ενημερώσεις
- UPS
- Χρήστες
- αξία
- Δες
- whitelist
- Ο ΟΠΟΊΟΣ
- εντός
- χωρίς
- Εργασία
- αξία
- μηδέν