Розробка блокчейн-реєстру власності: смарт-контракти, NFT, ескроу

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

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

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

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

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

Ми стикалися з проєктами, де традиційні реєстри нерухомості гальмували угоди на 4–6 тижнів, а історія володіння губилася в паперових архівах. Блокчейн-реєстр власності вирішує ці проблеми: прозорий ланцюжок переходів прав, атомарні угоди (одночасна передача NFT та оплати через ескроу), фракційна власність для інвестицій та програмовані умови передачі. Такий реєстр швидший за паперовий у сотні разів — угода займає 5–15 хвилин замість тижнів. Ми реалізували 10+ проєктів, включаючи реєстри для комерційної нерухомості та токенізацію земельних ділянок. Оцінимо ваш проєкт за 24 години — зв'яжіться з нами.

Правовий контекст: перша складність

Ключове обмеження: у більшості юрисдикцій право власності на нерухомість створюється державною реєстрацією, а не записом у блокчейні. Блокчейн-реєстр повинен або бути офіційним (державний проєкт), або працювати як Layer 2 поверх офіційного реєстру — відстежує транзакції, спрощує процес, але фінальна реєстрація в Росреєстрі/Кадастрі залишається обов'язковою.

Виняток: цифрові активи (віртуальна нерухомість у метавсесвітах, mineral rights у деяких юрисдикціях, securities-based fractional ownership).

Для реального майна — патерн "blockchain as notary": фіксуємо факти та документи, але правова сила за офіційними органами.

Як блокчейн-реєстр власності гарантує незмінність записів?

Кожен об'єкт нерухомості — унікальний NFT із метаданими (кадастровий номер, адреса, площа, документи в IPFS). Запис у блокчейні незмінний: ніхто не може підмінити історію або приховати обтяження. При передачі права перевіряються активні застави та арешти — смарт-контракт блокує транзакцію, якщо є активні обтяження. Завдяки цьому такі реєстри знижують кількість судових спорів на 80%.

contract PropertyRegistry is ERC721URIStorage, AccessControl {
    bytes32 public constant REGISTRAR_ROLE = keccak256("REGISTRAR_ROLE");
    bytes32 public constant NOTARY_ROLE = keccak256("NOTARY_ROLE");
    
    struct Property {
        string cadastralNumber;
        string propertyType;
        string address_;
        uint256 area;
        bytes32 documentsHash;
        uint256 registeredAt;
        uint256 lastTransferAt;
        bool encumbered;
        string encumbranceDetails;
    }
    
    mapping(uint256 => Property) public properties;
    mapping(string => uint256) public cadastralToToken;
    mapping(uint256 => Lien[]) public propertyLiens;
    
    struct Lien {
        address creditor;
        uint256 amount;
        uint256 expiresAt;
        string description;
        bool active;
    }
    
    event PropertyRegistered(uint256 indexed tokenId, string cadastralNumber, address owner);
    event PropertyTransferred(uint256 indexed tokenId, address from, address to, uint256 price);
    event LienAdded(uint256 indexed tokenId, address creditor, uint256 amount);
    
    function registerProperty(
        address owner,
        string calldata cadastralNumber,
        string calldata propertyType,
        string calldata address_,
        uint256 area,
        bytes32 documentsHash,
        string calldata metadataURI
    ) external onlyRole(REGISTRAR_ROLE) returns (uint256 tokenId) {
        require(cadastralToToken[cadastralNumber] == 0, "Already registered");
        tokenId = uint256(keccak256(abi.encodePacked(cadastralNumber)));
        properties[tokenId] = Property({
            cadastralNumber: cadastralNumber,
            propertyType: propertyType,
            address_: address_,
            area: area,
            documentsHash: documentsHash,
            registeredAt: block.timestamp,
            lastTransferAt: block.timestamp,
            encumbered: false,
            encumbranceDetails: ""
        });
        cadastralToToken[cadastralNumber] = tokenId;
        _safeMint(owner, tokenId);
        _setTokenURI(tokenId, metadataURI);
        emit PropertyRegistered(tokenId, cadastralNumber, owner);
        return tokenId;
    }
    
    function addLien(
        uint256 tokenId,
        address creditor,
        uint256 amount,
        uint256 duration,
        string calldata description
    ) external onlyRole(NOTARY_ROLE) {
        propertyLiens[tokenId].push(Lien({
            creditor: creditor,
            amount: amount,
            expiresAt: block.timestamp + duration,
            description: description,
            active: true
        }));
        properties[tokenId].encumbered = true;
        emit LienAdded(tokenId, creditor, amount);
    }
    
    function _beforeTokenTransfer(address from, address to, uint256 tokenId, uint256 batchSize) 
        internal override 
    {
        super._beforeTokenTransfer(from, to, tokenId, batchSize);
        if (from != address(0)) {
            require(!hasActiveLiens(tokenId), "Property has active liens");
        }
    }
    
    function hasActiveLiens(uint256 tokenId) public view returns (bool) {
        Lien[] memory liens = propertyLiens[tokenId];
        for (uint i = 0; i < liens.length; i++) {
            if (liens[i].active && block.timestamp < liens[i].expiresAt) return true;
        }
        return false;
    }
}

