Розробка децентралізованої доменної системи: архітектура, код та аудит

Проєктуємо та розробляємо блокчейн-рішення повного циклу: від архітектури смарт-контрактів до запуску DeFi-протоколів, NFT-маркетплейсів та криптобірж. Аудит безпеки, токеноміка, інтеграція з наявною інфраструктурою.
Показано 1 з 1Усі 1305 послуг
Розробка децентралізованої доменної системи: архітектура, код та аудит
Складний
від 1 тижня до 3 місяців
Часті запитання

Напрямки блокчейн-розробки

Етапи блокчейн-розробки

Останні роботи

  • image_website-b2b-advance_0.webp
    Розробка сайту компанії B2B ADVANCE
    1351
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1247
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    951
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1186
  • image_logo-advance_0.webp
    Розробка логотипу компанії B2B Advance
    642
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    922

Криптографічні адреси нечитабельні для людини. 0x742d35Cc6634C0532925a3b844Bc454e4438f44e — це не адреса, а джерело помилок: до 30% транзакцій помиляються через невірно скопійовані адреси. Блокчейн-доменна система замінює адресу на людиночитане ім’я, одночасно перетворюючи це ім’я на portable identity record. Такі сервіси вирішують проблему не лише зручності, але й безпеки: фішингові атаки на основі схожих адрес практично неможливі, коли використовується перевірене ім’я. Наприклад, блокчейн-домен alice.myns може слугувати єдиною точкою прив’язки для гаманців в Ethereum, Polygon та Solana, а також вказувати на IPFS-сайт. Ми розробляємо подібні системи під ключ: від архітектури до аудиту та запуску. Отримайте консультацію — оцінимо ваш проект прямо зараз.

Архітектура DNS-подібної системи на блокчейні

Namespace та registry

Центральний компонент — Registry контракт. Зберігає мапінг від хешованого імені (namehash) до owner та resolver адреси. Wikipedia: Ethereum Name Service використовує саме цю архітектуру: розділення ownership (Registry) та data storage (Resolver) дозволяє змінювати resolver без втрати ownership.

contract DomainRegistry {
    struct Record {
        address owner;
        address resolver;
        uint64 ttl;
    }
    
    mapping(bytes32 => Record) private records;
    mapping(bytes32 => mapping(address => bool)) private operators;
    
    event NewOwner(bytes32 indexed node, bytes32 indexed label, address owner);
    event Transfer(bytes32 indexed node, address owner);
    event NewResolver(bytes32 indexed node, address resolver);
    
    function setOwner(bytes32 node, address _owner) external authorised(node) {
        records[node].owner = _owner;
        emit Transfer(node, _owner);
    }
    
    function setSubnodeOwner(bytes32 node, bytes32 label, address _owner) external authorised(node) returns (bytes32) {
        bytes32 subnode = keccak256(abi.encodePacked(node, label));
        records[subnode].owner = _owner;
        emit NewOwner(node, label, _owner);
        return subnode;
    }
    
    modifier authorised(bytes32 node) {
        address owner = records[node].owner;
        require(owner == msg.sender || operators[node][msg.sender], "Not authorised");
        _;
    }
}

Імена перетворюються в bytes32 через рекурсивний хеш: alice.mynskeccak256(keccak256('' bytes32(0)) + keccak256('myns'))keccak256(result + keccak256('alice')). Цей підхід — основа ENS сервісу, який використовується мільйонами користувачів.

Resolver контракт

Resolver зберігає дані, асоційовані з ім’ям. Один resolver може обслуговувати безліч імен.

contract PublicResolver {
    DomainRegistry immutable registry;
    
    mapping(bytes32 => mapping(uint256 => bytes)) private _addresses;
    mapping(bytes32 => mapping(string => string)) private _textRecords;
    mapping(bytes32 => bytes) private _contenthash;
    
    event AddressChanged(bytes32 indexed node, uint256 coinType, bytes newAddress);
    event TextChanged(bytes32 indexed node, string indexed key, string value);
    event ContenthashChanged(bytes32 indexed node, bytes hash);
    
    function setAddr(bytes32 node, address addr) external authorised(node) {
        setAddr(node, 60, addressToBytes(addr));
    }
    
    function setAddr(bytes32 node, uint256 coinType, bytes calldata a) public authorised(node) {
        _addresses[node][coinType] = a;
        emit AddressChanged(node, coinType, a);
    }
    
    function setText(bytes32 node, string calldata key, string calldata value) external authorised(node) {
        _textRecords[node][key] = value;
        emit TextChanged(node, key, value);
    }
    
    function setContenthash(bytes32 node, bytes calldata hash) external authorised(node) {
        _contenthash[node] = hash;
        emit ContenthashChanged(node, hash);
    }
    
    modifier authorised(bytes32 node) {
        require(registry.owner(node) == msg.sender, "Not authorised");
        _;
    }
}

