
Узнайте, как создать простое приложение для отслеживания газа с помощью MetaMask gas API, Next.js и ShadcnUI.

'Gas' (газ) — это единица измерения вычислительных усилий, необходимых для выполнения операций, таких как проведение транзакций или запуск смарт-контрактов. По аналогии с топливом для автомобиля — газ необходим сети для обработки и подтверждения операций. Каждая транзакция в Ethereum требует определённого количества газа, которое определяется её сложностью. Пользователи устанавливают цену газа в Gwei (1 Gwei = 1 миллиардная часть Ether), указывая тем самым, сколько Ether они готовы заплатить за единицу газа.
Понимание цен на газ имеет ключевое значение в блокчейн-сетях, поскольку помогает пользователям управлять стоимостью своих транзакций. Знание актуальных цен на газ позволяет выбрать наиболее экономичное время для инициирования транзакции и определить её скорость. Осведомлённость о ценах на газ также важна для предотвращения неудачных транзакций, планирования бюджета, понимания загруженности сети и принятия взвешенных инвестиционных решений.
MetaMask Gas API, доступный через Infura, — это специализированный инструмент, предназначенный для предоставления актуальной информации о ценах на газ для сетей, совместимых с Ethereum Virtual Machine (EVM). Он функционирует как оракул, предоставляя актуальные данные о вычислительных затратах, необходимых для выполнения операций или транзакций в этих сетях. API даёт разработчикам возможность создавать продвинутые функции оценки газа, что может привести к экономии затрат на серверные транзакционные операции или улучшить пользовательский интерфейс.
В этом руководстве мы научимся создавать приложение Gas Tracker с использованием Gas API, Next.js и ShadcnUI. Это приложение позволит пользователям dapp получать доступ к рекомендуемым ценам на газ с учётом приоритетов их транзакций, помогая обеспечить эффективное включение этих транзакций в блок блокчейна.
Действующий Web3 API key и API key secret.
Установленные Node.js и npm или yarn.
Знакомство с Next.js и React.
Для начала убедитесь, что на вашем компьютере установлен Node.js. После этого создайте новое приложение Next.js, открыв терминал и выполнив следующую команду:
npx create-next-app@latestПосле выполнения команды появится несколько запросов, а также будет создан новый каталог с указанным вами именем проекта — я использовал gastracker-app, — что формирует базовую структуру Next.js и устанавливает необходимые зависимости. Теперь перейдите в каталог вашего проекта:
Перейдите в новый каталог проекта и запустите приложение Next.js в режиме разработки с помощью следующей команды. Затем вы можете открыть приложение, перейдя по адресу http://localhost:3000 в браузере.
Для нашего приложения мы будем использовать библиотеку компонентов. Начнём с установки ShadcnUI:
npx shadcn-ui@latest initВ процессе установки вам будет предложено настроить файл components.json с помощью следующих запросов:
Разобравшись с этим, установим также компонент Card из Shadcn UI:
npx shadcn-ui@latest add cardВ этом руководстве мы сосредоточимся на использовании компонента Card из Shadcn UI. Чтобы узнать больше об этих компонентах, посетите сайт Shadcn UI. Теперь, когда фронтенд настроен, мы готовы приступить к работе с Gas API.
В корневом каталоге создайте файл с именем .env, в котором будут храниться следующие учётные данные:
Обязательно получите API_KEY и API_KEY_SECRET из панели управления Infura. Крайне важно не публиковать API-ключ на GitHub. В корневом каталоге проверьте файл .gitignore и убедитесь, что в него включены необходимые строки.
Нам также понадобятся пакеты axios и dotenv:
Теперь создайте файл с именем 'index.js' в корне нашего gastracker-app и скопируйте в него следующий код:
В другом окне терминала выполните следующую команду.
node index.jsВы должны увидеть следующее:
Если данные отображаются в терминале, это означает, что мы успешно получаем ответы от API. Следующий шаг — отобразить эти данные на фронтенде. Теперь можно удалить файл index.js.
Чтобы определить пользовательские типы для использования в рамках всего проекта, создайте файл с именем 'index.d.ts' в корневом каталоге и добавьте в него следующие строки:
Эти объявления интерфейсов TypeScript в глобальном файле определяют структуры для оценки комиссий за газ и ответов API. Они включают такие детали, как предложения по комиссиям, время ожидания, загруженность сети и тенденции комиссий для различных уровней приоритета транзакций в блокчейн-сети.
В папке 'lib' создайте файл с именем 'getData.ts' и добавьте следующий код:
Этот код получает данные о комиссиях за газ из Gas API:
Настройка аутентификации: создаёт Buffer из INFURA_API_KEY и INFURA_API_KEY_SECRET, заданных в качестве переменных окружения. Затем этот Buffer преобразуется в строку base64 (с именем 'Auth') для базовой аутентификации в API-запросах.
Указание Chain ID: устанавливает переменную chainId равной 1, что обычно соответствует основной сети Ethereum (mainnet) в контексте блокчейна.
Функция getData: асинхронная функция для получения данных о комиссиях за газ:
Использует fetch для выполнения GET-запроса к конечной точке Infura API, получая рекомендуемые комиссии за газ для указанного chainId.
Устанавливает заголовок Authorization в запросе с использованием ранее созданного токена Auth.
В случае успеха разбирает ответ как JSON и возвращает его в виде GasFeesApiResponse, соответствующего ранее определённому интерфейсу.
Записывает любые ошибки, такие как сетевые проблемы или ошибки сервера, в консоль.
Вариативность Chain ID: chainId можно изменить в зависимости от сети, для которой создаётся приложение. Gas API на Infura поддерживает большинство крупных EVM-сетей. Для получения дополнительной информации о поддерживаемых сетях посетите документацию.
Мы добрались до самой интересной части — работы над UI для отображения данных. Перейдём в папку components и создадим компонент с именем 'GasCard.tsx'.
Разберём, что здесь происходит:
Импорты и получение данных:
Компонент импортирует функцию getData для получения данных о комиссиях за газ, а также различные UI-компоненты: Card, CardContent, CardHeader и CardTitle, которые являются частью ранее установленного Shadcn UI.
Внутри компонента GasCard вызывается функция getData для получения данных о комиссиях за газ.
Отображение оценок комиссий за газ:
Определяется функция renderGasFeeEstimateCard, которая отображает карточку UI для конкретной оценки комиссии за газ (GasFeeEstimate) и заголовка (title).
Эта функция формирует компонент Card, отображающий такие детали, как максимальная приоритетная комиссия, максимальная комиссия за газ и ожидаемое время ожидания.
Структура компонента:
JSX-структура компонента GasCard описана в операторе return. Она использует сеточный макет для отображения карточек с низкими, средними и высокими оценками комиссий за газ, которые отображаются условно в зависимости от наличия данных.
Дополнительная карточка показывает более подробную информацию: расчётную базовую комиссию, загруженность сети, диапазоны приоритетных комиссий (актуальные и исторические), а также тенденции приоритетных и базовых комиссий.
Теперь остался единственный шаг — импортировать GasCard.tsx в файл page.tsx. После этого все данные должны отображаться на нашем фронтенде.
Использование Gas API на Infura предоставляет разработчикам, работающим с EVM-совместимыми сетями, значительные преимущества. Он обеспечивает актуальную информацию о постоянно меняющемся рынке газа, позволяя пользователям принимать взвешенные решения о комиссиях за транзакции. Это особенно полезно для оптимизации как скорости, так и экономической эффективности транзакций.
В этом руководстве рассматривается, как начать работу с GasAPI и создать простое приложение Gas Tracker. Код можно найти здесь: GasAPI-Template на GitHub.
Но с этим можно делать ещё много интересного: добавить обновление GasData через определённые промежутки времени с обратным отсчётом, а также интегрировать GasAPI в любое существующее приложение. Рекомендую ознакомиться со следующими ресурсами:
Документация Gas API: Документация Infura Gas API
EventSea: Полноценный dapp для мероприятий, творчески использующий GasAPI: EventSea на GitHub
Удачной разработки! 🚀
Переведено ИИ. Может содержать ошибки. Пожалуйста, всегда проверяйте информацию.