Інтеграція з ENS (Ethereum Name Service)
ENS — це de facto стандарт для людиночитаних адрес в екосистемі Ethereum. Замість розробки власного сервісу імен, більшість dApp просто інтегрують ENS: відображають імена замість адрес, приймають введення імен у полях переводу, показують аватари.
Розв'язування імен у коді
Frontend через ethers.js / viem
// ethers.js v6
const provider = new ethers.JsonRpcProvider(RPC_URL);
// Пряме розв'язування: ім'я → адреса
const address = await provider.resolveName("vitalik.eth");
// "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045"
// Зворотне розв'язування: адреса → ім'я
const name = await provider.lookupAddress("0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045");
// "vitalik.eth" або null, якщо зворотний запис не встановлен
// Аватар
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() вони дають різні namehashes.
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-профілів: все необхідне зберігається в resolver, читається без додаткової інфраструктури.
Орієнтири складності інтеграції
| Функція | Складність | Строк |
|---|---|---|
| Відображення імені замість адреси | Мінімальна | 0.5 дня |
| Введення ENS у поле переводу | Мінімальна | 1 день |
| Аватар у UI | Низька | 1 день |
| Текстові записи / профіль | Низька | 1-2 дні |
| On-chain розв'язування в контракті | Середня | 2-3 дні |
Базова інтеграція ENS в існуючий dApp — 2-3 робочих дні.







