Разработка метавселенной (Metaverse)
Метавселенная — перегруженный термин. Прежде чем проектировать, мы всегда уточняем: это persistent 3D world с real-time взаимодействием (как Decentraland, The Sandbox) или social layer поверх приложений, или виртуальные офисы для enterprise? У каждой модели — свой стек. Здесь разберём архитектуру web3-native persistent world: многопользовательская 3D среда с NFT-землёй, on-chain экономикой и decentralized governance. Это самый технически сложный и востребованный вариант.
За нами пять завершённых проектов метавселенных и более 5 лет опыта в Web3. Делимся опытом, чтобы вы могли оценить объём работ и избежать типовых ошибок. При этом важно понимать: пустой мир без контента и комьюнити — мёртвый. Параллельно с разработкой мы запускаем программу для early LAND holders и креаторов. Свяжитесь с нами, чтобы обсудить стратегию привлечения создателей.
Архитектура метавселенной: блокчейн, контент и real-time
Всё, что имеет ценность, живёт on-chain. Остальное (3D-ассеты, сцены) — off-chain на IPFS или Arweave. Вот ключевые слои.
Как разделяются ownership и экономика?
- LAND NFT — участки виртуальной земли (ERC-721).
- Avatar NFT — персонажи с атрибутами.
- Wearables — предметы (ERC-1155 или ERC-721).
- Governance token — голоса в DAO.
- In-world currency — ERC-20 для внутренних расчётов.
Контент на LAND не on-chain. Владелец деплоит 3D-сцены и скрипты на IPFS — это гибко и дёшево.
LAND система: координатная сетка и Estate
Классическая модель — карта из квадратных участков с координатами. Как отмечается в официальной документации Decentraland, координатная сетка строится от центра. Decentraland использует (-150,-150) до (150,150). Мы применяем тот же подход:
contract LandRegistry is ERC721 { int16 public constant MIN_X = -100; int16 public constant MAX_X = 100; int16 public constant MIN_Y = -100; int16 public constant MAX_Y = 100; function coordinatesToId(int16 x, int16 y) public pure returns (uint256) { require(x >= MIN_X && x <= MAX_X, "X out of range"); require(y >= MIN_Y && y <= MAX_Y, "Y out of range"); return uint256(uint16(x - MIN_X)) * 201 + uint256(uint16(y - MIN_Y)); } function idToCoordinates(uint256 tokenId) public pure returns (int16 x, int16 y) { y = int16(int256(tokenId % 201)) + MIN_Y; x = int16(int256(tokenId / 201)) + MIN_X; } function isAdjacent(uint256 tokenId1, uint256 tokenId2) public pure returns (bool) { (int16 x1, int16 y1) = idToCoordinates(tokenId1); (int16 x2, int16 y2) = idToCoordinates(tokenId2); int16 dx = x1 - x2; int16 dy = y1 - y2; return (dx == 0 && (dy == 1 || dy == -1)) || (dy == 0 && (dx == 1 || dx == -1)); } } Для объединения соседних наделов используется Estate — составной NFT. Владение участком даёт контроль над содержимым сцены.
Почему контент хранится off-chain?
Хранить 3D-модели и скрипты на блокчейне неоправданно дорого. Один гигабайт в Ethereum стоит тысячи долларов. Off-chain хранение на IPFS или Arweave решает проблему: владелец LAND публикует хеш сцены, а сеть загружает контент через шлюз.
Content system: что деплоится на LAND
Каждый LAND имеет сцену — JSON-дескриптор со ссылками на 3D-модели, скрипты и порталы. Публикация через простой контракт:
contract LandContent { mapping(uint256 => string) public sceneHash; mapping(uint256 => uint256) public sceneVersion; function publishScene(uint256 landId, string calldata ipfsHash) external { require(landRegistry.ownerOf(landId) == msg.sender, "Not owner"); require(bytes(ipfsHash).length == 46, "Invalid IPFS hash"); sceneHash[landId] = ipfsHash; sceneVersion[landId]++; emit ScenePublished(landId, msg.sender, ipfsHash, sceneVersion[landId]); } } Разработчики пишут интерактивные скрипты в sandbox-окружении через SDK. Пример — дверь, открывающаяся по клику, или NFT-гейт для доступа.
Как устроена real-time синхронизация аватаров?
Игроки видят друг друга через game servers, каждый регион (N×N LAND) обслуживается отдельным сервером. При переходе границы — handoff.
Area server на Node.js
class AreaServer { private players = new Map<string, PlayerState>(); private physicsWorld = new World({ x: 0, y: -9.81, z: 0 }); handlePlayerJoin(playerId: string, ws: WebSocket, position: Vector3) { // ... добавление игрока, отправка снапшота, broadcast } handleMovement(playerId: string, movement: MovementPacket) { // server-side validation, broadcast с delta compression } private tick() { this.physicsWorld.step(); const updates = this.getDirtyPlayerStates(); if (updates.length > 0) this.broadcast({ type: 'batch_update', updates }); } } Для снижения нагрузки применяем proximity-based broadcasting — видимость ограничена радиусом (например, 100 метров). Это превращает O(N²) в O(N×K).
Экономика метавселенной и управление
In-world marketplace с роялти
Владелец LAND зарабатывает 2.5% с продаж на своей земле:
contract InWorldMarketplace { uint256 public constant LAND_ROYALTY = 250; function buy(uint256 listingId) external { // проверки, расчёт, перевод токенов и NFT } } Play-to-earn генерирует in-world currency за посещение событий, выполнение квестов, участие в мини-играх. Эмиссия контролируется weekly cap и halvening.
DAO и голосование
Управление через Compound-style Governor. Владение LAND даёт голос (1 LAND = 1 vote + бонус за стейкинг governance token). Решаются вопросы: расширение карты, параметры экономики, апгрейды контрактов.
Технологический стек и процесс разработки
Полный стек
| Слой | Технология |
|---|---|
| Blockchain | Polygon PoS / Arbitrum |
| LAND/NFT | Solidity + Foundry |
| Governance | OpenZeppelin Governor |
| Storage | IPFS + Arweave |
| Real-time | Node.js + uWebSockets.js |
| Physics | Rapier3D (WASM) |
| 3D Web | Three.js + React Three Fiber |
| Avatar | ReadyPlayerMe или VRM |
| Indexing | The Graph |
Обратите внимание: выбор L2 (Polygon или Arbitrum) даёт драматическое снижение gas — в 100 раз дешевле Ethereum. Это критично для массового принятия.
Что входит в работу
- Аудит смарт-контрактов (LAND, marketplace, token) — гарантируем отсутствие reentrancy и типичных уязвимостей.
- Полная документация по интеграции SDK для создателей контента.
- Настройка инфраструктуры: IPFS-пиннинг, game servers, базы данных.
- Поддержка после запуска: мониторинг, хотфиксы, доработка экономики.
Этапы и сроки
| Фаза | Содержание | Срок |
|---|---|---|
| Foundation | LAND контракты, координаты, базовый marketplace | 4–6 нед |
| Content system | Scene descriptor, IPFS, публикация | 3–4 нед |
| 3D Client | Three.js мир, загрузка сцен, навигация | 6–8 нед |
| Real-time | Area servers, синхронизация | 6–8 нед |
| Economy | In-world token, marketplace, P2E | 4–6 нед |
| Scripting SDK | Sandbox, NFT gates | 4–6 нед |
| Governance | DAO контракты, UI | 3–4 нед |
| Audit | Все контракты | 5–8 нед |
| Alpha launch | Ограниченная карта | 2–4 нед |
Реалистичные сроки: 12–18 месяцев до public alpha для команды 8–12 человек. Это один из самых масштабных проектов в Web3.
Главный риск — не технический, а продуктовый: без контента и комьюнити мир будет пустым. Поэтому параллельно мы запускаем программу для early LAND holders и креаторов. Чтобы оценить ваш проект и предложить оптимальную архитектуру, закажите консультацию.







