TGViewer
Из Solidity в AI и дальше Из Solidity в AI и дальше @solidityset · 2.49K subscribers
Post #1448 776
Атака Denial-of-Service. Часть 5

Могут ли токены с низким количеством десятичных знаков (decimal) вызвать DoS?

Проблема: токены с низким decimals могут привести к проблемам с целочисленным делением, в результате чего происходит округление в меньшую сторону до нуля.

Представьте себе контракт потоковой передачи токенов (streaming contract), который распределяет токены в течение определенного периода времени. Если tokensPerSecond округляется до нуля из-за целочисленного деления с токенами с низким количеством десятичных знаков, функция распределения будет заблокирована.

Как предотвратить: реализуйте логику для обработки низких десятичных знаков, которая предотвращает сбой процесса транзакции из-за ошибок округления.

Пример:

Рассмотрим контракт TokenStream, который передает определенное количество токенов пользователям, где:

- total_tokens необходимо перевести в контракт;
- token_per_second может быть округлено до нуля, поскольку мы используем токен с 1 десятичным знаком;
- функция distributeTokens будет отменена.

contract TokenStream {
IERC20 public token;
uint256 public streamDuration;
uint256 public tokensPerSecond;

constructor(IERC20 _token, uint256 _streamDuration, uint256 _tokensPerSecond) {
token = _token;
streamDuration = _streamDuration;
tokensPerSecond = _tokensPerSecond;
}

function distributeTokens(address recipient) external {
uint256 balance = token.balanceOf(address(this));
uint256 amount = tokensPerSecond * streamDuration;

uint256 tokensToSend = amount > balance ? balance : amount;

require(tokensToSend > 0, "Insufficient tokens to stream");
token.transfer(recipient, tokensToSend);
}
}

contract LowDecimalToken is ERC20 {
constructor() ERC20("LowDecimalToken", "LDT") {
_mint(msg.sender, 100000 * (10 ** decimals()));
}

function decimals() public view virtual override returns (uint8) {
return 1; // Simulate a low decimal token
}
}


Тест testDOSWithLowDecimalTokens в TokenStreamTest в этом случае вернется к исходному состоянию.

‍Исправление: убедитесь, что контракт правильно обрабатывает токены с небольшими decimals, масштабируя математические формулы для смягчения округления целых чисел во время вычислений.

#dos #decimals
  • 👍 2
  • 🤔 2
More from @solidityset
  1. Sep 22, 2026Какой язык программирования учить сейчас? На днях в Твиттере увидел небольшой пост о разви…
  2. Sep 18, 2026Интересная модель Jev Буквально пару дней назад в Твиттере многие начали обсуждение новой…
  3. Sep 14, 2026Графы повсюду Если вы также следите за новостями в мире ИИ, то наверняка уже все чаще встр…
  4. Sep 10, 2026GTA6, Cyberleek, блокчейн и безопасность Увидел несколько постов (тут и тут) про Cyberleek…
  5. Sep 9, 2026Работа с чистой энергией Дисклеймер Сегодня ава и название канала, наконец, поменялись. Я…
  6. Sep 9, 2026Channel name was changed to «Из Solidity в AI и дальше»
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →