viem: современная альтернатива ethers

viem — современная альтернатива ethers: легче, типобезопаснее по умолчанию, на ней построен wagmi.

viem — современная TypeScript-библиотека для Ethereum: модульная, с малым весом бандла и сильным выводом типов из ABI «из коробки».

ethers — проверенный временем стандарт, но в 2023–2024 многие новые проекты выбирают viem. Не потому что ethers «плохой», а из-за инженерных причин: размер, типы, предсказуемость. Понимать обе библиотеки полезно — вы встретите код на обеих.

Почему появился viem

  • Размер бандла. viem модульный и tree-shakeable: в сборку попадает только то, что используете. Для фронта вес важен.
  • Типы по умолчанию. Вывод типов из ABI встроен — не нужен отдельный TypeChain.
  • Явность. Разделены клиенты: Public Client (чтение) и Wallet Client (подпись) — это прямой аналог Provider/Signer, но названия честнее отражают роль.
  • Производительность. Кодирование/декодирование ABI оптимизировано.

Те же идеи, другой синтаксис

Концепции переносятся один-в-один. Public Client = Provider, Wallet Client = Signer. Чтение баланса:

import { createPublicClient, http } from "viem";
import { mainnet } from "viem/chains";

const client = createPublicClient({
  chain: mainnet,
  transport: http("https://eth-mainnet.g.alchemy.com/v2/КЛЮЧ"),
});

const balance = await client.readContract({
  address: tokenAddress,
  abi,                 // объявлен как const -> типы выводятся
  functionName: "balanceOf",
  args: [userAddress],
});

Вместо contract.balanceOf(addr) здесь явный объект с functionName и args. Многословнее, зато прозрачнее и полностью типизировано: functionName ограничен функциями из ABI, а тип args и результата выводится.

ethers или viem — что выбрать

Критерийethersviem
Зрелость, примеры в сетибольшеменьше
Вес бандлакрупнеелегче
Типы из ABI «из коробки»нет (нужен TypeChain)да
Стиль APIобъектный (Contract)функциональный
Связка с Reactвручнуючерез wagmi (на viem)

Как работает под капотом

Под капотом viem делает то же, что ethers: кодирует вызовы по ABI, шлёт JSON-RPC, декодирует ответы. Разница архитектурная — viem строится из мелких чистых функций (readContract, writeContract, getBalance), а не из «толстых» объектов. Это даёт tree-shaking и предсказуемость. Числа, как и в ethers v6, — нативный bigint, поэтому арифметика wei работает одинаково.

Частые ошибки

  • Мешать API ethers и viem в голове. Это разные библиотеки; не зовите методы одной на объектах другой.
  • Игнорировать as const у ABI. Главное преимущество viem — типы — пропадёт.
  • Выбирать библиотеку «по хайпу». Для существующего проекта на ethers миграция не всегда оправдана.

Итоги

  • viem — лёгкая, типобезопасная, функциональная альтернатива ethers.
  • Public Client = Provider, Wallet Client = Signer; идеи те же.
  • На viem построен wagmi — стандарт для React-dApp (следующий раздел).
Проверьте себя
1. Что в viem является аналогом Signer из ethers?
APublic Client
BWallet Client
CTransport
DChain
2. Чем viem заметно отличается от ethers в работе с типами?
AНе поддерживает TypeScript
BВыводит типы из ABI из коробки (нужен as const)
CТребует TypeChain всегда
DИспользует только any
3. Почему viem часто легче по весу бандла?
AОн написан на ассемблере
BМодульный и tree-shakeable — в сборку попадает только используемое
CНе поддерживает события
DРаботает только на сервере