Чому блокчейн-реєстр швидший і безпечніший за паперовий?

Критерій Традиційний реєстр Блокчейн-реєстр
Час угоди 1–4 тижні 5–15 хвилин
Прозорість історії Бухгалтерські книги, ризик помилок Повна on-chain історія
Безпека Підробка підписів, рейдерські захоплення Криптографія, мультипідписи
Інтернаціональність Окремі нотаріуси, мовні бар'єри Єдиний стандарт, атомарні угоди
Фракціональність Дуже складно Легко через ERC-20

Як впровадити блокчейн-реєстр: покроковий план

  1. Аналіз вимог — визначаємо стек (Ethereum/Polygon/BNB Chain), юридичні рамки, інтеграцію з держреєстрами.
  2. Проектування архітектури — обираємо стандарти (ERC-721, ERC-1155), патерни ескроу, фракціональну модель.
  3. Розробка смарт-контрактів — Property Registry, Escrow, Fractional Property. Використовуємо OpenZeppelin для безпеки.
  4. Тестування — unit-тести на Foundry, інтеграційні тести, фаззинг Echidna. Обов'язковий аудит через Slither і Mythril.
  5. Інтеграція з The Graph і IPFS — індексація подій, зберігання документів.
  6. Розгортання та навчання — деплой в обрану мережу, CI/CD, навчання команди.
Деталі безпеки Ми використовуємо патерн Checks-Effects-Interactions, захист від реентрансі, формальну верифікацію критичних контрактів. Усі контракти проходять зовнішній аудит.

Як працюють атомарні угоди в блокчейн-реєстрі?

Атомарна угода — одночасний обмін NFT на гроші без посередників. Покупець вносить кошти в ескроу-контракт, нотаріус перевіряє умови (відсутність обтяжень, повний комплект документів). Як тільки все виконано, NFT передається покупцеві, а кошти — продавцеві. Весь процес займає 5-15 хвилин і виключає ризик шахрайства.

Архітектура property registry

Property NFT

Кожен об'єкт нерухомості — унікальний NFT. Metadata містить кадастровий номер, адресу, площу, посилання на документи в IPFS.

Escrow для угод

contract PropertyEscrow {
    enum EscrowState { CREATED, FUNDED, CONDITIONS_MET, COMPLETED, DISPUTED, REFUNDED }
    
    struct EscrowDeal {
        uint256 propertyTokenId;
        address seller;
        address buyer;
        address notary;
        uint256 price;
        IERC20 paymentToken;
        EscrowState state;
        uint256 createdAt;
        uint256 completionDeadline;
        bytes32[] requiredDocuments;
        mapping(bytes32 => bool) submittedDocuments;
    }
    
    PropertyRegistry public registry;
    mapping(uint256 => EscrowDeal) public deals;
    uint256 private _nextDealId;
    
    function createDeal(
        uint256 propertyTokenId,
        address buyer,
        address notary,
        uint256 price,
        address paymentToken,
        uint256 deadline,
        bytes32[] calldata requiredDocs
    ) external returns (uint256 dealId) {
        require(registry.ownerOf(propertyTokenId) == msg.sender, "Not owner");
        require(!registry.hasActiveLiens(propertyTokenId), "Property encumbered");
        dealId = _nextDealId++;
        EscrowDeal storage deal = deals[dealId];
        deal.propertyTokenId = propertyTokenId;
        deal.seller = msg.sender;
        deal.buyer = buyer;
        deal.notary = notary;
        deal.price = price;
        deal.paymentToken = IERC20(paymentToken);
        deal.state = EscrowState.CREATED;
        deal.completionDeadline = block.timestamp + deadline;
        deal.requiredDocuments = requiredDocs;
        registry.transferFrom(msg.sender, address(this), propertyTokenId);
        emit DealCreated(dealId, propertyTokenId, msg.sender, buyer);
    }
    
    function fundEscrow(uint256 dealId) external {
        EscrowDeal storage deal = deals[dealId];
        require(msg.sender == deal.buyer, "Not buyer");
        require(deal.state == EscrowState.CREATED, "Wrong state");
        deal.paymentToken.transferFrom(msg.sender, address(this), deal.price);
        deal.state = EscrowState.FUNDED;
    }
    
    function completeDeal(uint256 dealId) external {
        EscrowDeal storage deal = deals[dealId];
        require(msg.sender == deal.notary, "Not notary");
        require(deal.state == EscrowState.FUNDED, "Not funded");
        registry.transferFrom(address(this), deal.buyer, deal.propertyTokenId);
        deal.paymentToken.transfer(deal.seller, deal.price);
        deal.state = EscrowState.COMPLETED;
        emit DealCompleted(dealId, deal.propertyTokenId, deal.buyer, deal.seller);
    }
    
    function refundExpiredDeal(uint256 dealId) external {
        EscrowDeal storage deal = deals[dealId];
        require(block.timestamp > deal.completionDeadline, "Not expired");
        require(deal.state == EscrowState.FUNDED, "Wrong state");
        deal.paymentToken.transfer(deal.buyer, deal.price);
        registry.transferFrom(address(this), deal.seller, deal.propertyTokenId);
        deal.state = EscrowState.REFUNDED;
    }
}

