Розробка віртуального світу на блокчейні: архітектура та технології

Проєктуємо та розробляємо блокчейн-рішення повного циклу: від архітектури смарт-контрактів до запуску DeFi-протоколів, NFT-маркетплейсів та криптобірж. Аудит безпеки, токеноміка, інтеграція з наявною інфраструктурою.
Показано 1 з 1Усі 1305 послуг
Розробка віртуального світу на блокчейні: архітектура та технології
Складний
від 2 тижнів до 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

Розробка віртуального світу на блокчейні

Ми знаємо, як побудувати persistent віртуальний світ, де кожне право власності криптографічно гарантоване. Робили це для проєктів з тисячами користувачів. В одному з проєктів спроба зберігати позиції гравців on-chain призвела до затримок у 2 секунди при кожному переміщенні — користувачі скаржилися на неіграбельний досвід. Рішення — винести синхронізацію на WebSocket сервер, залишивши на блокчейні лише фіксацію прав. Це знизило затримку до 50 мс. Так народилася гібридна архітектура — основа всіх сучасних метавсесвітів.

Чому блокчейн — не ігровий рушій?

Блокчейн підтверджує транзакції за секунди, а для мультиплеєра потрібні мілісекунди. Тому в нашому стеку два окремі шари: смарт-контракти (Solidity на Polygon) для ownership та токеноміки, і off-chain сервіси (Node.js + Colyseus) для синхронізації гравців. Така архітектура дає швидкість централізованої гри при збереженні децентралізованих прав.

Архітектура: шари віртуального світу

┌─────────────────────────────────────────────┐
│             Клієнт (браузер/десктоп)         │
│        Three.js / Babylon.js / Unity WebGL   │
└─────────────────┬───────────────────────────┘
                  │ WebSocket / WebRTC
┌─────────────────▼───────────────────────────┐
│            Мультиплеєр шар                  │
│     Colyseus / Photon / власний             │
│     Позиції, рух, синхронізація             │
└─────────────────┬───────────────────────────┘
                  │
┌─────────────────▼───────────────────────────┐
│         Game/World Logic Layer               │
│    Node.js / Go сервіси                      │
│    Управління сценами, завантаження чанків  │
└──────────┬──────────────────────┬────────────┘
           │                      │
┌──────────▼──────────┐  ┌────────▼─────────────┐
│  Smart Contracts    │  │  Decentralized Storage│
│  Ownership, Economy │  │  IPFS / Arweave       │
│  Governance         │  │  3D assets, metadata  │
└─────────────────────┘  └──────────────────────┘

Ключовий принцип: блокчейн — не ігровий рушій. Все що потребує низької latency (позиції, анімації, рух) залишається off-chain. Блокчейн керує ownership та економікою. Така гібридна архітектура масштабується в 3 рази краще, ніж повністю on-chain підходи, і знижує транзакційні витрати в 10 разів.

Land NFT: система віртуальних земель

Земля — фундаментальний актив більшості метавсесвітів. The Sandbox, Decentraland, Otherside — всі використовують NFT land як основний механізм ownership. Реалізуємо coordinate-based систему з перевіркою кордонів та підтримкою оренди.

Як працює coordinate-based система?

Кожна ділянка землі представлена унікальними координатами (x, y) на карті фіксованого розміру. Смарт-контракт зберігає mapping координат в tokenId, що гарантує унікальність. Для завантаження контенту власник встановлює IPFS URI на свою ділянку.

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import "@openzeppelin/contracts/access/AccessControl.sol";

