https://www.youtube.com/watch?v=4Mm3BCyHtDY&list=PLO5VPQH6OWdWsCgXJT9UuzgbC8SPvTRi5
5ый урок безопасность и web3
Часто смарт-контракты работают с большими деньгами. А значит требования к безопасности в этой области высокие.
Поэтому неотъемлемой частью разработки смарт-контракта является тестирование. В этой статье мы узнаем основные термины, которые потребуются в дальнейшем. А также познакомимся с атакой re-entrancy attacks.
Способы выявления проблем в контрактах
Перечислим основные способы с помощью которых выявляют проблемы в контрактах. Но сначала запомним один широко-используемый жаргон — продакшен или продуктив — реальная среда в которой должен работать контракт.
Тесты
— Юнит-тесты или модульное тестирование — тестирования отдельных частей контракта. Мы под этим термином будем в основном понимать тест отдельной функции контракта
— Регрессионное тестирование — запуск тех же тестов на уже протестированном ранне коде, после того как код был изменен. Мы будем под этим понимать повторный запуск тестов после изменений.
— Интеграционные тесты — тесты на взаимодействие модулей и системы в целом. Мы будем под этим термином будем понимать тестирование на взаимодействие контрактов.
— Формальное тестирование — тестирование на смарт-контракта на соответсвие документации
Аудит
- Аудит сторонним разработчиком. Помимо основного разработчика контракт провреяется еще и разработчиком аудитором.
- Баг-баунти — схема при которой код выкладывается в git-репозиторий и всех желающих приглашают за вознаграждение (обычно токенами) найти ошибки.
Предлагаемая система тестиорвания
- Remix — ранние тесты, выявление мелких ошибок.
Можно тестировать независимые части контрактов. Проверять компилируется ли контракт вообще. Полезно для раннего unit-тестирования. Зависимые контракты и межконтрактные взаимодействия на данный момент в Remix тестировать нельзя (не работает at address).
- Написание критических тестов на truffle и последующее тестирование
Очень полезный этап. В серьезных проектах ему уделяется большое внимание. На truffle можно писать как юнит-тесты так и проводить полноценное интеграционное тестирование с реальными параметрами из продакшен среды.
Основные полюсы:
- Возможность «перемтоки» времени
- Возможность протестировать продакшен конфигурацию
- Возможность быстро провести регрессионное тестирование
Часто, уже на этапе написания тестов выявляются серьезные ошибки.
- Тестирование в тестовой сети
Наиболее распространенный способ. Контракты или отдельный контракт загружается в одну из тестовых сетей. Контракту устанавливают тестовые параметры, отличные от продуктива. А затем в ручную, избирательно тестируют основные активности.
- Изменения если необходимо
- Регрессионное тестирование
- Аудит кода
- Баг-баунти
re-entrancy attacks