Интеграция с ENS (Ethereum Name Service)
ENS — стандарт de facto для human-readable адресов в Ethereum экосистеме. Вместо того чтобы строить собственный naming service, большинство dApps просто интегрируют ENS: отображают имена вместо адресов, принимают ввод имён в полях перевода, показывают аватары.
Резолвинг имён в коде
Frontend через ethers.js / 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() они дадут разные намехеши.
On-chain резолвинг
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 дорогостоящее.
Текстовые записи и профили
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, читается без дополнительной инфраструктуры.
Ориентиры по сложности интеграции
| Функция | Сложность | Срок |
|---|---|---|
| Отображение имени вместо адреса | Минимальная | 0.5 дня |
| Ввод ENS в поле перевода | Минимальная | 1 день |
| Аватар в UI | Низкая | 1 день |
| Текстовые записи / профиль | Низкая | 1-2 дня |
| On-chain резолвинг в контракте | Средняя | 2-3 дня |
Базовая интеграция ENS в существующий dApp — 2-3 рабочих дня.