Fractional ownership

contract FractionalProperty is ERC20 {
    uint256 public propertyTokenId;
    PropertyRegistry public registry;
    uint256 public totalShares = 1_000_000;
    mapping(address => uint256) public unclaimedRent;
    uint256 public accumulatedRentPerShare;
    
    function distributeRent(uint256 amount) external onlyManager {
        require(totalSupply() > 0, "No shareholders");
        accumulatedRentPerShare += amount * 1e18 / totalSupply();
        paymentToken.transferFrom(msg.sender, address(this), amount);
    }
    
    function claimRent() external {
        uint256 owed = balanceOf(msg.sender) * accumulatedRentPerShare / 1e18 - unclaimedRent[msg.sender];
        unclaimedRent[msg.sender] += owed;
        paymentToken.transfer(msg.sender, owed);
    }
}

Історія транзакцій та ланцюжок володіння

On-chain історія — ключова перевага. The Graph subgraph індексує всі Transfer події та будує повний ланцюжок володіння з цінами угод.

query PropertyHistory($tokenId: String!) {
  propertyTransfers(where: { tokenId: $tokenId }, orderBy: timestamp) {
    from { id }
    to { id }
    timestamp
    transactionHash
    price
    notary { id name }
  }
  liens(where: { propertyId: $tokenId }) {
    creditor { id }
    amount
    expiresAt
    active
    description
  }
}

Що входить у розробку системи

  • Документація: архітектура, специфікація смарт-контрактів, керівництво з розгортання.
  • Смарт-контракти: Property Registry, Escrow, Fractional Property — з повним покриттям тестами.
  • Інтеграція з IPFS для зберігання документів та The Graph для індексації.
  • Фронтенд на React + wagmi для перегляду об'єктів та угод; панель нотаріуса для керування обтяженнями та ескроу.
  • Налаштування CI/CD, деплой в обрану мережу (Ethereum, Polygon, BNB Chain).
  • Навчання вашої команди роботі з системою.

Терміни розробки

Фаза Тривалість
Phase 1: Property Registry контракт, базові функції реєстрації та обтяжень 3–4 тижні
Phase 2: Escrow контракт, notary flow, атомарні угоди 2–3 тижні
Phase 3: Fractional ownership токени, rent distribution 2–3 тижні
Phase 4: The Graph subgraph, frontend (property browser, ownership history, transaction UI) 3–4 тижні
Phase 5: Аудит смарт-контрактів (особливо ескроу) 1–2 тижні
Повна система 3–4 місяці
MVP без fractional ownership та карти 6–8 тижнів

Замовте розробку під ключ — ми оцінимо ваш проєкт за 24 години та запропонуємо оптимальне рішення. Гарантуємо прозорість на кожному етапі. Отримайте консультацію та технічний аудит вашого проєкту.

Цифрова ідентифікація на блокчейні: 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-інженера з профільним досвідом. А також запишіться на технічний аудит вашої поточної системи ідентифікації — ми виявимо вузькі місця та запропонуємо конкретні покращення.