Создание фронтенда для Web3-приложений - это не только дизайн, кнопки и React. Это мост между пользователем и блокчейном. И ты, как фронтенд-разработчик - тот, кто этот мост строит.

В этой статье ты узнаешь:

  • Что такое Web3 Frontend и чем он отличается от Web2

  • Какие инструменты тебе реально нужны

  • Как начать с нуля

  • Как использовать wagmi - главный инструмент Web3-интерфейсов

Стоит сразу оговорится - если ты ожидаешь увидеть в этой статье мои "философские" рассуждения на тему "интернета будушего", то эта статья не об этом. Термин Web3 уже давно закрепился за блокчейн технологиями, нравится тебе это или нет. И это легко проверить загуглив пару вакансий с префиксом web3 или парочки альтернативных статей. Я лишь делюсь своей экспретизой и опытом в этой сфере и не претендую на роль "новатара" или "философа".

Что такое Web3 Frontend?

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

Если ты еще не знаешь что такое децентрализация, то обязательно прочитай об этом отдельно. Это целая концепция вокруг которой все web3 и построено.

Ты не отправляешь запросы на backend, как в Web2. Ты взаимодействуешь с сетью (Ethereum, Polygon, Base и т.п.) через смарт-контракты и подключённый кошелёк.

Что тебе нужно для старта?

1. Библиотеки Web3

Библиотека

Назначение

wagmi

Основной инструмент для Web3-интерфейса

viem

RPC-клиент для вызова контрактов (вместо ethers.js)

@rainbow-me/rainbowkit

Подключение кошельков с UI

ethers.js (опц.)

Старый, но популярный Web3-клиент

2. Базовые понятия Web3 - кратко и по делу

Чтобы комфортно работать с wagmi и любыми Web3-инструментами, нужно понимать, как устроен фундамент. Ниже представлены все ключевые термины, которые ты будешь встречать в dApp’ах снова и снова.

address → адрес кошелька или контракта

Это строка, которая представляет пользователя или контракт в сети. Она всегда начинается с 0x, содержит 40 символов.

Пример:
0x1234567890abcdef1234567890abcdef12345678

Есть два вида:

  • EOA (Externally Owned Account) — обычный кошелёк (например, MetaMask)

  • Contract Account — адрес, по которому развёрнут смарт-контракт

Чтобы отображать адрес красиво, используют ENS (например: vitalik.eth)

token → цифровой актив на балансе

ERC-20 — взаимозаменяемые (USDC, DAI):
поддерживают balanceOf, transfer, approve, decimals
Используй useBalance({ token }) в wagmi для получения баланса

ERC-721 — NFT (уникальные ID):
функции ownerOf, tokenURI, transferFrom
Через tokenURI получаешь метаданные с image, name

decimals — количество знаков после запятой:
ETH = 18, USDC = 6
Используй parseUnits / formatUnits из viem для конвертации

approve + allowance — разрешение контракту тратить токены
Обязательно для свапов, стейкинга и NFT-маркетплейсов

chainId → идентификатор сети

Показывает, к какой сети подключён пользователь. Каждый блокчейн имеет уникальный chainId.

Примеры:

  • Ethereum Mainnet → 1

  • Goerli Testnet → 5

  • Polygon → 137

  • Arbitrum → 42161

  • Optimism → 10

Ты используешь chainId, чтобы:

  • определить активную сеть

  • переключать сеть (через switchNetwork)

  • отображать правильные токены/цены

provider → канал связи с блокчейном

Это объект, через который ты читаешь данные из сети: балансы, блоки, события. Он не может подписывать транзакции.

→ В wagmi и viem провайдер создаётся через publicProvider() или RPC-провайдеры вроде Alchemy, Infura и т. д.

→ Примеры возможностей:

  • Получить текущий блок

  • Прочитать состояние контракта

  • Подписаться на события

signer → тот, кто подписывает транзакции

Это расширение provider с доступом к приватному ключу (который держит MetaMask).

С помощью signer ты можешь:

  • отправить транзакцию (sendTransaction)

  • подписать сообщение (signMessage)

  • вызывать contract.write() (например, mint())

→ В wagmi тебе не нужно напрямую работать с signer, он используется внутри хуков типа useContractWrite.

smart contract, ABI, read/write

Смарт-контракт — это программа на блокчейне.
ABI (Application Binary Interface) — это инструкция для твоего фронтенда: какие функции у контракта, какие параметры, что возвращается.

Пример ABI-функции:

{
  "name": "mint",
  "type": "function",
  "stateMutability": "payable",
  "inputs": [],
  "outputs": []
}

Есть два типа вызовов:

  • read → бесплатный, безопасный, не требует подписи (например, totalSupply(), balanceOf())

  • write → платный (gas), требует подписи (например, mint(), transfer())

gas, fee, nonce