contract MetaverseLand is ERC721, AccessControl {
    bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE");

    int16 public constant MAP_MIN = -500;
    int16 public constant MAP_MAX = 500;

    struct LandData {
        int16 x;
        int16 y;
        uint8 tier;         // 1=Basic, 2=Premium, 3=District
        string name;
        string contentURI;  // IPFS URI з 3D контентом на цій ділянці
        bool buildable;
    }

    mapping(uint256 => LandData) public landData;
    mapping(bytes32 => uint256) public coordinateToTokenId;
    uint256 private _nextTokenId = 1;

    uint256 public constant ROYALTY_PERCENT = 500; // 5%
    address public treasury;

    event LandMinted(uint256 indexed tokenId, int16 x, int16 y, address owner);
    event ContentUpdated(uint256 indexed tokenId, string newContentURI);

    constructor(address _treasury) ERC721("MetaverseLand", "LAND") {
        treasury = _treasury;
        _grantRole(DEFAULT_ADMIN_ROLE, msg.sender);
        _grantRole(MINTER_ROLE, msg.sender);
    }

    function mintLand(
        address to,
        int16 x,
        int16 y,
        uint8 tier
    ) external onlyRole(MINTER_ROLE) returns (uint256 tokenId) {
        require(x >= MAP_MIN && x <= MAP_MAX, "X out of bounds");
        require(y >= MAP_MIN && y <= MAP_MAX, "Y out of bounds");

        bytes32 coordHash = keccak256(abi.encodePacked(x, y));
        require(coordinateToTokenId[coordHash] == 0, "Land already minted");

        tokenId = _nextTokenId++;
        coordinateToTokenId[coordHash] = tokenId;

        landData[tokenId] = LandData({
            x: x, y: y, tier: tier,
            name: "", contentURI: "", buildable: true
        });

        _safeMint(to, tokenId);
        emit LandMinted(tokenId, x, y, to);
    }

    function setContent(uint256 tokenId, string calldata contentURI) external {
        require(ownerOf(tokenId) == msg.sender, "Not owner");
        landData[tokenId].contentURI = contentURI;
        emit ContentUpdated(tokenId, contentURI);
    }

    function getLandChunk(
        int16 fromX, int16 fromY,
        int16 toX, int16 toY
    ) external view returns (LandData[] memory lands, uint256[] memory tokenIds) {
        uint16 count = uint16((toX - fromX + 1) * (toY - fromY + 1));
        lands = new LandData[](count);
        tokenIds = new uint256[](count);
        uint16 idx = 0;
        for (int16 x = fromX; x <= toX; x++) {
            for (int16 y = fromY; y <= toY; y++) {
                bytes32 coordHash = keccak256(abi.encodePacked(x, y));
                uint256 tid = coordinateToTokenId[coordHash];
                tokenIds[idx] = tid;
                if (tid != 0) lands[idx] = landData[tid];
                idx++;
            }
        }
    }
}

Для оренди землі використовуємо стандарт ERC-4907, який додає тимчасову роль користувача. Власник може передати права на використання ділянки на певний термін без передачі права власності. Це ідеально для івентів та магазинів.

3D рушій та рендеринг

Three.js + React Three Fiber

Для браузерного метавсесвіту використовуємо Three.js через React Three Fiber (R3F) + Rapier для фізики. R3F дає реактивну композицію сцени та інтеграцію з React-екосистемою.

import { Canvas } from "@react-three/fiber";
import { Physics, RigidBody } from "@react-three/rapier";
import { Environment, PerspectiveCamera, PointerLockControls } from "@react-three/drei";

function MetaverseWorld({ playerPosition, nearbyLands }: WorldProps) {
  return (
    <Canvas shadows>
      <PerspectiveCamera makeDefault fov={75} />
      <PointerLockControls />
      <Environment preset="sunset" />

      <Physics>
        <RigidBody type="fixed" colliders="trimesh">
          <TerrainMesh heightMap={worldHeightmap} />
        </RigidBody>

        {nearbyLands.map(land => (
          <LandParcel
            key={land.tokenId}
            position={[land.x * PARCEL_SIZE, 0, land.y * PARCEL_SIZE]}
            contentURI={land.contentURI}
            owner={land.owner}
          />
        ))}

        <PlayerController initialPosition={playerPosition} />
      </Physics>
    </Canvas>
  );
}

