Интеграция с ENS (Ethereum Name Service)
Отметим: когда пользователь вводит адрес 0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045 вручную, вероятность ошибки — высока. Один неверный символ — и средства уходят в никуда. По статистике, 70% ошибок при переводе ETH связаны с неправильным вводом адреса. Ethereum Name Service решает это: вместо хекса — читаемое vitalik.eth. Но интеграция ENS — не просто вызов библиотеки. Без учёта нормализации имени (UTS-46), on-chain газа и формата обратной записи легко получить баги. Полная интеграция занимает от 2 до 5 рабочих дней. Наши клиенты экономят в среднем $2000 в год на переводах благодаря снижению ошибок, а поддержка — до $500 в месяц.
Зачем интегрировать ENS?
ENS — стандарт де-факто для human-readable адресов в Ethereum. Он избавляет пользователей от копирования длинных адресов и снижает количество ошибок ввода. Более 90% популярных dApps уже поддерживают ENS. Интеграция позволяет не только показывать имена, но и получать аватары, email, социальные сети из резолвера — всё в одном месте. Экономия времени пользователя — до 10 секунд на каждой транзакции.
Как происходит резолвинг ENS на фронтенде?
Основные библиотеки — ethers.js (v6) и viem. Они предоставляют методы для прямой и обратной резолюции, а также для получения аватаров.
// ethers.js v6 const provider = new ethers.JsonRpcProvider(RPC_URL); // Forward resolution: имя → адрес const address = await provider.resolveName("vitalik.eth"); // "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045" // Reverse resolution: адрес → имя const name = await provider.lookupAddress("0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045"); // "vitalik.eth" или null если reverse record не установлен // Avatar const resolver = await provider.getResolver("vitalik.eth"); const avatar = await resolver?.getAvatar(); // URL аватара или null // viem import { createPublicClient, http } from "viem"; import { mainnet } from "viem/chains"; import { normalize } from "viem/ens"; const client = createPublicClient({ chain: mainnet, transport: http() }); const address = await client.getEnsAddress({ name: normalize("vitalik.eth") }); const name = await client.getEnsName({ address: "0xd8dA..." }); const avatar = await client.getEnsAvatar({ name: normalize("vitalik.eth") }); normalize() важен: ENS имена нормализуются по UTS-46 стандарту перед хешированием. Vitalik.ETH и vitalik.eth — одно имя, но без normalize() они дадут разные намехеши.
Почему нормализация имени критична?
Без нормализации имя MyName.eth и myname.eth будут считаться разными, что приведёт к ошибкам резолвинга. Функция normalize() из viem или библиотека UTS-46 гарантирует единообразие. На фронтенде это обязательный шаг перед каждым запросом к ENS. Не используйте сырой ввод пользователя — всегда нормализуйте.
Сравнение библиотек и методов интеграции
| Параметр | ethers.js | viem |
|---|---|---|
| Размер (min+gzip) | ~80KB | ~50KB |
| Встроенная нормализация | Нет (требует UTS-46) | Да (метод normalize()) |
| ENS методы | resolveName, lookupAddress, getResolver | getEnsAddress, getEnsName, getEnsAvatar |
| Тип | Полноценная библиотека | Тонкая обёртка |
viem обрабатывает ENS-запросы в 2 раза быстрее за счёт ленивых вычислений, а размер бандла меньше почти на 40%. Для простого резолвинга viem предпочтительнее. Если вам требуется более широкая функциональность (например, работа с транзакциями), ethers.js остаётся стандартом.
| Метод | Библиотека | Сложность | Применимость |
|---|---|---|---|
| Forward resolution | ethers.js/viem | Низкая | UI-компоненты |
| Reverse resolution | ethers.js/viem | Низкая | UI-компоненты |
| On-chain resolution | Solidity + ENS Registry | Средняя | Умные контракты |
| Text records | ethers.js/viem | Низкая | Профили пользователей |
| Avatar | ethers.js/viem | Низкая | UI-компоненты |
Как резолвить ENS on-chain?
Для смарт-контрактов нужен прямой вызов ENS Registry. Приводим пример контракта:
interface IENSResolver { function addr(bytes32 node) external view returns (address); } interface IENS { function resolver(bytes32 node) external view returns (address); } contract ENSConsumer { IENS constant ENS_REGISTRY = IENS(0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e); function resolveENS(bytes32 namehash) external view returns (address) { address resolverAddr = ENS_REGISTRY.resolver(namehash); require(resolverAddr != address(0), "No resolver"); return IENSResolver(resolverAddr).addr(namehash); } } Namehash для alice.eth нужно вычислить off-chain (или через ENS SDK) и передать в контракт — on-chain вычисление string namehash дорогостоящее (около 20k газа).
Текстовые записи и профили
ENS хранит произвольные текстовые записи по ключу:
const resolver = await provider.getResolver("alice.eth"); const email = await resolver?.getText("email"); const twitter = await resolver?.getText("com.twitter"); const github = await resolver?.getText("com.github"); const website = await resolver?.getText("url"); const description = await resolver?.getText("description"); Стандартные ключи (EIP-634): email, url, avatar, description, notice, keywords, com.twitter, com.github, com.discord, org.telegram. Это основа для ENS-based профилей: всё что нужно хранится в resolver, читается без дополнительной инфраструктуры.
Процесс работ
При заказе интеграции ENS мы предоставляем полный цикл:
- Аудит текущего dApp и определение точек интеграции.
- Разработка frontend-компонентов (ввод и отображение ENS-имён, аватаров).
- Реализация on-chain резолвинга при необходимости.
- Интеграция текстовых записей и аватаров.
- Тестирование на тестовой сети (Sepolia).
- Деплой, мониторинг и документация с примерами кода.
Сроки — от 2 до 5 рабочих дней для базовой интеграции. Стоимость рассчитывается индивидуально. Свяжитесь с нами для точной оценки под ваш проект. Получите консультацию по интеграции ENS уже сегодня.
Типичные ошибки при интеграции ENS
-
Пропуск нормализации — имена вида
Vitalik.ETHиvitalik.ethдолжны давать один namehash. Безnormalize()возможны несоответствия. -
Игнорирование gas cost для on-chain — вызов
resolver()иaddr()в контракте стоит газа, использовать только при необходимости. -
Ошибка в namehash — если передать неправильный node, резолвинг вернёт
address(0).
Наш опыт
Мы внедрили ENS в 30+ dApps за 5+ лет работы, включая DeFi и NFT-маркетплейсы. Наши инженеры глубоко знают специфику ENS: от нормализации до оптимизации газа. Гарантируем стабильность и совместимость с последними версиями библиотек. Поддержка после внедрения — 1 месяц.







