китаев.tech

ENS: резолв имён в адреса

Как через ethers v6 получить Ethereum-адрес по ENS-имени и проверить reverse record адреса.

Что делает ENS resolve

ENS связывает читаемое имя вроде vitalik.eth с Ethereum-адресом и другими записями. Для приложения это способ принимать имя пользователя вместо длинного 0x... адреса.

Резолв имени всегда нужно считать сетевым запросом: запись может отсутствовать, устареть или указывать на другой адрес.


Получаем адрес по ENS-имени

Создайте проект:

bash
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:

typescript
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 вернул другой адрес");
}

Запустите:

bash
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 показывает имя, выбранное адресом, но не заменяет подпись владельца кошелька.


Что дальше

Материалы китаev.tech публикуются в образовательных целях и не являются инвестиционной рекомендацией. Примеры кода и описания протоколов — для обучения; использование в продакшне на ваш собственный риск. Дисклеймер и политика конфиденциальности.