No history yet

Архитектура full-stack dApp

Архитектура Full-Stack dApp

Децентрализованное приложение (dApp) — это больше, чем просто смарт-контракт. Полноценное приложение требует пользовательского интерфейса для взаимодействия, сервера для выполнения фоновых задач и, конечно, самого блокчейна для обеспечения децентрализации. Современные dApps строятся по трехуровневой архитектуре, которая сочетает в себе сильные стороны традиционной веб-разработки и технологии блокчейн.

Рассмотрим каждый уровень подробнее:

  1. Фронтенд — это то, что видят и с чем взаимодействуют пользователи. Он создается с помощью фреймворков, таких как React или Vue, и отвечает за отображение данных из блокчейна и отправку транзакций для изменения состояния.
  2. Бэкенд выступает в роли связующего звена. Он обрабатывает задачи, которые нецелесообразно или невозможно выполнять на блокчейне: аутентификация пользователей, кэширование данных для быстрой загрузки, отправка уведомлений и взаимодействие со сторонними API.
  3. Блокчейн — это децентрализованный уровень, где живут смарт-контракты. Он служит единым источником истины для всех критически важных данных и бизнес-логики, таких как права владения токенами (ERC20/ERC721), финансовые операции или результаты голосования.

Связующее звено: RPC-провайдеры

Чтобы фронтенд или бэкенд могли «общаться» с блокчейном (читать данные или отправлять транзакции), им нужен доступ к узлу (ноде) сети. Поддерживать собственный узел — сложная и ресурсоемкая задача. На практике разработчики используют RPC-провайдеров.

RPC (Remote Procedure Call) — это протокол, который позволяет одному компьютеру вызывать функции на другом. В контексте блокчейна, ваше приложение отправляет RPC-запросы к узлу сети, чтобы, например, узнать баланс кошелька или выполнить функцию смарт-контракта.

RPC-провайдер

noun

Сервис, который предоставляет доступ к узлам блокчейна через API. Он избавляет разработчиков от необходимости запускать и обслуживать собственные ноды.

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

Гибридная модель данных

Хранение данных в блокчейне — дорогой и медленный процесс. Каждая запись требует транзакции и платы за газ. Поэтому ключевой принцип эффективной архитектуры dApp — хранить на блокчейне только то, что абсолютно необходимо для обеспечения децентрализации и безопасности. Для всего остального используется традиционная база данных, например, MongoDB.

Тип данныхГде хранитьПример
Критическая логика и состояниеБлокчейнВладение NFT, баланс токенов, результаты голосования
Метаданные и некритические данныеMongoDB (Off-chain)Профиль пользователя, история чата, кэшированные данные
Данные, требующие быстрого поиска/фильтрацииMongoDB (Off-chain)Список всех NFT с фильтрацией по атрибутам

В этой гибридной модели блокчейн остается «единым источником истины». База данных MongoDB выступает в роли кэша и индексатора. Ваш бэкенд-сервер слушает события, происходящие в смарт-контрактах (например, Transfer для ERC721), и обновляет соответствующие данные в MongoDB. Когда фронтенду нужно быстро получить список всех NFT с возможностью поиска и фильтрации, он обращается к бэкенду, который мгновенно отдает данные из MongoDB, а не делает медленный и дорогой запрос к блокчейну.

Настройка окружения с Hardhat

Для профессиональной разработки смарт-контрактов необходима среда, которая упрощает компиляцию, тестирование, отладку и деплой. Hardhat — это один из отраслевых стандартов для разработки на Ethereum.

Hardhat предоставляет гибкую и расширяемую среду для выполнения задач. Он позволяет запускать локальную тестовую сеть, писать автоматизированные тесты для контрактов на JavaScript/TypeScript и управлять развертыванием в различных сетях.

Настройка проекта Hardhat начинается с команды npx hardhat init в вашем терминале. Это создаст базовую структуру проекта, включая конфигурационный файл hardhat.config.js, а также папки для контрактов, скриптов и тестов.

Ключевая часть настройки — файл hardhat.config.js. Здесь вы определяете версии компилятора Solidity, настраиваете подключение к сетям (например, основная сеть Ethereum, тестовые сети Sepolia или локальная) и подключаете плагины.

// Пример конфигурации hardhat.config.js
require("@nomicfoundation/hardhat-toolbox");

const ALCHEMY_API_KEY = "ВАШ_КЛЮЧ";
const SEPOLIA_PRIVATE_KEY = "ВАШ_ПРИВАТНЫЙ_КЛЮЧ";

/** @type import('hardhat/config').HardhatUserConfig */
module.exports = {
  solidity: "0.8.24",
  networks: {
    sepolia: {
      url: `https://eth-sepolia.g.alchemy.com/v2/${ALCHEMY_API_KEY}`,
      accounts: [SEPOLIA_PRIVATE_KEY]
    }
  }
};

Для управления процессом развертывания контрактов используется плагин Hardhat Ignition. Он позволяет определять деплой в виде декларативных модулей, что делает процесс повторяемым, надежным и более простым в управлении, особенно в сложных проектах с множеством зависимых контрактов.

Ignition отслеживает уже развернутые контракты, предотвращая повторный деплой и экономя средства на газ. Это особенно важно при работе с публичными сетями.

Теперь, когда мы разобрались с архитектурой, давайте проверим ваши знания.

Quiz Questions 1/5

Каковы три основных уровня архитектуры современного децентрализованного приложения (dApp)?

Quiz Questions 2/5

Зачем в архитектуре dApp используется традиционная база данных (например, MongoDB) наряду с блокчейном?

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