Контрольный список безопасности смарт-контрактов
Контрольный список разработки смарт-контрактов
Вот высокоуровневый процесс, которому мы рекомендуем следовать при написании смарт-контрактов.
Проверьте наличие известных проблем с безопасностью:
- Проверьте свои контракты с помощью Слизера (открывается в новой вкладке). В нем есть более 40 встроенных детекторов распространенных уязвимостей. Запускайте его при каждом добавлении нового кода и убедитесь, что получаете чистый отчет (или используйте режим сортировки, чтобы скрыть определенные проблемы).
- Проверьте свои контракты с помощью Crytic (открывается в новой вкладке). Он проверяет 50 проблем, которые не обнаруживает Слизер. Crytic также может помочь вашей команде быть в курсе дел друг друга, легко выявляя проблемы безопасности в Pull Requests на GitHub.
Учитывайте особенности вашего контракта:
- Являются ли ваши контракты обновляемыми? Проверьте код обновления на наличие недостатков с помощью
slither-check-upgradeability(открывается в новой вкладке) или Crytic (открывается в новой вкладке). Мы задокументировали 17 способов, при которых обновления могут пойти не так. - Заявлено ли, что ваши контракты соответствуют стандартам ERC? Проверьте их с помощью
slither-check-erc(открывается в новой вкладке). Этот инструмент мгновенно выявляет отклонения от шести распространенных спецификаций. - Интегрируете ли вы сторонние токены? Изучите наш контрольный список интеграции токенов, прежде чем полагаться на внешние контракты.
Визуально проверьте критически важные функции безопасности вашего кода:
- Изучите принтер inheritance-graph (открывается в новой вкладке) Слизера. Избегайте непреднамеренного затенения и проблем с линеаризацией C3.
- Изучите принтер function-summary (открывается в новой вкладке) Слизера. Он сообщает о видимости функций и контроле доступа.
- Изучите принтер vars-and-auth (открывается в новой вкладке) Слизера. Он сообщает о контроле доступа к переменным состояния.
Задокументируйте критически важные свойства безопасности и используйте автоматические генераторы тестов для их оценки:
- Научитесь документировать свойства безопасности вашего кода. Сначала это сложно, но это самое важное действие для достижения хорошего результата. Это также является обязательным условием для использования любых продвинутых методов из этого руководства.
- Определите свойства безопасности в Solidity для использования с Эхидной (открывается в новой вкладке) и Мантикорой (открывается в новой вкладке). Сосредоточьтесь на вашей машине состояний, контроле доступа, арифметических операциях, внешних взаимодействиях и соответствии стандартам.
- Определите свойства безопасности с помощью Python API Слизера. Сосредоточьтесь на наследовании, зависимостях переменных, контроле доступа и других структурных проблемах.
- Запускайте тесты свойств при каждом коммите с помощью Crytic (открывается в новой вкладке). Crytic может принимать и оценивать тесты свойств безопасности, чтобы каждый в вашей команде мог легко увидеть, что они проходят на GitHub. Непройденные тесты могут блокировать коммиты.
Наконец, помните о проблемах, которые автоматизированные инструменты не могут легко обнаружить:
- Недостаток приватности: все остальные могут видеть ваши транзакции, пока они находятся в очереди в пуле
- Фронтраннинг транзакций
- Криптографические операции
- Рискованные взаимодействия с внешними компонентами децентрализованных финансов (DeFi)
Обратитесь за помощью
Приемные часы Эфириума (открывается в новой вкладке) проходят каждый вторник во второй половине дня. Эти часовые сессии один на один — возможность задать нам любые вопросы о безопасности, устранить неполадки с помощью наших инструментов и получить отзывы от экспертов о вашем текущем подходе. Мы поможем вам разобраться в этом руководстве.
Присоединяйтесь к нашему Slack: Empire Hacking (открывается в новой вкладке). Мы всегда доступны в каналах #crytic и #ethereum, если у вас есть какие-либо вопросы.