ENS — Ethereum Name Service — started as a way to replace long Ethereum addresses with human-readable names like alice.eth. It has grown into a comprehensive naming system that dApps use for far more than address lookup. Understanding what ENS actually stores, how resolution works, and what the wildcard and subname features enable is the difference between "I have an ENS name" and "I understand what ENS is doing under the hood."
The three-layer architecture
ENS has three main components that work together:
**Registry**: the central smart contract that maps a name (like alice.eth) to two pieces of information: who owns it and which resolver it uses. The registry is minimal — it doesn't know anything about the actual data associated with the name.
**Resolvers**: separate contracts that hold the actual data — the Ethereum address, avatar URL, social media handles, etc. Each name points to a resolver, and the resolver holds the records.
**Registrar**: the contract that manages registration and renewal — who can register alice.eth, at what price, for how long. Different top-level domains (.eth, .com via DNS, others) have different registrars.
This separation is deliberate. A user can update their records (change their avatar, add a social handle) without touching the registry. A user can migrate to a new resolver contract if a better one exists, without changing their name.
Records: more than just addresses
The default resolver stores a variety of record types:
- **Address records**: an Ethereum address (address()), plus specialized records for other chains (Bitcoin address, Solana address, etc.)
- **Text records**: arbitrary key-value pairs. Common keys: avatar, url, email, description, twitter, github, discord, notice, keywords, com.reddit, com.discord, etc.
- **Content hash**: an IPFS or Skynet hash — this is how ENS supports decentralized websites (alice.eth resolves to an IPFS site).
- **DNSSEC records**: for legacy DNS integration.
When you look up alice.eth, you don't just get an address. You can query any of these records. Most wallets show at least the avatar (image), and dApps like Farcaster use text records for social handles.
Wildcards and subnames
Subnames are ENS entries below a parent name — like alice.example.eth, bob.example.eth. They're first-class ENS entries with their own resolvers and records.
Wildcards let a single resolver serve all subnames under a domain without registering each one on-chain. If example.eth's resolver implements wildcards, then any *.example.eth resolution goes through the same resolver logic, which can compute the answer dynamically.
This is a big deal for large projects. A gaming platform might want to give every user a name like username.game.eth without paying to register each name. With wildcards, the platform registers game.eth once, deploys a wildcard resolver, and every user gets a free-feeling subname that resolves to their actual address.
Coinbase uses this pattern extensively — cb.id addresses (like alex.cb.id) are wildcards resolved via Coinbase's infrastructure without individual on-chain registrations.
The resolution flow
When a dApp needs to resolve alice.eth:
1. Query the ENS Registry contract with the namehash of alice.eth. 2. The registry returns the resolver address for alice.eth. 3. Query the resolver for the specific record you want (address, avatar, etc.). 4. The resolver returns the value.
For subnames like bob.company.eth: 1. Query the registry for the resolver of company.eth. 2. If the resolver implements wildcard resolution, it can answer for any subname. 3. Otherwise, the registry has a specific record for bob.company.eth pointing to a specific resolver.
Modern dApps use libraries (ethers.js, viem, wagmi) that handle this resolution automatically. You write `await provider.resolveName("alice.eth")` and the library handles the multi-step lookup.
CCIP-Read and offchain resolution
Standard ENS resolvers store all data on-chain. CCIP-Read (EIP-3668) is an extension that lets resolvers point to off-chain data sources — the resolver returns a "gateway URL," the client queries that URL, and the resolver validates the returned data cryptographically.
This is what enables Coinbase's cb.id subnames — the resolver on-chain says "for any *.cb.id, ask Coinbase's server." Coinbase's server responds with the address, which the client validates. Zero on-chain state per subname.
CCIP-Read is what makes ENS scalable to millions of subnames without proportionally scaling on-chain storage.
What dApps do with ENS
The obvious use case: display alice.eth instead of 0xabc... when showing addresses.
Beyond that:
- **Social profiles**: apps like Farcaster, Lens, and mirror use ENS text records to link social handles and profile data.
- **Avatars**: the "avatar" text record is standardized to point to an image URL, NFT reference, or IPFS content. Wallets show this automatically.
- **Payments**: services like Coinbase Wallet let users send crypto by typing "alice.eth" instead of an address.
- **Sponsored transactions**: some services use ENS reverse resolution to identify users for gasless UX.
- **Verification**: some tools use ENS to prove that a specific address controls a specific name (via signature over the ENS registration).
Reverse resolution: address to name
Forward resolution: alice.eth → 0xabc... Reverse resolution: 0xabc... → alice.eth
Reverse resolution is what wallets use to show your ENS name instead of your address. It requires two things: you own an ENS name, and you set that name as your "primary" name via the reverse resolver.
Not every address has a reverse record. Many users own ENS names without ever setting the primary. Wallets like Rabby check reverse records and display names when they find them.
Registrations, renewals, and expiries
The .eth TLD uses an auction-like registration process. To register alice.eth:
1. Commit — announce your intent to register (with a hidden secret to prevent front-running). 2. Wait 60 seconds. 3. Register — pay the annual fee (denominated in USD, paid in ETH at current rate).
Fees scale by name length: 5+ character names cost $5/year, 4-character names cost $160/year, 3-character names cost $640/year. This is fixed at the protocol level, not adjustable per name.
Names expire annually unless renewed. Renewal is straightforward — pay the same fee to extend by a year. After expiry, there's a grace period (90 days) during which only the previous owner can renew. After that, the name goes back into the auction pool and anyone can re-register.
ENS beyond Ethereum
ENS names can hold addresses for many chains (Bitcoin, Solana, Cosmos, etc.) via specialized records. But the ENS registry itself lives on Ethereum. A wallet on Bitcoin or Solana that supports ENS still queries Ethereum to resolve names.
Layer 2 ENS is emerging. Base's basenames use ENS infrastructure (basenames are essentially subnames of base.eth resolved via CCIP-Read on Base). Optimism has similar patterns. This gives L2s ENS support without requiring users to interact with mainnet.
The security angle
Attackers use lookalike ENS names for phishing. If your ENS name is alice.eth, an attacker might register ałice.eth (with a Polish ł that looks similar) and try to trick people into sending funds there.
Wallets that check Unicode homoglyphs partially defend against this. But the concept — that ENS names can be spoofed visually — is worth knowing.
Also worth knowing: ENS name ownership can be transferred. When you set up a transaction to alice.eth, you're trusting that alice.eth currently resolves to the address you think. If alice sold her name and the new owner points it to their own address, your transaction goes to the new owner. Always verify what an ENS name resolves to for large or unusual transactions.
Why this matters
ENS started as address abbreviation. It's become the identity layer for a growing part of the Ethereum ecosystem. Social apps, wallets, cross-chain address resolution, dApp UX for user identification — all increasingly assume ENS is present.
For users, having an ENS name is one of the cheapest and highest-value upgrades to your on-chain identity. Setting reverse resolution takes a minute and makes your address recognizable in every wallet.
For dApp builders, treating ENS as first-class from day one is the standard pattern in 2026.