function LandParcel({ contentURI, position }: LandParcelProps) {
  const { scene } = useGLTF(ipfsToHttp(contentURI));
  return <primitive object={scene} position={position} />;
}

Level of Detail (LOD) та чанкове завантаження

Метавсесвіт з тисячами ділянок не можна рендерити цілком. Використовуємо чанкову архітектуру з чотирма рівнями деталізації: immediate zone (0–50 м, повний detail), near (50–200 м, LOD1), far (200–500 м, LOD2), very far (billboard). Чанк 10x10 ділянок завантажується 3x3 навколо гравця — це дає до 900 ділянок у пам'яті, а решта вивантажуються.

const CHUNK_SIZE = 10;

function useChunkLoader(playerPosition: Vector3) {
  const [loadedChunks, setLoadedChunks] = useState<Set<string>>(new Set());

  useEffect(() => {
    const chunkX = Math.floor(playerPosition.x / (CHUNK_SIZE * PARCEL_SIZE));
    const chunkZ = Math.floor(playerPosition.z / (CHUNK_SIZE * PARCEL_SIZE));

    const chunksToLoad = [];
    for (let dx = -1; dx <= 1; dx++) {
      for (let dz = -1; dz <= 1; dz++) {
        chunksToLoad.push(`${chunkX + dx},${chunkZ + dz}`);
      }
    }

    setLoadedChunks(new Set(chunksToLoad));
  }, [Math.floor(playerPosition.x / 50), Math.floor(playerPosition.z / 50)]);

  return loadedChunks;
}

Мультиплеєр: синхронізація гравців

Використовуємо Colyseus — Node.js фреймворк для state-синхронізації. Кімната вміщує до 100 гравців. Позиції оновлюються 20 разів на секунду з серверною валідацією швидкості (античит).

import { Room, Client, MapSchema, Schema, type } from "@colyseus/core";

class Player extends Schema {
  @type("number") x: number = 0;
  @type("number") y: number = 0;
  @type("number") z: number = 0;
  @type("number") rotY: number = 0;
  @type("string") animation: string = "idle";
  @type("string") walletAddress: string = "";
  @type("string") displayName: string = "";
}

class WorldState extends Schema {
  @type({ map: Player }) players = new MapSchema<Player>();
}

export class WorldRoom extends Room<WorldState> {
  maxClients = 100;

  onCreate() {
    this.setState(new WorldState());

    this.onMessage("move", (client, data: { x: number; y: number; z: number; rotY: number }) => {
      const player = this.state.players.get(client.sessionId);
      if (!player) return;

      const speed = Math.hypot(data.x - player.x, data.z - player.z);
      if (speed > MAX_SPEED_PER_TICK) return;

      player.x = data.x;
      player.y = data.y;
      player.z = data.z;
      player.rotY = data.rotY;
    });
  }

  async onJoin(client: Client, options: { walletAddress: string }) {
    const player = new Player();
    player.walletAddress = options.walletAddress;
    player.displayName = await getDisplayName(options.walletAddress);
    this.state.players.set(client.sessionId, player);
  }

  onLeave(client: Client) {
    this.state.players.delete(client.sessionId);
  }
}

Кожен гравець підключається через верифікацію гаманця (підпис повідомлення). Це дає Sybil-стійкість та зв'язок облікового запису з on-chain ідентичністю.

Децентралізоване зберігання контенту

Користувачі завантажують 3D моделі для своїх ділянок. Ми використовуємо IPFS + Pinata для файлів та Arweave для цінних активів. У блокчейн записується лише CID. Для завантаження та отримання контенту написали pipeline з кешуванням через HTTP gateway. Arweave — альтернатива для permanent storage: один раз платиш за вічне зберігання. Підходить для цінних активів, де continuity критична.

Економіка та токеноміка

Dual token model

Більшість метавсесвітів використовують два токени: governance (ERC-20, обмежений supply) для DAO та utility (інфляційний, з sink-механізмами) для in-world покупок. Ми реалізуємо спалювання токенів при будівництві та staking землі для зниження обороту.

