Инструменты безопасности: Slither, Mythril, Foundry
Машина находит то, что упускает уставший человек — и наоборот.
Статический анализ — проверка кода без его запуска: инструмент читает исходник/байт-код и ищет известные опасные паттерны. Фаззинг — запуск кода с тысячами случайных входов в поиске нарушений свойств.
Зачем инструменты, если есть аудит
Инструменты не заменяют мышление, но дёшево ловят целые классы типовых ошибок и расширяют покрытие до тысяч сценариев, которые человек руками не переберёт. Правильный процесс — многослойный: автоматические проверки на каждом коммите, потом ручной аудит для логических и экономических багов, которые машина не понимает.
Slither — статический анализатор
Slither быстро сканирует контракт и подсвечивает подозрительные места: возможную реентранси, использование tx.origin, незащищённые функции, опасные низкоуровневые вызовы, неинициализированные переменные. Запускается за секунды, идеален для CI.
# статический анализ контрактов проекта
slither .
# сфокусироваться на одном детекторе
slither . --detect reentrancy-ethMythril — символьное исполнение
Mythril идёт глубже: он «символически» прогоняет пути исполнения, подбирая входы, которые приводят к нарушению (например, к выводу средств или переполнению). Это мощнее статики, но медленнее и требует настройки.
# символьный анализ одного контракта
myth analyze contracts/Vault.solFoundry — тесты, фаззинг, форк
Foundry — быстрый набор для тестирования на самом Solidity. Помимо обычных юнит-тестов он даёт фаззинг (тест с параметром, который прогоняется на множестве случайных значений) и форк-тесты (тест на копии реального состояния сети). Фаззинг особенно ценен: он сам ищет вход, ломающий ваше свойство.
// Фаззинг-тест в Foundry: параметр перебирается автоматически
function testFuzz_depositNeverLosesFunds(uint96 amount) public {
vm.assume(amount > 0);
uint256 before = vault.totalAssets();
vault.deposit(amount);
// свойство, которое НЕ должно нарушаться ни при каком amount
assertGe(vault.totalAssets(), before);
}Как работает под капотом: слои проверки
Разумный конвейер: линтер + Slither на каждом коммите (быстро, ловит типовое) → юнит- и фаззинг-тесты Foundry (свойства и крайние случаи) → Mythril/символьное для критичных контрактов → ручной аудит для логики и экономики → опционально формальная верификация (математическое доказательство, что свойство выполняется всегда) для самых ответственных частей.
Частые ошибки
- Считать «зелёный» Slither гарантией. Он ловит типовое, но не понимает бизнес-логику.
- Только юнит-тесты «happy path». Без фаззинга крайние случаи остаются непокрытыми.
- Игнорировать предупреждения как «шум». Среди ложных срабатываний прячутся настоящие.
Итоги
- Инструменты дёшево ловят типовые баги и расширяют покрытие, но не заменяют аудит.
- Slither — быстрый статический анализ; Mythril — символьное исполнение.
- Foundry даёт юнит-тесты, фаззинг и форк-тесты; фаззинг сам ищет ломающий вход.
- Стройте многослойный конвейер вплоть до формальной верификации критичных частей.