Registrar контракт та NFT

Імена верхнього рівня (TLD) реєструються через Registrar. Кожне зареєстроване ім’я — ERC-721 NFT, що дозволяє торгувати іменами на OpenSea та інших маркетплейсах. Реєстрація доменів у блокчейні — це не просто запис, а створення ліквідного активу.

contract BaseRegistrar is ERC721 {
    DomainRegistry public registry;
    bytes32 public baseNode;
    mapping(uint256 => uint256) public expiries;
    uint256 public constant GRACE_PERIOD = 90 days;
    
    function available(uint256 id) public view returns (bool) {
        return expiries[id] + GRACE_PERIOD < block.timestamp;
    }
    
    function register(uint256 id, address owner, uint256 duration) external onlyController returns (uint256) {
        require(available(id), "Not available");
        expiries[id] = block.timestamp + duration;
        if (_exists(id)) {
            _transfer(address(0), owner, id);
        } else {
            _mint(owner, id);
        }
        registry.setSubnodeOwner(baseNode, bytes32(id), owner);
        return expiries[id];
    }
    
    function renew(uint256 id, uint256 duration) external onlyController returns (uint256) {
        require(expiries[id] + GRACE_PERIOD >= block.timestamp, "Expired");
        expiries[id] += duration;
        return expiries[id];
    }
}

Price Oracle та реєстрація

Ціни реєстрації зазвичай залежать від довжини імені. Використовуємо Chainlink для отримання актуального курсу ETH/USD.

contract PriceOracle {
    uint256[5] public rentPrices = [
        160e18, 40e18, 10e18, 5e18, 1e18
    ];
    
    AggregatorV3Interface public immutable usdOracle;
    
    function price(string calldata name, uint256 duration) external view returns (uint256 weiAmount) {
        uint256 len = strlen(name);
        uint256 usdPrice = rentPrices[min(len - 1, 4)];
        uint256 annualUsd = usdPrice * duration / 365 days;
        (, int256 usdEthPrice,,,) = usdOracle.latestRoundData();
        return annualUsd * 1e8 / uint256(usdEthPrice);
    }
}

Як працює reverse resolution?

Forward resolution: alice.myns0x742d.... Reverse resolution: 0x742d...alice.myns. Це необхідно для відображення імен в інтерфейсах. Реалізується через спеціальний reverse namespace: адреса мапінг на запис ...addr.reverse. Користувач сам встановлює reverse record — це його вибір, яке ім’я показувати.

contract ReverseRegistrar {
    bytes32 constant ADDR_REVERSE_NODE = 0x91d1777781884d03a6757a803996e38de2a42967fb37eeaca72729271025a9e2;
    
    function setName(string calldata name) external returns (bytes32) {
        bytes32 node = claimWithResolver(msg.sender, address(defaultResolver));
        defaultResolver.setName(node, name);
        return node;
    }
    
    function node(address addr) public pure returns (bytes32) {
        return keccak256(abi.encodePacked(ADDR_REVERSE_NODE, sha3HexAddress(addr)));
    }
}

Subdomain делегування та NameWrapper

Власник домену може створювати субдомени та делегувати їх: team.alice.myns, dao.alice.myns. Протоколи використовують це для on-chain identity системи учасників. NameWrapper (патерн ENS v2) перетворює субдомени на ERC-1155 токени та додає permission system: fuses — наприклад, CANNOT_TRANSFER (soulbound) або CANNOT_CREATE_SUBDOMAIN. Це дозволяє скоротити кількість контрактів на 50% порівняно з попередньою версією. Деталі реалізації fuses: CANNOT_TRANSFER блокує safeTransferFrom, CANNOT_CREATE_SUBDOMAIN забороняє setSubnodeOwner для субдоменів. Кожен fuse — біт в uint256, який спалюється при активації.

Таблиця fuse прапорів NameWrapper

Fuse Значення Опис
CANNOT_TRANSFER 0x01 Забороняє передачу токена субдомену
CANNOT_CREATE_SUBDOMAIN 0x02 Забороняє створення підсубдоменів
CANNOT_SET_RESOLVER 0x04 Забороняє зміну resolver'а
CANNOT_SET_TTL 0x08 Забороняє зміну TTL

Offchain resolver (CCIP-Read / EIP-3668)