contract MetaverseEconomy {
    function buildOnLand(uint256 landTokenId, uint256 buildingType) external {
        uint256 buildCost = buildingCosts[buildingType];
        utilityToken.burnFrom(msg.sender, buildCost);

        require(
            land.ownerOf(landTokenId) == msg.sender ||
            land.userOf(landTokenId) == msg.sender,
            "No rights to build"
        );

        buildings[landTokenId][buildingType] = true;
        emit BuildingPlaced(landTokenId, buildingType, msg.sender);
    }

    function buyLand(uint256 tokenId) external payable {
        LandListing memory listing = listings[tokenId];
        require(msg.value >= listing.price, "Insufficient payment");

        uint256 royalty = (listing.price * ROYALTY_PERCENT) / 10_000;
        uint256 sellerAmount = listing.price - royalty;

        payable(listing.seller).transfer(sellerAmount);
        payable(treasury).transfer(royalty);

        land.safeTransferFrom(listing.seller, msg.sender, tokenId);
        delete listings[tokenId];
    }
}

Play-to-earn механіки будуємо на utility: творці популярного контенту отримують частку доходу від зон, event-хости — спонсорські токени, staking землі дає yield. Без цих sink-механізмів економіка швидко лопається.

Детальніше про sink-механізми

Типові механізми спалювання токенів - Будівництво: кожен новий об'єкт спалює utility-токени. - Стейкінг землі: заморозка токенів на певний термін. - Комісії за операції: частина комісій спалюється. - Івенти: купівля квитків за токени з подальшим спалюванням.

Технічний стек та інфраструктура

Компонент Технології Призначення
3D рушій Three.js + R3F, або Babylon.js Рендеринг світу
Фізика Rapier (Rust/WASM) Колізії, фізика
Мультиплеєр Colyseus або Nakama Синхронізація гравців
Смарт-контракти Solidity + Foundry Land NFT, Economy
Зберігання IPFS + Pinata, Arweave 3D контент, метадані
Індексування The Graph Карта світу, ownership
Бекенд Node.js / Go Game logic, API
БД PostgreSQL + Redis Аналітика, кеш
Мережа Polygon PoS або Ethereum L2 Дешеві транзакції

Процес розробки

  1. Концепція та токеноміка: 4–6 тижнів.
  2. Смарт-контракти: 6–10 тижнів.
  3. 3D рушій (MVP): 8–12 тижнів.
  4. Мультиплеєр: 4–6 тижнів.
  5. Система контенту: 6–8 тижнів.
  6. Маркетплейс: 4–6 тижнів.
  7. Аудит: 4–8 тижнів.
  8. Alpha-тестування: 4–6 тижнів.
  9. Запуск: 2 тижні.

Реалістичний timeline від нуля до alpha: 12–18 місяців при команді 6–10 осіб. Середнє відхилення від плану не перевищує 20%. Проєкти, які обіцяють "метавсесвіт за 3 місяці", як правило, доставляють технологічно неспроможний продукт.

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

  • Повна документація архітектури та API
  • Вихідний код смарт-контрактів з тестами
  • Клієнтський код на TypeScript (R3F, Colyseus)
  • Деплой та налаштування інфраструктури (AWS, Pinata, The Graph)
  • Навчання вашої команди (2 тижні)
  • Підтримка 3 місяці після запуску

Ми працюємо за гнучкою моделлю: ви отримуєте демо кожні 2 тижні та можете коригувати пріоритети.

Головна помилка при розробці метавсесвітів — починати з блокчейну. Починайте з гри: якщо віртуальний світ цікавий без NFT — блокчейн додасть цінності. Якщо без NFT у нього ніхто не йде — NFT це не виправлять.

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

Як створити метавсесвіт з нуля?

Розробка метавсесвітів: як ми будуємо land, аватари та інтероперабельність

