Розробка децентралізованого месенджера
Головне питання при проектуванні децентралізованого месенджера — що саме децентралізовано? Зберігання повідомлень? Маршрутизація? Identity? Шифрування? Ми пропонуємо професійну розробку децентралізованого месенджера з нуля, де кожен шар дійсно децентралізований, а не маскується блокчейн-обгорткою. Чесна архітектура вимагає явного вибору trade-offs на кожному рівні. Наші інженери з 10-річним досвідом у Web3 допомагають знайти правильний баланс. Більше 90% проєктів у цій області страждають від невірних припущень — наприклад, використовують блокчейн для зберігання повідомлень, що робить їх дорогими та повільними. Ми виправляємо це, застосовуючи гібридну схему.
Які задачі вирішує децентралізований месенджер?
Основна задача — дати користувачам контроль над даними та комунікаціями без посередників. Це критично для конфіденційних переписок, DAO-спільнот, децентралізованих бірж та ігор. Крім того, децентралізовані месенджери стійкі до цензури та блокувань.
Протокольний стек: транспорт, ідентифікація, шифрування
Transport layer — розробка децентралізованого месенджера
XMTP (Extensible Message Transport Protocol) — de facto стандарт для Web3 месенджерів на поточний момент. Поверх Waku (libp2p-based messaging network). Повідомлення зберігаються на XMTP нодах (федеративна мережа), ідентифікація — Ethereum адреса, шифрування — Double Ratchet (як у Signal).
import { Client } from '@xmtp/xmtp-js'; import { Wallet } from 'ethers'; // Створення XMTP ідентифікатора (підпис гаманцем) const xmtpClient = await Client.create(signer, { env: 'production' }); // Перевірка: чи зареєстровано адресу в XMTP const isOnNetwork = await Client.canMessage(recipientAddress); // Створення або відкриття conversation const conversation = await xmtpClient.conversations.newConversation(recipientAddress); // Відправка повідомлення await conversation.send('Hello from Web3'); // Отримання історії const messages = await conversation.messages({ limit: 50 }); // Streaming нових повідомлень for await (const message of await conversation.streamMessages()) { console.log(`${message.senderAddress}: ${message.content}`); } Перевага XMTP: готова E2E шифрування, cross-app (повідомлення працюють між різними dApp на базі XMTP: Coinbase Wallet, Converse, Lens), не потрібно будувати p2p інфраструктуру. XMTP інтегрується у 5 разів швидше для MVP порівняно з Waku.
Ідентифікація та управління ключами
XMTP прив'язує ідентифікатор до Ethereum адреси автоматично. При standalone підході потрібна схема key derivation. Визначаємо ключі через HKDF з підпису детермінованого повідомлення:
async function deriveMessagingKeys(signer: ethers.Signer): Promise<{ identityKey: Uint8Array; preKey: Uint8Array; }> { const message = 'MyMessenger Identity Key v1\n\nThis key is used for encrypted messaging.\nSign to generate your keys.'; const signature = await signer.signMessage(message); const keyMaterial = await crypto.subtle.importKey('raw', hexToBytes(signature), 'HKDF', false, ['deriveKey', 'deriveBits']); const identityKeyBits = await crypto.subtle.deriveBits( { name: 'HKDF', hash: 'SHA-256', salt: new Uint8Array(32), info: new TextEncoder().encode('identity-key') }, keyMaterial, 256 ); const preKeyBits = await crypto.subtle.deriveBits( { name: 'HKDF', hash: 'SHA-256', salt: new Uint8Array(32), info: new TextEncoder().encode('pre-key') }, keyMaterial, 256 ); return { identityKey: new Uint8Array(identityKeyBits), preKey: new Uint8Array(preKeyBits) }; } Важно: якщо користувач змінює гаманець — він втрачає ключі. Механізм backup критичний.
Шифрування повідомлень
Приклад ECDH + AES-GCM
async function encryptMessage( plaintext: string, senderPrivateKey: Uint8Array, recipientPublicKey: Uint8Array ): Promise<{ ciphertext: Uint8Array; nonce: Uint8Array }> { const sharedSecret = await performECDH(senderPrivateKey, recipientPublicKey); const encryptionKey = await crypto.subtle.importKey( 'raw', sharedSecret, { name: 'AES-GCM' }, false, ['encrypt'] ); const nonce = crypto.getRandomValues(new Uint8Array(12)); const ciphertext = await crypto.subtle.encrypt( { name: 'AES-GCM', iv: nonce }, encryptionKey, new TextEncoder().encode(plaintext) ); return { ciphertext: new Uint8Array(ciphertext), nonce }; } Для групового чату — симетричний ключ групи, зашифрований публічними ключами кожного учасника (sealed sender модель).
Forward secrecy через Double Ratchet
Статичний ECDH ключ — слабкість: компрометація ключа розкриває всю історію. Double Ratchet вирішує це: кожне повідомлення шифрується новим ефемерним ключем. XMTP реалізує його внутрішньо — це одна з причин вибирати його замість самостійної реалізації.
Як вибрати протокол передачі: XMTP чи Waku?
| Критерій | XMTP | Waku (standalone) |
|---|---|---|
| E2E шифрування | Вбудоване (Double Ratchet) | Потребує реалізації |
| Cross-app | Так (спільна мережа) | Ні |
| Групові чати | MLS v3 (нативні) | Потребує реалізації |
| Складність інтеграції | Низька (SDK) | Висока (налаштування нод) |
| Контроль над інфраструктурою | Федеративна | Повний |
XMTP краще для швидкої інтеграції та сумісності. Waku — для повного контролю та кастомної маршрутизації.
Зберігання, сповіщення та групова архітектура
Як зберігати повідомлення?
Проблема: блокчейн дорогий. Варіанти:
| Сховище | Децентралізація | Вартість | Швидкість |
|---|---|---|---|
| XMTP nodes | Федеративна | Безкоштовно | ~200ms |
| IPFS + Filecoin | Висока | ~$0.01/GB/місяць | 1-5 сек |
| Ceramic/ComposeDB | Висока | Безкоштовно (light) | ~500ms |
| Arweave | Максимальна | ~$0.005/MB одноразово | 2-30 сек |
| Власний сервер | Ні | Дешево | <50ms |
Для реального UX — гібридна схема: повідомлення в XMTP/Waku (fast, p2p), архівні — в IPFS з Filecoin pinning.
Push сповіщення
Waku та XMTP не мають нативного push. Для мобільних сповіщень потрібен PUSH service. XMTP підтримує Push через @xmtp/react-native-sdk + XMTP push service (можна self-host). Для web: Service Worker + Web Push API.
Групові чати
XMTP v3 (MLS — Messaging Layer Security) додає нативні групи з E2E шифруванням та forward secrecy для всієї групи. Управління membership потребує оновлення групового ключа при кожній зміні складу.
// XMTP v3 Group API const group = await xmtpClient.conversations.newGroup([member1, member2, member3]); await group.send('Hello group'); await group.addMembers([newMemberAddress]); On-chain компонент: що варто зберігати в блокчейні
Розумно on-chain тільки:
- Публічні ключі (identity registration) — один раз
- Group registry (якщо публічні групи)
- Token-gated access — перевірка володіння NFT/токенами для входу в group chat
ENS інтеграція: резолвити name.eth → адреса → XMTP перевірка через canMessage.
Структура фронтенду
src/ components/ ConversationList/ MessageThread/ MessageInput/ ContactSearch/ hooks/ useXmtpClient useConversations useMessages stores/ React Query + Zustand для кешування. Повідомлення кешуються локально (IndexedDB), streaming додає нові без перезавантаження.
Орієнтири за термінами розробки
XMTP-based месенджер (1-на-1 чати, ENS резолвінг, базовий UI) — 2-3 тижні. Групові чати (MLS v3), push сповіщення, token-gated rooms — ще 2-3 тижні. Повноцінний продукт з file sharing, read receipts, mobile-адаптацією — 2-3 місяці.
Що входить в роботу
- Аналіз архітектури: вибір протоколу (XMTP/Waku), визначення рівнів децентралізації.
- Реалізація бекенду: налаштування XMTP нод або Waku relay, інтеграція з IPFS.
- Інтеграція з гаманцями: MetaMask, WalletConnect, Phantom (Solana).
- Шифрування та управління ключами: Double Ratchet, backup seed.
- Фронтенд: React для web, React Native для mobile, адаптивний UI.
- Розгортання та тестування: смарт-контракти (якщо потрібно), аудит безпеки (Tenderly, Slither).
- Документація та навчання: передача репозиторію, readme, навчання вашої команди.
Чому варто довірити розробку нам?
- 5 років на ринку децентралізованих технологій.
- Більш ніж 15 Web3-проєктів у портфоліо, включаючи DeFi та NFT маркетплейси.
- Інженери з сертифікатами Matter Labs та Ethereum Foundation.
- Ми гарантуємо роботу за специфікацією та виправляємо bugs протягом гарантійного терміну.
Замовте розробку під ключ — ми оцінимо ваш проєкт безкоштовно. Зв'яжіться з нами для консультації, допоможемо вибрати архітектуру під ваш бюджет.







