Аудит вне рамок - 6
Отличный пример, когда деление и умножение может привести к багу в расчетах, как это было в протоколе Ajna.
Все мы привыкли к стандартным математическим функциям со знаками -, +, *, /. Также мы уже знаем, что деление перед умножением может привести к ошибке практически в каждом случае. Однако, есть не совсем очевидные моменты с математическими операциями.
Обращаем внимание при аудите
Даже с использованием безопасных библиотек, типа SafeMath, не стоит полагаться, что разработчики будут избавлены от логических недочетов.
Деление, в некоторых случаях, может выполняться перед умножением, даже, если функции умножения идут впереди. Сложно представить? Посмотрите на пример ниже:
newRewards_ = Maths.wmul(
REWARD_FACTOR,
Maths.wmul(
Maths.wdiv (
interestEarned_, totalInterestEarnedInPeriod
), totalBurnedInPeriod
)
);
Сначала будет выполнено деление, а уже после умножение. В данном протоколе это приводило к тому, что пользователь мог не получить свою награду.
#audit #outofbox
Post #735
442
- ❤ 2
- 👍 2