Ethernaut - основы игры.
Ethernaut – это СTF решение OpenZeppelin, каждый уровень является смарт-контрактом, который необходимо «взломать». Исходный код игры полностью открытый, а все уровни созданы другими игроками.
CTF (Capture The Flags/War games) — это проблемы безопасности, в которых представлен уязвимый код и вам необходимо написать смарт-контракт для использования этой уязвимости.
Проблема Ethernaut в том что некоторые уязвимости применимы только к старым версиям Solidity и в реальной жизни мы их уже не увидим. Тем не менее это хороший инструмент для отработки навыков.
Игра изначально создавалась для использования в тестовой сети Ethereum, но на январь 2024 г. запланировано прекращение поддержки cети Goerli. Для подписания транзакций буду использовать Polygon Mumbai.
Задача 0. Hello Ethernaut
Методы контракта уровня 0 интегрированы в консоль нашего браузера, что позволят нам инициировать вызовы методов.
1) Добавим в метамаск тестовую сеть Polygon Mumbai
2) В кране запрашиваем Matic
3) Переходим на сайт игры, подключаем кошелек.
Можем сразу поменять язык.
5) Откроем консоль разработчика Chrome. (Правая кнопка мыши - Просмотреть код - Вкладка Console)
6) Из нашей консоли мы вызовем команду: player
также инструкция с командами доступна в окне нашей задачи.
7) Чтобы проверить свой баланс вызовем команду: await getBalance(player)
8) Команда help() покажет список вспомогательных функций:
9) Команда await ethernaut.owner() выведет адрес владельца контракта ethernaut:
10) Для прохождения уровня необходимо запросить инстанс уровня. (экземпляр) Чтобы запросить инстанс нажмем на соответствующую кнопку внизу страницы и подтвердим транзакцию в метамаске. После этого в консоли должно появиться несколько новых сообщений.
Примечание: создание инстанса займет некоторое время
11) Теперь чтобы завершить уровень необходимо взаимодействовать с контрактом, следующими командами:
12) Вызовем метод await contract.info()
Ответ: «Вы найдете то, что вам нужно, в info1()»
13) Вызовем метод await contract.info1()
Ответ: Попробуйте info2(), но с «hello» в качестве параметра.
14) Вызовем метод await contract.info2("hell")
Ответ: «Свойство infoNum содержит номер следующего информационного метода, который будет вызван».
15) Вызовем метод await contract.infoNum()
16) Вызовем метод await contract.info42()
Получаем ответ: 'theMethodName — это имя следующего метода.'
17) Вызовем метод await contract.theMethodName()
Наш ответ: 'Имя метода — method7123949.'
18) Вызовем await contract.method7123949()
Ответ: 'Если вы знаете пароль, отправьте его в функцию authenticate().'
19) Вызовем функцию пароля await contract.password()
Наш пароль: 'ethernaut0'
20) Передадим пароль в функцию authenticate() и подпишем транзакцию.
21) Транзакция прошла успешно.
Также можем посмотреть txid в сети: https://mumbai.polygonscan.com/tx/0xc6eccc73e46da5b472d1410efc73d1ee40f169019251537f735f67510caeeed3
22) Проверка: вызовем метод await contract.getCleared()
Ответ: true
23) Отправим инстанс на проверку и подпишем транзакцию.
24) Ответ: Отлично, Уровень пройден!
Также мы получим контракт с которым работали и его можно задеплоить в ремиксе.
Бонусная часть: В консоле вызовем await contract и увидим все методы которые возможно вызвать в данном контракте.
Нам интересна вкладка ABI (Application Binary Interface) - используется для кодирования данных, которые передаются между смарт-контрактом и внешним приложением. ABI представлены в формате JSON и обычно генерируются компилятором при развертывании смарт-контракта, cюда входят имена, типы функций и событий (В Contract ABI возможно обнаружить функции которые скрыты во вкладке Write Contract) В контексте нашей задачи мы можем сразу посмотреть все доступные функции и решить уровень за два шага.
Вывод:
Рассмотрели методы контракта уровня 0, добавили в метамаск тестовую сеть Polygon Mumbai, ознакомились с консолью браузера, прошлись по необходимым командам, успешно завершили уровень. Получили данные c contract ABI.
Поэтапное прохождение игры может стать хорошей отправной точкой для новичка по обнаружению уязвимостей в смарт-контрактах и понимания функций языка.