Ethernaut
January 17, 2024

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) Переходим на сайт игры, подключаем кошелек.

Можем сразу поменять язык.
Панель выбора языка

4) Выбираем задачу

Панель выбора задачи

5) Откроем консоль разработчика Chrome. (Правая кнопка мыши - Просмотреть код - Вкладка Console)

Вызов консоли

Приветствие Ethernaut

6) Из нашей консоли мы вызовем команду: player

Консоль выводит адрес моего кошелька

также инструкция с командами доступна в окне нашей задачи. 
Окно с инструкцией к текущей задаче

7) Чтобы проверить свой баланс вызовем команду: await getBalance(player)

Текущий баланс кошелька

8) Команда help() покажет список вспомогательных функций:

Вспомогательные функции

9) Команда await ethernaut.owner() выведет адрес владельца контракта ethernaut:

owner

10) Для прохождения уровня необходимо запросить инстанс уровня. (экземпляр) Чтобы запросить инстанс нажмем на соответствующую кнопку внизу страницы и подтвердим транзакцию в метамаске. После этого в консоли должно появиться несколько новых сообщений.

Примечание: создание инстанса займет некоторое время
Запрс инстанса

Адрес инстанса

11) Теперь чтобы завершить уровень необходимо взаимодействовать с контрактом, следующими командами:

Взаимодействие с контрактом

12) Вызовем метод await contract.info()

Ответ: «Вы найдете то, что вам нужно, в info1()»

13) Вызовем метод await contract.info1()

Ответ: Попробуйте info2(), но с «hello» в качестве параметра.

14) Вызовем метод await contract.info2("hell")

Ответ: «Свойство infoNum содержит номер следующего информационного метода, 
который будет вызван».

15) Вызовем метод await contract.infoNum()

Номер 42 - номер следующего информационного метода

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) Ответ: Отлично, Уровень пройден!

Также мы получим контракт с которым работали и его можно задеплоить в ремиксе.
Контракт: Hello Ethernaut

Бонусная часть: В консоле вызовем await contract и увидим все методы которые возможно вызвать в данном контракте.

Нам интересна вкладка ABI (Application Binary Interface) - используется для кодирования данных, которые передаются между смарт-контрактом и внешним приложением. ABI представлены в формате JSON и обычно генерируются компилятором при развертывании смарт-контракта, cюда входят имена, типы функций и событий (В Contract ABI возможно обнаружить функции которые скрыты во вкладке Write Contract) В контексте нашей задачи мы можем сразу посмотреть все доступные функции и решить уровень за два шага.

ABI

Вывод:

Рассмотрели методы контракта уровня 0, добавили в метамаск тестовую сеть Polygon Mumbai, ознакомились с консолью браузера, прошлись по необходимым командам, успешно завершили уровень. Получили данные c contract ABI.

Поэтапное прохождение игры может стать хорошей отправной точкой для новичка по обнаружению уязвимостей в смарт-контрактах и понимания функций языка.