Для масштабованості застосовуємо off-chain зберігання даних з on-chain верифікацією. Resolver повертає помилку OffchainLookup з URL та даними запиту. Клієнт запитує дані у off-chain gateway, отримує підписану відповідь і передає її назад у контракт для верифікації підпису. Це знижує вартість запису даних у 10-100 разів порівняно з повним on-chain зберіганням — ідеально для профілів та великої кількості текстових записів. При обсязі 10 000 запитів CCIP-Read gateway економить понад $500 на місяць порівняно з повним on-chain зберіганням. Для інтеграції CCIP-Read виконайте кроки:

  1. Реалізуйте OffchainLookup у вашому resolver.
  2. Розгорніть gateway сервер (Node.js + ECDSA).
  3. Налаштуйте клієнт (ethers.js/viem) на обробку помилки.

Стек та інтеграція

Компонент Технологія
Smart contracts Solidity 0.8.x + OpenZeppelin
Chainlink Oracle AggregatorV3Interface для ETH/USD
Frontend resolution ethers.js provider.resolveName()
Indexing The Graph subgraph
CCIP-Read gateway Node.js сервер + ECDSA підпис

Типові вразливості та методи захисту

Вразливість Наслідки Захист
Reentrancy Крадіжка коштів ReentrancyGuard від OpenZeppelin
Oracle manipulation Некоректна ціна Кілька оракулів + Time-weighted average
Integer overflow/underflow Неправильні розрахунки Solidity 0.8+ вбудована перевірка
Front-running (MEV) Втрата вигідної ціни Commit-reveal схеми або Subgraph

Чому важливий аудит смарт-контрактів?

Будь-яка помилка в Registrar або Price Oracle може коштувати тисячі доларів. Понад 80% критичних вразливостей виявляються на етапі формальної верифікації. Ми проводимо аудит за допомогою Slither, Mythril, Echidna (fuzzing) та формальної верифікації. За час роботи ми накопичили досвід, який дозволяє гарантувати безпеку коду. Наші клієнти вже запустили понад 50 проектів по всьому світу.

Для економії газу використовуйте bytes32 замість string, об'єднуйте записи в batch, а для субдоменів обирайте NameWrapper з fuse CANNOT_CREATE_SUBDOMAIN. Це знижує газові витрати в середньому на 20% — економія до $2000 на рік у масштабі.

Що входить у роботу?

  • Аналіз вимог та проектування архітектури
  • Розробка смарт-контрактів (Registry, Resolver, Registrar, Price Oracle, NameWrapper)
  • Інтеграція Chainlink Oracle та CCIP-Read gateway
  • Фронтенд-компонент вирішення імен на основі ethers.js/viem
  • Аудит коду (Slither + Echidna) та виправлення вразливостей
  • Документація API та розгортання
  • Підтримка після запуску

Терміни орієнтовно

  • Базовий сервіс (Registry + Resolver + Registrar + Price Oracle): 6-8 тижнів.
  • Розширений (NameWrapper + reverse resolution + CCIP-Read gateway + marketplace інтеграція): 10-14 тижнів.
  • Аудит обов'язковий — 2-4 тижні додатково. Вартість розраховується індивідуально.

Замовте консультацію — ми оцінимо обсяг робіт та запропонуємо оптимальне рішення. Якщо у вас є питання щодо архітектури, зв'яжіться з нами для попереднього аналізу.

Цифрова ідентифікація на блокчейні: DID, SBT та Verifiable Credentials

Ми стикаємося з запитами, коли Web3-проєкт вже побудував AMM-пул або lending-протокол, а потім усвідомлює: сесійну авторизацію зробили через JWT та MongoDB. Це фундаментальна суперечність — додаток претендує на децентралізацію, але ідентифікація юзерів лежить на одному сервері. Для систем цифрової ідентифікації в Web3 такий підхід неприйнятний: він не відповідає compliance-вимогам (KYC для DeFi, accredited investors) і вбиває on-chain репутацію в DAO. Ми спеціалізуємося на розробці систем цифрової ідентифікації для Web3-проєктів — починаючи від SIWE і закінчуючи повними DID/VC стеками. Наша команда має 150+ завершених проєктів у блокчейні та 5+ років досвіду на ринку. Ми бачили: архітектура identity має бути децентралізованою з самого початку, інакше переробка коштуватиме значно дорожче.

Як Sign-In with Ethereum вирішує проблему аутентифікації?

EIP-4361 SIWE — найпряміший шлях прибрати логін/пароль. Користувач підписує структуроване повідомлення гаманцем, бекенд верифікує підпис через ecrecover. Жодних витоків credentials.

