ENS: резолв имён в адреса
Как через ethers v6 получить Ethereum-адрес по ENS-имени и проверить reverse record адреса.
Что делает ENS resolve
ENS связывает читаемое имя вроде vitalik.eth с Ethereum-адресом и другими записями. Для приложения это способ принимать имя пользователя вместо длинного 0x... адреса.
Резолв имени всегда нужно считать сетевым запросом: запись может отсутствовать, устареть или указывать на другой адрес.
Получаем адрес по ENS-имени
Создайте проект:
mkdir ens-resolve-demo
cd ens-resolve-demo
npm init -y
npm pkg set type="module"
npm install ethers
npm install --save-dev typescript tsx @types/node
mkdir srcСоздайте файл src/resolve-ens.ts:
import { ethers } from "ethers";
const provider = new ethers.JsonRpcProvider("https://ethereum-rpc.publicnode.com");
const ensName = "vitalik.eth";
const vitalikAddress = "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045";
const resolvedAddress = await provider.resolveName(ensName);
if (resolvedAddress === null) {
throw new Error(`ENS name ${ensName} не указывает на Ethereum-адрес`);
}
console.log(`${ensName} -> ${resolvedAddress}`);
const reverseName = await provider.lookupAddress(vitalikAddress);
if (reverseName === null) {
console.log(`${vitalikAddress} не имеет reverse record`);
} else {
console.log(`${vitalikAddress} -> ${reverseName}`);
}
const normalizedResolved = resolvedAddress.toLowerCase();
const normalizedExpected = vitalikAddress.toLowerCase();
if (normalizedResolved === normalizedExpected) {
console.log("Forward resolve совпадает с ожидаемым адресом");
} else {
console.log("Forward resolve вернул другой адрес");
}Запустите:
npx tsx src/resolve-ens.tsКак это работает
JsonRpcProvider — подключается к Ethereum mainnet. ENS живёт в mainnet, поэтому для .eth имён нужен mainnet RPC.
resolveName("vitalik.eth") — читает ENS resolver и возвращает адрес или null.
lookupAddress(address) — делает reverse lookup: ищет primary ENS name для адреса.
toLowerCase() — нормализует адреса перед сравнением. Checksum-регистр может отличаться, но адрес остаётся тем же.
null — нормальный результат. Он означает, что записи нет или она не настроена для этого адреса.
Частые ошибки
Считаете ENS-имя адресом без проверки → всегда обрабатывайте null от resolveName().
Используете не mainnet RPC → большинство .eth записей находится в Ethereum mainnet, а не в локальной сети или L2.
Доверяете reverse lookup как доказательству владения → reverse record показывает имя, выбранное адресом, но не заменяет подпись владельца кошелька.
Что дальше
- Провайдер vs Сайнер — понять, почему ENS resolve не требует подписи
- MetaMask BrowserProvider — резолвить ENS в браузерном приложении
- EOA vs Contract Account — понять, какой адрес возвращает ENS