Разработка кастомного доменного сервиса на блокчейне
Когда стандартных .eth или .bnb недостаточно — нужен собственный TLD для экосистемы. .defi, .game, .dao, брендированный суффикс типа .uniswap — это не просто название, а точка входа в идентичность экосистемы. Кастомный domain service даёт полный контроль: ценообразование, правила регистрации, интеграция с governance, специфические resolver записи.
Архитектурный выбор: форк ENS vs с нуля
Форк ENS — правильное решение в 90% случаев. ENS прошёл аудит, имеет готовые субграфы, интеграции с кошельками, и ethers.js его понимает нативно. Ключевые части которые нужно изменить:
Registry — практически без изменений. Логика владения нодами универсальна.
BaseRegistrar — TLD изменить на свой, grace period и expiry policy — под нужды проекта.
ETHRegistrarController — переименовать, изменить pricing, возможно убрать commit-reveal (если не нужна защита от front-running).
PublicResolver — добавить кастомные record types специфичные для экосистемы.
NameWrapper — опционально, добавляет ERC-1155 субдомены и fuses.
Кастомные resolver записи
Для gaming домена нужны специфические данные:
// Расширяем PublicResolver кастомными полями
contract GamingResolver is PublicResolver {
// node => game_id => in-game address
mapping(bytes32 => mapping(uint256 => string)) private _gameAddresses;
// node => character stats (IPFS hash)
mapping(bytes32 => string) private _characterData;
event GameAddressChanged(bytes32 indexed node, uint256 gameId, string gameAddress);
function setGameAddress(
bytes32 node,
uint256 gameId,
string calldata gameAddress
) external authorised(node) {
_gameAddresses[node][gameId] = gameAddress;
emit GameAddressChanged(node, gameId, gameAddress);
}
function gameAddress(bytes32 node, uint256 gameId)
external view returns (string memory)
{
return _gameAddresses[node][gameId];
}
}
Кастомная pricing логика
Форк ENS использует линейную или ступенчатую цену по длине имени. Для кастомного сервиса можно добавить:
Dynamic pricing по demand: цена растёт при высоком спросе (как bonding curve).
Premium для коротких имён на старте: первые 30 дней после запуска — 10x цена, потом нормализуется. Предотвращает скупку коротких имён ботами.
Whitelist-фаза: до публичной продажи — регистрация только для holders определённого NFT или токена.
contract CustomPriceOracle {
uint256 public constant LAUNCH_PREMIUM_PERIOD = 30 days;
uint256 public launchTime;
// Premium множитель: снижается с 10x до 1x линейно за 30 дней
function getPremiumMultiplier() public view returns (uint256) {
if (block.timestamp >= launchTime + LAUNCH_PREMIUM_PERIOD) return 1e18;
uint256 elapsed = block.timestamp - launchTime;
uint256 premium = 10e18 - (9e18 * elapsed / LAUNCH_PREMIUM_PERIOD);
return premium;
}
function price(string calldata name, uint256 duration)
external view returns (uint256)
{
uint256 basePrice = getBasePrice(name, duration);
return basePrice * getPremiumMultiplier() / 1e18;
}
}
Governance интеграция
Для DAO-управляемого namespace: изменение pricing, добавление новых TLD, reserved names — всё через governance proposal.
contract DomainGovernor {
ICustomRegistry public registry;
ICustomPriceOracle public priceOracle;
// Только через governance timelock
function updatePrices(uint256[] calldata newPrices) external onlyTimelock {
priceOracle.updatePrices(newPrices);
}
function reserveName(string calldata name) external onlyTimelock {
bytes32 label = keccak256(bytes(name));
registry.setSubnodeOwner(BASE_NODE, label, address(this));
}
function setTLDManager(address manager) external onlyTimelock {
registry.setOwner(ROOT_NODE, manager);
}
}
Revenue модель
Варианты монетизации:
Registration fees — основной источник. 100% в treasury или разделяется с stakers.
Renewal fees — ежегодно. Даёт предсказуемый поток, мотивирует хранить активными популярные имена.
Secondary market royalty — 2-5% от вторичных продаж (ERC-2981). Пассивный доход от NFT торговли.
Premium auctions — короткие имена (1-3 символа) продаются через Vickrey auction или Dutch auction вместо фиксированной цены.
Кошелёк и wallet интеграция
Проблема кастомных доменов: кошельки не знают о них по умолчанию. Решения:
Rainbow kit, WalletConnect: поддерживают любой EVM-совместимый ENS-fork если передать правильный registry адрес.
Universal Resolver: ENS L1 resolver может быть настроен как gateway для кастомных namespace через CCIP-Read. Это позволяет MetaMask и другим кошелькам резолвить кастомные имена без изменений на их стороне.
Собственное browser extension: для максимального контроля — но высокий порог adoption.
Стек
| Компонент | Технология |
|---|---|
| Contracts | Solidity 0.8.x + ENS fork + OpenZeppelin |
| Subgraph | The Graph (AssemblyScript) |
| Resolution SDK | TypeScript, fork ENS.js |
| Frontend | React + wagmi + viem |
| CCIP-Read gateway | Node.js + Express |
| Auction механизм | Vickrey или Dutch auction контракт |
Сроки разработки
Фаза 1 — Core contracts (4-6 нед): Registry + Resolver + BaseRegistrar + PriceOracle + Controller. Адаптация ENS форка.
Фаза 2 — Extended features (2-4 нед): кастомные resolver типы, governance интеграция, premium auction.
Фаза 3 — Infrastructure (2-3 нед): The Graph subgraph, resolution SDK, CCIP-Read gateway.
Фаза 4 — Frontend (2-4 нед): registration UI, domain management, marketplace интеграция.
Аудит (2-4 нед): обязателен, регистратор принимает ETH/токены.
Полный production-ready сервис: 3-4 месяца. MVP с базовой регистрацией: 6-8 недель.