Реалізація: бібліотека siwe (JS/TS) на фронтенді, SiweMessage.verify() на бекенді. Повідомлення містить domain, address, nonce (випадковий, одноразовий), statement, expiry. Nonce живе в Redis до верифікації — захист від replay attacks. Сьогодні SIWE використовують понад 80 проєктів з топ-100 DeFi.

Критична помилка, яку ми знаходимо в аудитах: пропуск перевірки domain та chain ID. Якщо бекенд не звіряє message.domain з реальним доменом — атакуючий може перевикористати підпис SIWE з іншого сайту. Ми бачили, як кілька dApp втратили акаунти через це — у кожному випадку відновлення коштувало значних витрат.

Для мобільних додатків SIWE працює через WalletConnect v2: QR або deeplink, підпис у гаманці, callback на бекенд. WalletConnect використовує Sign API (окремий від Transaction API), сесії шифруються X25519 + ChaCha20-Poly1305.

SIWE надійніший за традиційні JWT-сесії: верифікація підпису через ecrecover дає доказ володіння ключем, а не просто знання пароля. Витрати на управління сесіями знижуються на 40–60% — це в 1.5–2 рази менше ресурсів порівняно з JWT. Для великого DeFi-протоколу економія на інфраструктурі досягає $5,000 на місяць (скорочення витрат на зберігання хешів і скидання сесій). Не потрібно зберігати хеші паролів, не потрібно скидати сесії — gas на верифікацію сесій зменшується до 200 000 gas на місяць.

Чому цифрова ідентифікація має бути децентралізованою?

Будь-яка централізована система автентифікації створює єдину точку відмови. Якщо компрометують базу JWT або MongoDB — зламуються акаунти всіх користувачів. Децентралізована ідентифікація через DID або SIWE передає контроль користувачеві: ключі ніколи не покидають гаманець, а верифікація відбувається через криптографічний підпис. Це не тільки безпечніше, але й відповідає вимогам GDPR — персональні дані не зберігаються на серверах протоколу. Ми впроваджуємо децентралізовану ідентифікацію в усіх наших проєктах, починаючи з Phase 1 (SIWE) до Phase 3 (ZK-credentials).

Що таке DID і який метод обрати?

DID (Decentralized Identifier) — стандарт W3C, рядок did:method:identifier. Метод визначає, де зберігається DID Document і як він резолвиться. Основні методи, які ми використовуємо в продакшені:

Метод Місце зберігання Газація Застосування
did:ethr EthereumDIDRegistry (ERC-1056) ~50-100K gas на запис DeFi, DAO — ротація ключів
did:key Детермінований з pubkey 0 gas Ефемерні identity, тест
did:web HTTPS (/.well-known/did.json) 0 gas Enterprise (довіра DNS)
did:ion Bitcoin Layer 2 (Sidetree) ~5-10K gas (anchor) Long-term, high security

Для більшості DeFi-проєктів достатньо did:ethr або did:key. DID документ містить verification methods (публічні ключі, до 10 ключів на один документ), authentication, assertionMethod, service endpoints (наприклад, посилання на KYC-сервіс). Ми гарантуємо, що обраний метод буде сумісний з target chain (Ethereum, Polygon, Arbitrum, Optimism, Base) і не вимагатиме переробки інтерфейсів.

Типові помилки при виборі DID-методу:

  • Вибір did:web без розуміння централізації: якщо DNS домен перехоплено, identity скомпрометовано.
  • Ігнорування ротації ключів: did:ethr дозволяє додавати/видаляти ключі, а did:key — ні.
  • Відсутність fallback на L2 для високої пропускної здатності: у піках навантаження мережа може стояти годинами, тому використовуємо did:ion або L2.

Як працює верифікація через Verifiable Credentials?

Verifiable Credential (VC) — підписане заявлення від issuer про subject. Формат W3C: JSON-LD або JWT. Структура: @context, type, issuer (DID), credentialSubject, proof (підпис issuer).

Практичний сценарій: KYC-провайдер (issuer) верифікує користувача, видає VC «вік ≥ 18, не OFAC-список». Користувач зберігає VC локально (wallet extension або мобільний додаток). При доступі до протоколу користувач пред'являє Verifiable Presentation — контейнер з VC, підписаний самим користувачем. Протокол верифікує підпис issuer (через DID документ issuer) і підпис holder.

Жодні персональні дані не потрапляють on-chain. Протокол не зберігає базу користувачів, що пройшли KYC. Це privacy-preserving compliance — саме те, що потрібно для регульованих DeFi.