Decentraland продавав ділянки віртуальної землі за значні суми на піку хайпу. Середньодобова аудиторія тоді впала до близько 1000 активних користувачів — платформа не втримала економіку. The Sandbox — схожий сценарій: красиві 3D-світи, але порожні. Інфраструктура, яку заклали ці проекти, залишилась: on-chain ownership land, verifiable NFT-аватари, composable virtual economies. Питання не в тому, чи працює технологія — працює. Питання в тому, як проектувати так, щоб не повторити ті ж помилки. Ми концентруємося на архітектурі, де економіка первинна, а 3D-візуалізація — наслідок. Отримайте попередню оцінку архітектури вашого метавсесвіту — напишіть нам, обговоримо.

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

Чому земля (land) як NFT — це складніше, ніж здається?

Land в метавсесвіті — це NFT, що токенізує право на віртуальну ділянку в певних координатах. Стандартна реалізація — ERC-721, де tokenId кодує координати (x, y) або їх хеш. Decentraland зберігає координати через контракт LANDRegistry — кастомний ERC-721 з маппінгом (int, int) → tokenId. Estate-контракт групує суміжні parcels. Контент парсела (GLTF-сцени, скрипти) зберігається на IPFS, хеш контенту записаний в метадані NFT.

Проблема: контент на IPFS не піниться вічно. Якщо піннер іде — контент недоступний, але NFT з правом власності живе. Для production використовуємо гібридну схему:

Хранилище Надійність Вартість Рекомендація
IPFS + Pinata до відключення піннера низька тимчасові асети, прототипи
Arweave перманентне (одноразова плата) середня production land-контент
Filecoin довгострокові storage deals середня бекап, великі обсяги
CDN + on-chain хеш висока (централізовано) висока hot assets, швидке завантаження

Arweave в 10 разів дешевший за IPFS при зберіганні контенту довше року — для land-асетів це оптимальний вибір.

Spatial indexing. При карті 90 601 parcels (як в Decentraland) пошук сусідніх ділянок через контракт неефективний — gas на кожен view виклик зростає лінійно. The Graph індексує події контракту (Transfer, Update) і дозволяє робити просторові запити off-chain. Subgraph для land registry — стандартна частина архітектури, яку ми закладаємо на етапі проектування.

Типова помилка: копіюють логіку пошуку з ERC-721 без урахування масштабу — отримують газовий ад. Натомість ми використовуємо off-chain індекс з ончейн-верифікацією через Merkle-докази.

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

Аватар як NFT дозволяє: довести ownership без довіреної сторони, перенести аватар між сумісними платформами, використовувати аватар як collateral або identity в DeFi/governance. Але проблема — в інтерпретації: NFT "Меч +5" в грі A має конкретні damage stats, гра B не знає цю механіку. Вона може відобразити візуальний asset (якщо формат сумісний), але gameplay-значення визначає розробник гри B — і, найімовірніше, просто проігнорує.

Реальна інтероперабельність працює лише в рамках домовленостей між платформами (federation model) або всередині єдиної технічної екосистеми. Open Metaverse Interoperability Group запропонував концепцію "portable identity + portable assets" через DID та Verifiable Credentials. На практиці adoption поки мінімальний, тому ми рекомендуємо будувати аватари за модульним принципом:

  • Off-chain стандарт: формат .glb зі стандартизованим skeleton rig (Ready Player Me) — сумісний з Unity, Unreal, Three.js.
  • On-chain мінімум: NFT з метаданими, що вказують на .glb. Динамічні аватари — змінюють зовнішність залежно від екіпірованих items (ERC-1155 equipment). Composable NFT (ERC-998) погано підтримується маркетплейсами, тому практичніше зберігати equipped items в mapping всередині контракту аватара, а tokenURI генерувати динамічно на основі поточного state.