gas → топливо, которое тратится на выполнение кода
gasPrice → цена за одну единицу газа (в Gwei)
fee = gas × gasPrice (тебе нужно заплатить в ETH или другой валюте)
nonce → счётчик количества транзакций от адреса (чтобы они шли по порядку)

Все write-функции тратят gas, даже если они не срабатывают (например, revert’ятся)

network, chain, L2

network = chain = блокчейн-среда, в которой работает dApp
L1 → основной уровень (Ethereum Mainnet)
L2 → надстройка над L1 для ускорения и удешевления транзакций

Ты должен всегда:

  • проверять, в какой сети находится пользователь

  • уметь предлагать переключение сети (например, с mainnet на L2)

  • работать с несколькими chainId через wagmi-конфигурацию

tokens, decimals, balance

На блокчейне балансы измеряются в целых числах, без запятой
- ETH имеет 18 знаков после запятой
- USDC — 6

В wagmi ты используешь useBalance({ address }) — и получаешь уже отформатированное значение

Краткая таблица для повторения

Термин

Пояснение

address

Адрес пользователя или контракта (0x...)

chainId

ID блокчейна

provider

Канал к блокчейну (чтение)

signer

Подписант транзакций (MetaMask и т.д.)

contract

Программа на блокчейне

ABI

Описание функций контракта

gas

Стоимость исполнения

read

Чтение без газа

write

Транзакции с подписью и оплатой

nonce

Счётчик транзакций

signMessage

Подпись строки через кошелёк

SIWE

Авторизация без пароля через Ethereum

token

цифровой актив

wagmi — must-have для Web3 Frontend

Библиотека wagmi — это набор React-хуков, которые позволяют:

  • Подключать кошелёк

  • читать/записывать в смарт-контракт

  • Получать баланс, ENS, chain info

  • Подписывать сообщения и транзакции

? Пример: минимальный dApp с wagmi

1. Установка:

npm install wagmi viem @rainbow-me/rainbowkit

2. Настройка WagmiConfig

// main.tsx
import { WagmiConfig, createConfig, configureChains } from 'wagmi'
import { publicProvider } from 'wagmi/providers/public'
import { mainnet, polygon, optimism } from 'wagmi/chains'
import { QueryClient, QueryClientProvider } from '@tanstack/react-query'

const { publicClient, webSocketPublicClient } = configureChains(
  [mainnet, polygon, optimism],
  [publicProvider()]
)

const config = createConfig({
  autoConnect: true,
  publicClient,
  webSocketPublicClient,
})

const queryClient = new QueryClient()

export function Web3Provider({ children }) {
  return (
    <WagmiConfig config={config}>
      <QueryClientProvider client={queryClient}>
        {children}
      </QueryClientProvider>
    </WagmiConfig>
  )
}

3. Подключение кошелька

// ConnectWallet.tsx
import { useAccount, useConnect, useDisconnect } from 'wagmi'
import { InjectedConnector } from 'wagmi/connectors/injected'

export function ConnectWallet() {
  const { connect } = useConnect({
    connector: new InjectedConnector(),
  })
  const { disconnect } = useDisconnect()
  const { isConnected, address } = useAccount()

  return isConnected ? (
    <div>
      <p>Вы подключены: {address}</p>
      <button onClick={() => disconnect()}>Отключиться</button>
    </div>
  ) : (
    <button onClick={() => connect()}>Подключить MetaMask</button>
  )
}

4. Чтение баланса

// Balance.tsx
import { useBalance, useAccount } from 'wagmi'

export function Balance() {
  const { address } = useAccount()
  const { data, isLoading } = useBalance({ address })

  if (isLoading) return <p>Загрузка...</p>

  return <p>Баланс: {data?.formatted} {data?.symbol}</p>
}

5. Вызов функции смарт-контракта

// MintNFT.tsx
import { usePrepareContractWrite, useContractWrite } from 'wagmi'
import { parseEther } from 'viem'

const contractAddress = '0x123...' // твой контракт
const abi = [
  {
    name: 'mint',
    type: 'function',
    stateMutability: 'payable',
    inputs: [],
    outputs: [],
  },
]

export function MintNFT() {
  const { config } = usePrepareContractWrite({
    address: contractAddress,
    abi,
    functionName: 'mint',
    value: parseEther('0.01'),
  })

  const { write, isLoading, isSuccess } = useContractWrite(config)

  return (
    <button disabled={!write || isLoading} onClick={() => write?.()}>
      {isLoading ? 'Минтим...' : 'Минт NFT'}
      {isSuccess && <p>Успех!</p>}
    </button>
  )
}

Что по итогу?

Web3 Frontend - это не сложно, если начать с правильных инструментов.
Твоя цель - не перепридумать backend, а создать безопасный, быстрый и дружелюбный интерфейс поверх блокчейна. И в этом тебе максимально помогает wagmi.

В следующих частях мы остановимся более подробно на живых примерах dapp приложений и разберем как это все работает под капотом.

