Розробка системи профілів на базі ENS
ENS зберігає не лише адреси — resolver підтримує довільні текстові записи, IPFS contenthash, мультичейн адреси. Це готова інфраструктура для децентралізованої ідентичності: користувач управляє своїм профілем через ENS, додатки читають дані без централізованого сховища.
Структура ENS профілю
Стандартні поля відповідно до EIP-634:
interface ENSProfile {
// Основна ідентичність
name: string; // ім'я для відображення
description: string; // біографія
avatar: string; // URL або IPFS hash зображення
// Контакт
email: string;
url: string; // веб-сайт
// Соціальне
"com.twitter": string;
"com.github": string;
"com.discord": string;
"org.telegram": string;
"com.reddit": string;
// Професійне
keywords: string; // теги розділені комами
notice: string; // публічне оголошення
}
Читання профілю
import { createPublicClient, http } from "viem";
import { mainnet } from "viem/chains";
import { normalize } from "viem/ens";
const client = createPublicClient({ chain: mainnet, transport: http(RPC_URL) });
async function getENSProfile(nameOrAddress: string) {
let ensName: string | null = null;
// Визначаємо: це ім'я або адреса?
if (nameOrAddress.endsWith(".eth")) {
ensName = normalize(nameOrAddress);
} else {
ensName = await client.getEnsName({ address: nameOrAddress as `0x${string}` });
}
if (!ensName) return null;
const [avatar, textRecords] = await Promise.all([
client.getEnsAvatar({ name: ensName }),
Promise.all([
client.getEnsText({ name: ensName, key: "description" }),
client.getEnsText({ name: ensName, key: "com.twitter" }),
client.getEnsText({ name: ensName, key: "com.github" }),
client.getEnsText({ name: ensName, key: "url" }),
]),
]);
return {
name: ensName,
avatar,
description: textRecords[0],
twitter: textRecords[1],
github: textRecords[2],
website: textRecords[3],
};
}
Резолюція аватара
ENS підтримує кілька форматів аватара:
- HTTP/HTTPS URL:
https://example.com/avatar.png - IPFS:
ipfs://QmHash... - NFT посилання:
eip155:1/erc721:0xContractAddr/tokenId— автоматично читає tokenURI
// viem getEnsAvatar автоматично обробляє всі формати
// і повертає кінцевий URL зображення
const avatarUrl = await client.getEnsAvatar({ name: "vitalik.eth" });
Для NFT аватарів: бібліотека запитує tokenURI → парсить metadata → повертає URL зображення. Важливо: NFT має належати власнику імені ENS — інакше аватар не відображається.
Запис профілю
import { createWalletClient, custom } from "viem";
const walletClient = createWalletClient({
chain: mainnet,
transport: custom(window.ethereum),
});
// Адреса ENS Public Resolver (mainnet)
const RESOLVER = "0x231b0Ee14048e9dCcD1d247744d114a4EB5E8E63";
const ENS_ABI = [...] // ABI resolver
const { request } = await client.simulateContract({
address: RESOLVER,
abi: ENS_ABI,
functionName: "setText",
args: [namehash("alice.eth"), "description", "DeFi розробник"],
account: walletClient.account,
});
await walletClient.writeContract(request);
Кеширування та продуктивність
Дані ENS змінюються рідко. Агресивне кеширування виправдане:
| Поле | TTL кеша |
|---|---|
| Адреса (forward resolution) | 10 хвилин |
| Зворотна резолюція | 10 хвилин |
| Аватар | 1 година |
| Текстові записи | 30 хвилин |
Для додатків з високою нагрузкою — Redis кеш перед RPC вишиванням. Розмір кеша мінімальний (кілька KB на профіль), можна зберігати тисячі профілів.
Верифікація пов'язаних акаунтів
Верифікація Twitter/GitHub в ENS — користувач вказує хендл, але будь-хто може написати будь-який хендл. Для верифікації потрібен додатковий крок:
Перевірка через Keybase / Lens Protocol: користувач публікує криптографічне доказ (підпис гаманця) в Twitter/GitHub. Верифікатори (Keybase, Lens) перевіряють володіння.
EAS attestation: довірений верифікатор видає attestation "адреса X володіє Twitter @Y" через EAS. Профіль читає attestation, не просто текстовий запис.
Розробка системи ENS-профілів з читанням даних, кешуванням, резолюцією аватара і верифікацією пов'язаних акаунтів — 1-3 тижні в залежності від глибини функцій.