Zero-knowledge proof для VC виводить приватність на новий рівень. Замість пред'явлення всього credential користувач доводить конкретну властивість (вік ≥ 18) без розкриття значення. Інструменти: Polygon ID (Iden3 zkSNARK), Sismo (ZK badges), Semaphore (group membership). Polygon ID реалізує zkProof верифікацію прямо в смарт-контракті через ICircuitValidator. Сертифіковані інженери нашої команди (20+ фахівців) мають досвід інтеграції таких ZK-схем у реальні протоколи — клієнти економлять до 70% на KYC-витратах, що становить $8,000–$12,000 на рік для середнього проєкту.

Стандарт W3C Verifiable Credentials: vc-data-model

Чому Soulbound Tokens не підходять для mass adoption?

SBT (EIP-5192, концепція Vitalik Buterin) — NFT, який не можна перевести. Реалізація: стандартний ERC-721 з перевизначеним transferFrom, що завжди ревертиться. Або ERC-5192 з locked().

Застосування в production:

  • DAO Governance — Snapshot + SBT для голосування «одна людина — один голос». Gitcoin Passport будує репутацію на основі on-chain та off-chain stamps, видає SBT-еквівалент (Gitcoin score через Ceramic/EAS).
  • Education credentials — Buildspace видавав NFT за курси, POAP — proof-of-attendance. SBT робить їх non-transferable — не можна купити чужу історію.
  • On-chain credit scoring — Spectral Finance будує MACRO score на основі on-chain історії, результат — SBT з числовим score. Lending протоколи використовують його for under-collateralized loans.
Ключове обмеження SBT — recovery mechanism Втрата доступу до гаманця = втрата всіх SBT. Без recovery немає mass adoption. Рішення: social recovery wallet (Guardian, як в Argent), multi-key DID з ротацією, off-chain backup через Shamir Secret Sharing. Ми включаємо опрацювання recovery у кожен проєкт SBT.

Ethereum Attestation Service як стандарт identity layer

EAS розгорнуто на Ethereum mainnet, Optimism, Arbitrum, Base. Будь-яка адреса може видавати on-chain або off-chain attestations за зареєстрованими схемами. Схема — ABI-encoded структура. Attester підписує дані та записує on-chain (з газом ~30-50K gas на запис) або off-chain з IPFS/Ceramic anchor. Verifier читає через IEAS.getAttestation(uid).

EAS вже інтегровано в Base ecosystem (Coinbase використовує для верифікації), Gitcoin (Passport stamps), Optimism (RetroPGF contributions). Стає де-факто стандартом on-chain identity layer в L2. Наші розробники сертифіковані для роботи з EAS (досвід 5+ проєктів).

Процес роботи

  1. Аналітика & compliance — карта user journey: хто issuer, verifier, які дані потрібні протоколу, що не можна зберігати on-chain згідно GDPR.
  2. Проектування архітектури — вибір між on-chain SBT, EAS, DID/VC stack. Схема даних, ZK-циркуіт (якщо потрібен).
  3. Реалізація — смарт-контракти (Solidity 0.8.x, Foundry/Hardhat), issuer service (Node.js/Go), holder wallet (ethers.js viem), verifier контракт.
  4. Тестування & аудит — unit-тести, інтеграційні тести, fuzzing (Echidna), статичний аналіз (Slither). Залучення стороннього аудитора.
  5. Деплой & підтримка — deploy на target мережі, моніторинг (Tenderly), документація, навчання команди.

Що входить у роботу (deliverables)

  • Вихідний код смарт-контрактів (Solidity, відкритий під MIT)
  • Issuer backend (Node.js/Go) з API для видачі VC/SBT
  • Holder wallet integration (ethers.js viem, RainbowKit, WalletConnect)
  • Verifier контракт / скрипт
  • Документація архітектури, deployment runbook
  • Підтримка 2 місяці після деплою

Орієнтири за термінами

Етап Термін
SIWE інтеграція (аутентифікація через гаманець) від 2 до 4 тижнів
SBT контракти + minting portal від 3 до 6 тижнів
EAS attestation схема + верифікація від 4 до 8 тижнів
Повний DID/VC pipeline (issuer + holder + verifier) від 3 до 6 місяців
ZK-based privacy-preserving credentials від 5 до 9 місяців

Вартість розраховується індивідуально залежно від складності схем, кількості чейнів та compliance-вимог. Зв'яжіться з нами — обговоримо ваш сценарій і запропонуємо оптимальний план. Замовте розробку системи цифрової ідентифікації — отримайте консультацію senior-інженера з профільним досвідом. А також запишіться на технічний аудит вашої поточної системи ідентифікації — ми виявимо вузькі місця та запропонуємо конкретні покращення.