Розробка кастомного доменного сервісу на блокчейні
Коли стандартні .eth або .bnb недостатньо — потрібен власний TLD для вашої екосистеми. .defi, .game, .dao, брендований суфікс типу .uniswap — це не просто назва, це точка входу в ідентичність екосистеми. Кастомний domain service дає повний контроль: ціноутворення, правила реєстрації, інтеграція управління, специфічні записи resolver для екосистеми.
Архітектурний вибір: форк ENS vs з нуля
Форк ENS — правильне рішення в 90% випадків. ENS пройшов аудит, має готові subgraphs, інтеграції з гаманцями, і ethers.js розуміє його нативно. Ключові частини які потрібно змінити:
Registry — практично без змін. Логіка володіння nodes універсальна.
BaseRegistrar — змінити TLD на свій, period grace і expiry policy — під потреби проекту.
ETHRegistrarController — перейменувати, змінити ціноутворення, можливо видалити commit-reveal (якщо не потрібна захист від front-running).
PublicResolver — додати кастомні типи записів специфічні для екосистеми.
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 по попиту: ціна зростає при високому попиту (як 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;
}
}
Інтеграція управління
Для DAO-управляємого namespace: зміни ціноутворення, додання нових TLD, зарезервовані імена — все через 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 модель
Варіанти монетизації:
Комісії за реєстрацію — основний джерело. 100% у скарбницю або розділяється зі stakers.
Комісії за поновлення — щорічно. Дає передбачуваний потік, мотивує зберігати популярні імена активними.
Royalty вторинного ринку — 2-5% від вторинних продаж (ERC-2981). Пасивний дохід від NFT торговлі.
Premium аукціони — коротка імена (1-3 символи) продаються через Vickrey або Dutch аукціон замість фіксованої ціни.
Інтеграція гаманця
Проблема кастомних доменів: гаманці не знають про них за замовчуванням. Рішення:
Rainbow kit, WalletConnect: підтримують будь-який EVM-сумісний ENS-fork якщо передати правильну адресу registry.
Universal Resolver: ENS L1 resolver може бути налаштований як gateway для кастомних namespace через CCIP-Read. Це дозволяє MetaMask та іншим гаманцям резолвити кастомні імена без змін на їх стороні.
Власне browser extension: для максимального контролю — але високий поріг адаптації.
Стек
| Компонент | Технологія |
|---|---|
| Контракти | 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 |
| Механізм аукціону | Vickrey або Dutch auction контракт |
Сроки розробки
Фаза 1 — Core контракти (4-6 тиж): Registry + Resolver + BaseRegistrar + PriceOracle + Controller. Адаптація ENS форка.
Фаза 2 — Розширені функції (2-4 тиж): кастомні типи resolver, інтеграція управління, premium аукціон.
Фаза 3 — Інфраструктура (2-3 тиж): The Graph subgraph, resolution SDK, CCIP-Read gateway.
Фаза 4 — Frontend (2-4 тиж): реєстраційний UI, управління доменом, інтеграція маркетплейсу.
Аудит (2-4 тиж): обов'язковий, реєстратор приймає ETH/токени.
Повний production-ready сервіс: 3-4 місяці. MVP з базовою реєстрацією: 6-8 тиж.