Комментарии (20)


  1. Terranz
    26.07.2025 17:08

    А что, в этом ихнем будущем web3 кроме операций с кошельком больше ничего не предполагается? А мемы про котиков как смотреть?

    Ты взаимодействуешь с сетью

    Так эндпойнт в итоге где?


    1. svosin
      26.07.2025 17:08

      Вот тут:

      const { publicClient, webSocketPublicClient } = configureChains(
        [mainnet, polygon, optimism],
        [publicProvider()]
      )

      Просто wagmi прячет непосредственно конфигурацию провайдера, в случае с ethers это было бы более явным.

      А вообще, в большинстве случаев взаимодействие происходит не прямым дёрганьем эндпойнта, а через вызовы объекта, который инжектится плагином кошелька. Можно и напрямую (когда не надо отправлять транзакции) - тогда эндпойнт можно взять либо у специальных провайдеров по типу Infura, либо поднять свою ноду и ходить к ней.


    1. skymal4ik
      26.07.2025 17:08

      Я тоже этого не понял. Финансовые операции в текущем вебе - это какие-то доли процента времени. Основное - это поиск информации, потребление контента, новости, общение, игры. Что веб3 предлагает вместо гугла, ютуба, ленты, реддита и прочих лоров?


      1. themen2
        26.07.2025 17:08

        Ничего. Просто криптаны дуреют с этой прикормки


      1. artptr86
        26.07.2025 17:08

        Так в «интернете будущего» всё запрещено :)


      1. forajump
        26.07.2025 17:08

        Если я правильно понимаю, IPFS соответствует концепции Web3, и там можно смотреть мемы про котиков.


      1. geek_george Автор
        26.07.2025 17:08

        Термин Web3 уже давно закрепился за блокчейн технологиями, нравится тебе это или нет. И это легко проверить загуглив пару вакансий с префиксом web3 или загуглив. Я лишь делюсь своей экспретизой и опытом в этой сфере и не претендую на роль "новатара" или "философа".

        А вот некоторые аналоги сервисов:
        research, YaCy, Koii, Odysee, LBRY, Livepeer, PeerTube, Lemmy, Aether, Karma3, Farcaster, Lens Protocol, Bluesky, Deso, Orbit, Mirror.xyz, Paragraph.xyz, RSS3, Push Protocol, XMTP, CyberConnect.


  1. lhawick
    26.07.2025 17:08

    Разве nonce это счётчик количества транзакцией для определения их порядка? Насколько я знаю это число, которое меняют чтобы менять хеш заголовка блока


    1. svosin
      26.07.2025 17:08

      В ethereum-образных сетях (и во многих остальных с аккаунтной моделью) nonce - это счетчик транзакций с конкретного адреса, который много для чего используется, кроме replay protection - например, в EVM-сетях nonce участвует в расчете адреса контракта, который деплоится с данного адреса. Плюс отмена/ускорение транзакции работает как отправка другой транзакции с тем же nonce, что и та транза, которую нужно отменить, но с бОльшей комиссией, чтобы был шанс заскочить вперёд отменяемой транзакции.


  1. Lodin
    26.07.2025 17:08

    Статья будто из 2017. А в итоге Web 3 так и не родился, криптовалюты оказались чем-то очень нишевым, NFT остались просто скамом, а блокчейн толком никуда и не впилили.


    1. MyNameIsAlex33
      26.07.2025 17:08

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


      1. themen2
        26.07.2025 17:08

        А толку? Скам для крипианов и маминых инвесторов с деньгами сэкономленными с обедов


  1. shendel
    26.07.2025 17:08

    Ладно... Не ругайтесь... А зачем тяжёлый viem в примере? Для перевода этара в веи?


    1. geek_george Автор
      26.07.2025 17:08

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

      В статься он используется потому что благодаря абстракциям viem, даже не просвященный разработчик сможет быстро закрывать свои задачи по работе с evm сетями (на случай если в вашем проекте важен каждый кб)


  1. ByJumping
    26.07.2025 17:08

    Читается как будто неронка писала - "кратко и по делу" мне жпт всегда так отвечает и в конце дает таблицу)


    1. vindy
      26.07.2025 17:08

      Что значит "как будто"? )


  1. NeiroNx
    26.07.2025 17:08

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


    1. geek_george Автор
      26.07.2025 17:08

      В статье расcмотрены так называемые операции чтения и записи в блокчейне. Если запись может быть ограничена логикой определенной программы, то чтение доступно всем пользователям. В статье рассмотрен пример чтения баланса, также он может отличаться в зависимости от того какую логику заложил разработчик смарт-контрактов


  1. ArtyomOchkin
    26.07.2025 17:08

    Так вы про Web 3.0 или про блокчейн и его соединение на уровнях бэкенда и фронтенда?


    1. geek_george Автор
      26.07.2025 17:08

      Термин Web3 уже давно закрепился за работой с блокчейном, как среди разработчиков, так и среди работодателей