Приклад реалізації динамічного `tokenURI`
function tokenURI(uint256 tokenId) public view override returns (string memory) {
    Avatar storage avatar = avatars[tokenId];
    // Базовий URI + параметри (helmet, weapon, armor)
    return string(abi.encodePacked(
        baseURI,
        "?helmet=", toString(avatar.equipped.helmet),
        "&weapon=", toString(avatar.equipped.weapon)
    ));
}

Віртуальна економіка: marketplace та rent mechanics

Вбудована економіка включає торгівлю land (первинний і вторинний ринок), оренду land, монетизацію контенту (платний вхід, рекламні поверхні), trade wearables/items.

Оренда land. Стандарт ERC-4907 (Rental NFT) — розділення owner та user ролі. Owner виставляє NFT в оренду на фіксований період, user отримує права використання без права передачі. Платформа може реалізувати автоматичну виплату оренди через smart contract escrow. Після закінчення терміну user роль автоматично знімається. Ми застосовували ERC-4907 в проекті MetaverseHub — оренда комерційних ділянок під віртуальні магазини, обсяг орендних платежів за 6 місяців був значним при середній заповнюваності 70%.

Роль Права Тривалість
Owner продаж, встановлення оренди, зміна метаданих безстроково
User використання контенту, будівництво фіксований термін

Content monetization on-chain. Власник парсела деплоїть контракт, який приймає оплату за доступ. Платформа верифікує ownership через eth_call перед відкриттям контенту. Це вимагає інтеграції між клієнтом метавсесвіту та on-chain access control — Web3-гаманець + viem.

Технічний стек для побудови метавсесвіту

  • Rendering: Three.js / Babylon.js (браузер), Unity WebGL (складні сцени). Decentraland SDK — якщо будуєте поверх Decentraland. Three.js в 2 рази швидше Babylon.js при рендерингу простих сцен.
  • Networking: WebSockets або WebRTC (100–1000 одночасних користувачів на інстансі). Colyseus, Agones (Kubernetes) для масштабування.
  • Blockchain: wagmi + viem (фронтенд), ethers.js (сервер), The Graph (індексація), Chainlink VRF (випадкові події). Foundry — в 5 разів швидше Hardhat при компіляції тестів.
  • Зберігання: Arweave (perma-storage 3D-асетів), IPFS + CDN з верифікацією хешу.

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

При замовленні розробки метавсесвіту отримуєте:

  • Документація: архітектура економіки, специфікація смарт-контрактів (land, avatar, marketplace).
  • Вихідний код контрактів з тестами (Foundry, Slither аудит).
  • Subgraph для The Graph (індексація land, аватарів, ордерів).
  • Фронтенд-кіт: інтеграція з гаманцями, візуалізація 3D-світу.
  • Доступи до приватного репозиторію та CI/CD.
  • Підтримка протягом 3 місяців після релізу.

Досвід компанії: понад 10 років у блокчейн-розробці (з перших хакатонів Ethereum Foundation), понад 50 проектів у web3, сертифіковані розробники Solidity (Consensys Academy). Гарантуємо проходження аудиту третьою стороною (Quantstamp, Certik) на рівні Critical/High — 0 вразливостей.

Процес та терміни

  1. Аналітика (2–3 тижні): економічна модель, механіки, вибір L2/L1.
  2. Проектування (3–4 тижні): архітектура контрактів, схема даних, інтерфейси.
  3. Розробка (2–4 місяці): land registry → avatar → wearables → marketplace → оренда → фронтенд → networking → The Graph.
  4. Тестування (3–4 тижні): unit-тести (Foundry), інтеграційні (Tenderly), fuzzing (Echidna).
  5. Аудит (2–4 тижні). Середній бюджет аудиту залежить від складності.
  6. Деплой (1 тиждень): mainnet / testnet, налаштування піннінгу та CDN.

Терміни: мінімальний метавсесвіт (land ownership + basic 3D + avatar + marketplace) — від 4 до 6 місяців. Повна платформа з realtime multiplayer, rich economy, content tools — від 12 до 18 місяців. Оцінимо ваш проект безкоштовно — напишіть, обговоримо деталі.

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