Инструменты и проверка
Remix, Hardhat, Foundry, OpenZeppelin, модульные тесты, fuzzing, инварианты и проверка исходников.
Материалы
- Тестирование смарт-контрактов: Foundry, fuzzing и безопасность
Как превратить требования к контракту в проверки, различать unit, fuzz и invariant tests, работать с моделью атак и оценивать границы результата.
- Foundry: проверяемая локальная лаборатория
Тридцать уроков о локальной лаборатории Solidity: unit, fuzz, инварианты, handler, внешние ответы, снимки и происхождение артефакта.
- Foundry: структура проекта и профиль лаборатории
Создаём понятную структуру локальной лаборатории и фиксируем компилятор, библиотеку проверок и настройки EVM.
- Тестирование Solidity в Foundry: требования к реестру
Описываем разрешённые действия издателя и превращаем модель реестра в конкретные ожидания для будущих проверок.
- Foundry setUp: исходное состояние теста
Создаём независимую фикстуру CourseCatalog и отделяем общее исходное состояние от действий конкретного сценария.
- Foundry: assertions и проверка пустой записи
Читаем поля отсутствующего курса и выбираем точные утверждения вместо слишком общего признака успеха.
- Foundry prank: смена отправителя вызова
Задаём учебного отправителя одного вызова или последовательности и проверяем права реестра в явном контексте.
- Foundry expectRevert: проверка отката и ошибки
Проверяем запрет записи читателю и выбираем конкретную ошибку, чтобы случайный отказ не подменил требование.
- Foundry expectEmit: проверка событий контракта
Сравниваем событие публикации с ожидаемым журналом: адрес реестра, номер курса и отпечаток выпуска.
- Foundry: тест создания экземпляра контракта
Отделяем параметры конструктора от роли отправителя и проверяем нулевой адрес издателя и два независимых реестра.
- Foundry: тесты публикации, замены и деактивации
Развиваем один сценарий жизненного цикла курса: новая запись, новый отпечаток, отключение и возвращение публикации.
- Foundry: граничные значения чисел и байтов
Выбираем граничные значения идентификатора и bytes32, проверяем разные причины отказа и сохраняем весь диапазон контракта.
- Fuzzing в Foundry: номер и хеш публикации
Пишем свойство публикации для сгенерированных параметров и отличаем его область от проверок жизненного цикла.
- Foundry: допущения и ограничение диапазона fuzzing
Выбираем между отбрасыванием и преобразованием fuzz-входа, чтобы ограничение области не скрывало ошибки реестра.
- Foundry: генерация отправителей вызова
Расширяем проверку полномочий на разные адреса, сохраняя известный выпуск после запрещённой публикации и отключения.
- Foundry: проверка байтов, кодирования и хеша
Отделяем хеш байтов файла от ABI-кодирования и CID, задаём воспроизводимую фикстуру учебного манифеста.
- Foundry: независимая модель ожидаемого результата
Строим ожидаемое состояние по входам и разрешённым действиям, не копируя ошибочную запись исследуемого реестра.
- Покрытие кода Solidity в Foundry: что показывает отчёт
Разделяем выполненные строки и проверенные требования, составляя карту покрытия для учебного реестра без выдуманных процентов.
- Invariant testing в Foundry: последовательности действий
Переходим от заранее заданной истории к stateful-проверкам и различаем устойчивое свойство состояния и отдельный переход.
- Foundry: выбор целей генератора инвариантных тестов
Задаём адрес, селекторы и отправителя invariant-кампании, сохраняя ясную границу выбранных действий.
- Foundry Handler: генерация действий публикации
Строим небольшую программу действий для invariant-кампании: ограниченные ключи, явный издатель и содержательные переходы.
- Foundry: проверка разрешённых и чужих действий
Добавляем в handler запрещённые попытки читателя, ожидаем точную ошибку и сравниваем запись до и после отказа.
- Ghost state в Foundry: модель ожидаемого выпуска
Храним независимый ожидаемый выпуск каждого наблюдаемого курса и сравниваем его с состоянием после действий handler.
- Foundry: откаты и полезная работа генератора
Настраиваем fail_on_revert и счётчики handler, чтобы пропущенные действия и неожиданные отказы не выглядели успешным исследованием.