7 stycznia 2022 r.
Wprowadzenie
UMA to platforma, która umożliwia użytkownikom zawieranie umów finansowych o minimalnym zaufaniu na blockchainie Ethereum. Już wcześniej sprawdzaliśmy zdecentralizowaną wyrocznię, konkretny wzór umowy finansowej, niektóre żądania ściągnięcia ad hoc, szablon Wieczystej Wielopartyjności, różne przyrostowe żądania ściągnięcia w trakcie dłuższego zaangażowania i ubezpieczony most.
Podczas tej kontroli dokonaliśmy przeglądu nowej umowy dotyczącej propozycji zarządzania, mechanizmu rozszerzania ekosystemu UMA na wiele łańcuchów, mechanizmu dystrybucji nagród wśród posiadaczy tokenów ERC721 zgodnie ze specyfikacją poza łańcuchem oraz aktualizacji ubezpieczonego mostu w celu obsługi WETH w łańcuchu optymizmu.
Sprawdzone zatwierdzenie to 0c4cea3c3d5e48da6f8984b8ba3afdfea4ce47cc
a zakres obejmuje następujące umowy:
oracle/implementation/Proposer.sol
cross-chain-oracle/*
(z wyłączeniem umów testowych i wielokątnych)financial-templates/optimistic-rewarder/*
(z wyłączeniem umów testowych)
Sprawdziliśmy także zmiany w plikach solidności w Wyciągnij żądanie 3611.
Założono, że wszystkie zależności kodu zewnętrznego i kontraktu działają zgodnie z dokumentacją.
Przegląd systemu
Prąd Governance
Umowa pozwala Fundacji Risk Labs zaproponować nowe działania zarządcze, które mogą zostać ratyfikowane przez posiadaczy tokenów UMA. Nowa Proposer
Umowa ma na celu przyjąć rolę oferenta, umożliwiając każdemu składanie nowych propozycji, o ile zapewniają one gwarancję, która zostanie poświęcona w przypadku niepowodzenia propozycji. Nie ma szczególnej zachęty do składania wniosków. Celem jest zapewnienie, że zaproponowane zostaną jedynie te działania, które z dużym prawdopodobieństwem zostaną zaakceptowane.
Nowy mechanizm międzyłańcuchowy umożliwia przekazywanie propozycji zarządzania z głównej sieci Ethereum do łańcuchów Optimism i Arbitrum. W ten sposób mechanizm zarządzania UMA w warstwie 1 może być używany do zarządzania kontraktami UMA w obsługiwanych łańcuchach warstwy 2. Mechanizm umożliwia także przekazywanie żądań cenowych i rozwiązań między warstwami, zatem optymistyczne wyrocznie w łańcuchach warstwy 2 mogą być zabezpieczone przez mechanizm weryfikacji danych sieci głównej w taki sam sposób, w jaki optymistyczna wyrocznia warstwy 1 jest zabezpieczona przez DVM.
Warto zauważyć, że komunikaty te są wysyłane przy użyciu natywnej mechaniki mostu, co oznacza, że są one ograniczone charakterystyką odpowiednich łańcuchów warstwy 2. W szczególności przesłanie komunikatów z warstwy 2 do warstwy 1 przez most może zająć tydzień lub dłużej. Co więcej, mechanizm zarządzania UMA obsługuje propozycje obejmujące wiele uporządkowanych transakcji, ale ogranicza to jedynie kolejność, w jakiej można je dodawać do mostu. Możliwe jest, że niektóre z tych transakcji zostaną wykonane w innej kolejności lub w ogóle nie zostaną wykonane w warstwie 2.
Umowa Optimistic Rewarder po prostu wybija tokeny ERC721 każdemu, kto o nie poprosi. Pozwala także każdemu powiązać dowolne dane z dowolnym tokenem i zdeponować różne tokeny ERC20 w celu dystrybucji jako nagrody. Interpretacja dowolnych danych i oczekiwany podział nagród wśród posiadaczy tokenów są ustalane przy użyciu nieokreślonej procedury poza łańcuchem. Każdy może twierdzić, że konkretny token ERC721 jest mu należny zestaw nagród, jeśli chce zdeponować kaucję. Standardowy mechanizm Optimistic Oracle umożliwia innej osobie zakwestionowanie roszczenia, które zostanie rozpatrzone przez DVM. Roszczenia, które nie zostaną zakwestionowane w terminie, uznaje się za uzasadnione i zgodnie z umową następuje podział nagród. Jedynym ograniczeniem (w celu uproszczenia księgowości) jest to, że żeton obligacji wyroczni nie może być używany jako żeton nagrody.
Na koniec PR3611 modyfikuje mechanizm ubezpieczonego mostu, aby uniknąć wysyłania WETH przez most tokenu optymizmu, który nie jest obsługiwany. Zamiast tego każdy L2 WETH zdeponowany w skrzynce depozytowej Optimism jest rozpakowywany do L2 ETH przed przejściem przez most. W warstwie 1 ETH jest konwertowany na WETH przed przesłaniem do puli mostów WETH.
Krytyczna dotkliwość
[C01] Nie można zakwestionować nieprawidłowej nagrody
W przypadku kwestionowania prośby o nagrodę OptimisticRewardBase
najpierw umowa wywołuje propozycję na SkinnyOptimisticOracle
, a następnie kwestionuje tę propozycję. Jednak propozycja ustawia czas ważności jako offset od czasu bieżącego (spornego), podczas gdy spór określa termin ważności jako przesunięcie w stosunku do czasu pierwotnego żądania nagrody. W większości przypadków ta rozbieżność uniemożliwi wyroczni zidentyfikowanie propozycji, która ma zostać zakwestionowana, co oznacza, że uzasadnione spory nie będą rozpatrywane, a nieważne prośby o nagrodę zostaną zaakceptowane.
Rozważ aktualizację zaproszenia do sporu, aby poprawnie określić propozycję, która ma zostać zakwestionowana.
aktualizacja: Naprawiono od momentu zatwierdzenia 9e15557
in PR3690.
[C02] Wielokrotnie rozstrzygaj propozycje
Połączenia resolveProposal
funkcja Proposer
umowa po prostu potwierdza że wyrocznia rozwiązała sprawę, ale nie sprawdza, czy kaucja została rozdzielona. Oznacza to, że tę samą propozycję można rozpatrywać wielokrotnie, co skutkuje podwójną płatnością obligacji. Rozważ oznaczenie lub usunięcie istniejących propozycji po ich rozwiązaniu.
aktualizacja: Naprawiono od momentu zatwierdzenia b152718
in PR3689.
Wysoka dotkliwość
Brak.
Średni stopień nasilenia
[M01] Nieprawidłowe parametry zdarzenia
Połączenia OptimisticRewarderBase
umowa określa a Requested
wydarzenie który jest emitowany z requestRedemption
pełnić funkcję w przypadku żądania wykupu. To zdarzenie jest zdefiniowane tak, aby emitować termin wygaśnięcia wykupu jako ostatni parametr. Jednakże, kiedy zdarzenie zostanie wyemitowane, jego ostatni parametr jest niepoprawnie ustawiony na Obecny czas.
Podobnie Redeemed
wydarzenie odczytuje czas wygaśnięcia po usunięciu rekordu, więc zostanie on błędnie ustawiony na zero.
Biorąc pod uwagę, że tego zdarzenia można użyć do uruchomienia obliczeń poza łańcuchem, należy rozważyć odpowiednią aktualizację emitowanej wartości.
aktualizacja: Naprawiono od momentu zatwierdzenia f04eef9
in PR3694.
Niska dotkliwość
[L01] Brak emisji zdarzenia po zakwestionowaniu wykupu
Połączenia OptimisticRewarderBase
umowa określa a Disputed
wydarzenie który ma zostać uruchomiony w przypadku kwestionowania wykupu. Jednak to zdarzenie nie jest emitowane ani wewnątrz ani na zewnątrz OptimisticRewarderBase
kontrakt.
Rozważ wyemitowanie zdarzenia po wprowadzeniu wrażliwych zmian w pliku dispute
funkcjonować, aby ułatwić śledzenie i powiadamianie klientów spoza łańcucha o aktywności związanej z umowami.
aktualizacja: Naprawiono od momentu zatwierdzenia c275e92
in PR3695.
[L02] Niespójny strażnik ponownego wejścia
Połączenia Optimism_ParentMessenger
i Arbitrum_ParentMessenger
umowy niekonsekwentnie stosują ww nonReentrant
modyfikator. Rozważ włączenie go do wszystkich funkcji publicznych.
aktualizacja: Naprawiono od momentu zatwierdzenia 6275c39
in PR3677.
[L03] Wprowadzające w błąd komentarze
Oto kilka wprowadzających w błąd komentarzy, które znaleźliśmy podczas naszej recenzji:
ChildMessengerConsumerInterface.sol
:- linia 5 mówi „posłaniec rodzica” zamiast „posłaniec dziecka”
GovernorSpoke.sol
:- Linie 49-51 linki do
Gnosis
plik, mimo że komentarz mówi, że fragment został skopiowanyGovernor.sol
. Dodatkowo fragment nie jest identyczny z tym wGovernor.sol
- Linie 49-51 linki do
aktualizacja: Naprawiono od momentu zatwierdzenia cc350f9
in PR3678.
[L04] Brak dodatkowego stempla danych
Pytając o cenę na OracleSpoke
umowy, podanych danych pomocniczych jest ostemplowany z identyfikatorem łańcucha podrzędnego. Jednakże hasPrice
i getPrice
funkcje nie stemplują danych pomocniczych podczas identyfikacji zapytania cenowego. Zmusza to zamawiających do samodzielnego nałożenia stempla, co powoduje niespójność pomiędzy mechanizmami zapytania o cenę a mechanizmami wyszukiwania ceny. Rozważ nałożenie stempla w hasPrice
i getPrice
funkcje.
aktualizacja: Naprawiono od momentu zatwierdzenia fdb845d
in PR3668.
[L05] Brak parametru NatSpec
Wiele funkcji w OptimisticRewarderBase
umowa brakuje im @return
parametr w swoich komentarzach dotyczących specyfikacji naturalnej. Rozważ uwzględnienie go w celu zapewnienia kompletności.
aktualizacja: Naprawiono od momentu zatwierdzenia 8920f38
in PR3679.
[L06] Zasiłek rezydualny
Aby przywołać Optymistyczną Wyrocznię, OptimisticRewarderBase
umowa przyznaje mu symboliczny dodatek, więc może zaciągnąć spłatę obligacji. Jeżeli propozycja nie powiedzie się, realizacja nagrody zostaje anulowana ale zasiłek nie jest resetowany. Dlatego też Optymistyczna Wyrocznia zachowa niepotrzebny dodatek rezydualny do następnego uruchomienia sporu. Rozważ cofnięcie dodatku, jeśli propozycja nie powiedzie się.
aktualizacja: Naprawiono od momentu zatwierdzenia c2d444b
in PR3698.
[L07] Nieprawidłowy adres zwrotu
Adres L2 zwrotu środków Arbitrum_ParentMessenger
jest inicjowany właścicielowi kontraktu, którym powinien być gubernator L1. Podobnie, setRefundL2Address
ma komentarz stwierdzając, że należy to przekazać gubernatorowi. Jednak podczas przesyłania wiadomości przez most ta wartość wynosi ustawiony jako użytkownik L2, czyli adres na Arbitrum, na który otrzymają nadwyżki środków po rozpatrzeniu zgłoszenia. Ponieważ adres gubernatora L1 nie będzie dostępny na Arbitrum, wszelkie środki wysłane na ten adres zostaną utracone.
Rozważ ustawienie go na prawidłowy adres L2.
aktualizacja: Naprawiono od momentu zatwierdzenia b3f2dd1
in PR3687.
[L08] Mechanizm zmiany komunikatorów dziecięcych
Połączenia GovernorSpoke
i OracleSpoke
kontrakt każdy inicjuje komunikator podrzędny w konstruktorze, bez mechanizmu umożliwiającego jego aktualizację. Oznacza to, że gdy Komunikator dziecięcy ulega zmianieumowy dotyczące obu szprych stają się przestarzałe.
Ponieważ kontrakty na szprychy są prawdopodobnie bardziej stabilne niż komunikatory, rozważ włączenie mechanizmu aktualizacji komunikatora na szprychach.
aktualizacja: Naprawiono od momentu zatwierdzenia 7c9e061
in PR3688.
Uwagi i dodatkowe informacje
[N01] Zmień token obligacji
Połączenia Proposer
umowa obejmuje mechanizm dla właściciela zmiany wielkości wadium. Zastanów się, czy oni również powinni mieć możliwość zmiany tokenu obligacji. Należy zauważyć, że wymagałoby to mechanizmu identyfikującego właściwą walutę obligacji po rozpatrzeniu istniejących propozycji.
aktualizacja: To nie jest problem. Oświadczenie UMA w tej sprawie:
N01 zaleca umożliwienie umowie oferenta zmiany tokena obligacji na inny niż UMA. Nie mamy zamiaru wspierać w tej funkcji żadnego tokena innego niż $UMA, dlatego postanowiliśmy nie wprowadzać żadnych zmian w tym przypadku. Co więcej, jeden token na umowę sprawia, że ta logika jest tak prosta, jak to tylko możliwe. Na koniec, jeśli konieczna była zmiana (na przykład w przypadku migracji tokena), moglibyśmy po prostu wdrożyć nową umowę z propozycją z drugim tokenem i zainicjować propozycję migracji systemu w celu użycia tego tokena.
[N02] Niekompletny interfejs
Połączenia ChildMessengerInterface
nie określa A processMessageFromCrossChainParent
nawet jeśli zakłada się, że istnieje przez posłańców nadrzędnych. Rozważ uwzględnienie go w celu zapewnienia kompletności.
aktualizacja: Nie naprawiony. Oświadczenie UMA w tej sprawie:
Celowo zdecydowaliśmy się pozostawić ten interfejs niespójny, ponieważ zaimplementowanie go w ChildMessengerInterface przerywa kompatybilność z Polygon_ChildMessenger, ponieważ metoda Polygon do przetwarzania komunikatów z innych łańcuchów wymaga nieco niestandardowej logiki, w której metoda wewnętrzna nazywa się _processMessageFromRoot.
[N03] Nieprawidłowy interfejs
Połączenia GovernorSpoke
błędnie zawrzeć umowę używa ChildMessengerConsumerInterface
rodzaj opisać to messenger
zmienny. Rozważ użycie ChildMessengerInterface
zamiast.
aktualizacja: Naprawiono od momentu zatwierdzenia f31a527
in PR3680.
[N04] Przeciągnij tokeny do sklepu
W poprzedni audyt kwestionowaliśmy cel Store
umowy payOracleFeesErc20
funkcjonować (w numerze L19). Zespół UMA zdecydował się zachować tę funkcję ujednolicić interfejs dla potencjalnych przyszłych modyfikacji. Ponieważ cel funkcji nie jest w pełni określony, nie jest jasne, czy powinna ona zostać wywołana, gdy Proposer
umowa konfiskuje obligacje. Prawdopodobnie należy go używać, gdy OracleHub
płaci za żądanie ceny. Zastanów się, czy tej funkcji należy użyć w którymkolwiek scenariuszu.
aktualizacja: Uznany. Oświadczenie UMA w tej sprawie:
N04 zaleca stosowanie dostępnej w Sklepie metody payOracleFeeErc20 w celu uiszczania opłat zarówno w umowie Oferenta, jak i OracleHub, aby zachować zgodność z korzystaniem ze Sklepu. Zdecydowaliśmy się nie używać tej funkcji, ponieważ oznaczałoby to konieczność zaimportowania dodatkowego interfejsu (dla sklepu) i wymagałoby rzutowania kwoty obligacji na FixPoint (co również wymagałoby dodatkowego importu. Aby kod był prosty i czysty zdecydowaliśmy się tego nie robić.Opinie OZ dotyczące payOracleFeeErc20 z pierwszej fazy audytu w kwietniu 1 r. potwierdziły, że ta metoda nie jest zbyt użyteczna, co utrudnia uzasadnienie tego rodzaju integracji.
[N05] TODO w kodzie
W bazie kodu znajdują się komentarze „TODO”, które należy śledzić w rejestrze zadań projektu. Na przykład:
- Linia 37 of
Arbitrum_ParentMessenger
umowa - Linia 25 of
Optimism_ChildMessenger
umowa - Kwestia 83 i 146 of
OracleHub
kontrakt.
Dobrze opisane komentarze „TODO” podczas programowania ułatwią proces ich śledzenia i rozwiązywania. Bez tych informacji komentarze te mogą ulec zniszczeniu, a informacje ważne dla bezpieczeństwa systemu mogą zostać zapomniane przed wprowadzeniem ich do środowiska produkcyjnego.
Komentarze TODO powinny zawierać krótki opis zadania oczekującego na wykonanie oraz link do odpowiedniego problemu w repozytorium projektu.
Rozważ aktualizację komentarzy TODO w celu dodania tych informacji. Aby zapewnić kompletność i identyfikowalność, można dodać podpis i znacznik czasu. Na przykład:
// TODO: point this at an interface instead.
// https://github.com/UMAprotocol/protocol/issues/XXXX
// --mrice32 - 20211209
aktualizacja: Naprawiono od momentu zatwierdzenia 5d57b5b
in PR3684.
[N06] Błędy typograficzne
Baza kodu zawiera następujące błędy typograficzne:
- W
Admin_ChildMessenger
kontrakt,impleenting
powinno byćimplementing
- W
OptimisticRewarderBase
kontrakt,timestap
powinno byćtimestamp
. - W
OptimisticRewarderBase
kontrakt,liveness liveness
powinno byćliveness
. - W
GovernorSpoke
kontrakt,only called
powinno byćonly be called
. - W
Optimism_ChildMessenger
kontrakt:
aktualizacja: Naprawiono od momentu zatwierdzenia 9b92b0b
in PR3681.
[N07] Niewykorzystany import
Aby poprawić czytelność kodu, rozważ usunięcie następujących nieużywanych importów:
aktualizacja: Naprawiono od momentu zatwierdzenia 40b7221
in PR3682.
[N08] Zlecenie transakcji L2
Połączenia Governor
zapewnia transakcje w ramach oferty realizowane są w kolejności. Jeżeli jednak transakcje te obejmują transakcje międzyłańcuchowe, gwarantuje to jedynie, że dotrą do kontraktu pomostowego L1 we właściwej kolejności. W przypadku Arbitrum można je ponownie uporządkować, zanim zostaną sfinalizowane na L2. Dlatego też propozycje zarządzania powinny być tak skonstruowane, aby dopuszczały możliwość zmiany kolejności transakcji L2.
aktualizacja: Naprawiono od momentu zatwierdzenia 0fb2e7b
in PR3703, GovernorHub
może teraz przekazywać szereg transakcji L2.
Wnioski
W kodzie znaleziono dwa krytyczne problemy. Znaleziono jeden problem o średniej wadze i kilka mniejszych luk, po czym zasugerowano zalecenia dotyczące poprawek.
- &
- 2020
- 7
- 9
- O nas
- Księgowość
- w poprzek
- działania
- Ad
- Dodatkowy
- adres
- Wszystkie kategorie
- Pozwalać
- kwiecień
- Audyt
- jest
- blockchain
- Pudełko
- BRIDGE
- Etui
- zmiana
- dziecko
- roszczenia
- kod
- komentarze
- zawiera
- umowa
- umowy
- mógłby
- Łańcuch krzyżowy
- Waluta
- Aktualny
- dane
- Zdecentralizowane
- oprogramowania
- różne
- Spierać się
- dystrybuowane
- Ekosystem
- emisja
- umożliwiając
- ERC20
- ETH.
- ethereum
- Ethereum blockchain
- wydarzenie
- przykład
- spodziewany
- rozciągać się
- Opłaty
- budżetowy
- i terminów, a
- znaleziono
- Fundacja
- funkcjonować
- fundusze
- przyszłość
- zarządzanie
- Gubernator
- mający
- posiadacze
- HTTPS
- zidentyfikować
- ważny
- Włącznie z
- Informacja
- integracja
- Interfejs
- problemy
- IT
- Labs
- Ograniczony
- LINK
- długo
- Dokonywanie
- średni
- Messenger
- większość
- offset
- wyrocznia
- zamówienie
- Inne
- właściciel
- płatności
- faza
- Platforma
- Wielokąt
- basen
- Cena
- wygląda tak
- Produkcja
- projekt
- wniosek
- zaproponować
- zapewniać
- publiczny
- rekord
- składnica
- przeglądu
- Nagrody
- Ryzyko
- bezpieczeństwo
- zestaw
- ustawienie
- Prosty
- Rozmiar
- So
- solidność
- Ktoś
- coś
- Zestawienie sprzedaży
- sklep
- wsparcie
- Utrzymany
- podpory
- system
- test
- czas
- żeton
- Żetony
- Możliwość śledzenia
- Śledzenie
- transakcja
- transakcje
- tranzyt
- Aktualizacja
- Użytkownicy
- wartość
- Weryfikacja
- Luki w zabezpieczeniach
- tydzień
- KIM
- w ciągu
- bez
- Praca
- wartość
- zero