Strata precyzji i exploity zaokrągleń

Kontrakty inteligentne nie potrzebują błędu w kontroli dostępu, aby tracić pieniądze.

Czasami exploit jest ukryty w zwykłym dzieleniu.

Finansowe kontrakty inteligentne używają arytmetyki całkowitoliczbowej. Ułamki są odrzucane. Kierunek tego zaokrąglenia decyduje o tym, kto otrzymuje wartość. Błąd rzędu jednej jednostki może powtarzać się w tysiącach transakcji.

W protokole finansowym zaokrąglanie jest polityką transferu wartości.

Każde dzielenie musi odpowiadać na trzy pytania:

  • W którą stronę zaokrągla obliczenie?
  • Która strona czerpie korzyści z tego kierunku?
  • Czy atakujący może powtórzyć lub wzmocnić tę korzyść?

Typowe błędy matematyczne obejmują:

  1. Zbyt wczesne dzielenie Jeśli dzielisz przed mnożeniem, tracisz precyzję. Przykład: (amount / 1e18) * rate. Pośrednie dzielenie odrzuca dane, zanim nastąpi mnożenie. Zasada: Zawsze najpierw mnoż, potem dziel.

  2. Przepełnienia pośrednie Mnożenie jako pierwsze może spowodować przepełnienie (overflow), nawet jeśli końcowy wynik mieści się w uint256. Użyj biblioteki takiej jak OpenZeppelin Math, aby wykonywać mnożenie i dzielenie z pełną precyzją w jednym kroku.

  3. Zaokrąglanie w niewłaściwym kierunku Zaokrąglanie to nie sugestia. To zasada bezpieczeństwa. Konserwatywny protokół stosuje następujące zasady:

  • Zaokrąglaj dług w górę.
  • Zaokrąglaj wymagane płatności w górę.
  • Zaokrąglaj wartość zabezpieczenia w dół.
  • Zaokrąglaj wypłacane użytkownikom aktywa w dół.
  • Zaokrąglaj pobierane od użytkowników udziały w górę.

Gdy dokładny wynik jest niemożliwy, zaokrąglaj na niekorzyść strony próbującej wyciągnąć wartość.

  1. Ataki inflacyjne W skarbcach o niskiej płynności atakujący mogą wykorzystywać darowizny do manipulowania kursami wymiany. Przekazują aktywa, aby zwiększyć całkowitą liczbę aktywów bez zwiększania liczby udziałów. Powoduje to, że nowe depozyty są zaokrąglane w dół do zera udziałów. Łagodzenie: Używaj wirtualnych aktywów lub udziałów, aby ustanowić stabilny kurs początkowy.

  2. At