Як ми створюємо децентралізовані чати з XMTP та Waku

Ми стикаємося з типовою ситуацією: клієнт хоче захистити переписку, але водночас зберегти незмінну історію для аудиту. Зберігати кожне повідомлення в блокчейні Ethereum mainnet коштує від $2 до $10 — це дорогий публічний реєстр, не придатний для звичайного чату. Наш підхід — гібридна система, де бло

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

Часті запитання

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

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

Ми стикаємося з типовою ситуацією: клієнт хоче захистити переписку, але водночас зберегти незмінну історію для аудиту. Зберігати кожне повідомлення в блокчейні Ethereum mainnet коштує від $2 до $10 — це дорогий публічний реєстр, не придатний для звичайного чату. Наш підхід — гібридна система, де блокчейн використовується лише там, де він дає переваги: аутентифікація, токен-гейтинг, мікроплатежі. Наприклад, перевірка володіння NFT при вступі в чат виконується за один RPC-запит (вартість <$0.001), а реєстрація через гаманець займає секунду. Такий підхід економить до 90% газових комісій порівняно з повним on-chain зберіганням. Ми комбінуємо E2E-шифрування (X3DH, як у Signal) та децентралізоване зберігання ключів на блокчейні. Оцінимо ваш проєкт — пишіть.

Як XMTP забезпечує E2E-шифрування?

XMTP (Extensible Message Transport Protocol) використовує протокол X3DH (Extended Triple Diffie-Hellman) для встановлення спільного секрету між відправником та отримувачем. Кожне повідомлення шифрується на клієнті та розшифровується лише отримувачем. Групові чати використовують MLS (Messaging Layer Security, RFC 9420) з forward secrecy та post-compromise security. Signal Protocol використовує аналогічну схему, але XMTP адаптує її для Ethereum-адрес. В результаті навіть оператор XMTP-ноди не може прочитати вміст повідомлень — лише метадані (від кого, кому, коли).

Проблеми, які ми вирішуємо

  1. Висока вартість on-chain зберігання: одна транзакція з текстом на Ethereum може коштувати $0.5-2, а для частого обміну це мільйони доларів на рік.
  2. Конфіденційність vs незмінність: потрібна гарантія, що повідомлення не змінять, але без публічного оприлюднення.
  3. Контроль доступу: обмеження чату для власників певних токенів без централізованого сервера.
  4. Мікроплатежі: автоматична оплата за кожне повідомлення або чайові без посередників.

Як ми це робимо: технічні деталі

Простір рішень: від on-chain до гібрида

Повністю on-chain має сенс лише для специфічних сценаріїв:

  • Governance proposals (Snapshot, Tally) — незмінність важлива.
  • Dispute resolution — докази повинні бути захищені від підробки.
  • Critical announcements для DAO — доказова публічність.

Для цих випадків ми використовуємо події Ethereum (event MessagePosted(address indexed sender, bytes32 indexed channelId, string content)). Calldata для зберігання тексту дешевше storage: на Ethereum mainnet 1KB calldata ≈ 16000 gas ≈ $0.5-2. На Arbitrum або Base — в 10-50 разів дешевше.

P2P з on-chain identity: XMTP

XMTP — production-ready протокол, де-факто стандарт для Web3 повідомлень. Використовується в Coinbase Wallet, Converse, багатьох dApps. Архітектура:

  • Identity на основі Ethereum адреси.
  • Повідомлення шифруються end-to-end через X3DH.
  • Транспорт — децентралізована P2P мережа XMTP nodes.
  • On-chain: лише ключова інформація при реєстрації.
import { Client } from '@xmtp/xmtp-js'; import { ethers } from 'ethers'; const signer = await provider.getSigner(); const xmtp = await Client.create(signer, { env: 'production' }); const conversation = await xmtp.conversations.newConversation( '0xRecipientAddress' ); await conversation.send('Привіт з dApp!'); for await (const message of await conversation.streamMessages()) { console.log(`${message.senderAddress}: ${message.content}`); } 

XMTP підтримує structured content types: транзакційні сповіщення, NFT attachments, read receipts. Це особливо важливо для DeFi контексту: «Надіслав тобі 100 USDC» з embedded transaction preview.

Групові чати: XMTP MLS

XMTP v3 додав групи на базі MLS — криптографічний протокол для групового шифрування з forward secrecy та post-compromise security.

import { Client } from '@xmtp/xmtp-js'; const group = await xmtp.conversations.newGroup([ '0xAddress1', '0xAddress2', '0xAddress3' ]); await group.send('Всім привіт!'); await group.addMembers(['0xNewMember']); await group.removeMembers(['0xOldMember']); 

Чому блокчейн не підходить для зберігання повідомлень?

Основна цінність блокчейну — децентралізована аутентифікація та керування доступом. Реєстрація через підпис гаманця (EIP-4361) дає криптографічний доказ володіння адресою без паролів. Токен-гейтинг обмежує доступ на основі on-chain умов. Платіжні канали (Superfluid) автоматизують мікроплатежі. Використовуючи блокчейн лише для identity, ми знижуємо витрати на 80-95% і отримуємо масштабованість.

Порівняння XMTP та Waku

Характеристика XMTP Waku
Identity Ethereum-адреса (обов'язково) Опціонально, можна будь-який
Транспорт P2P мережа XMTP-нод P2P (libp2p, gossipsub)
Шифрування X3DH + MLS Опціонально (на рівні застосунку)
Зберігання історії Зовнішнє (Ceramic, Arweave) Waku Store (обмежений TTL)
Token-gating Через застосунок Через зовнішній шар
Мікроплатежі Superfluid Зовнішні рішення

Як інтегрувати XMTP за 4 кроки

  1. Налаштування гаманця: Підключіть Ethereum-гаманець (MetaMask, WalletConnect). Отримайте signer через ethers.js або viem.
  2. Створення клієнта XMTP: Ініціалізуйте Client.create(signer, { env: 'production' }). Генеруються ключі та реєструється identity (потрібна одна on-chain транзакція).
  3. Створення бесіди: Викличте client.conversations.newConversation(address) для 1-on-1 або newGroup(addresses) для груп. Бесіда готова до обміну.
  4. Відправлення та підписка: Використовуйте conversation.send(text) та streamMessages() для отримання в реальному часі. Все E2E-зашифровано.

Безсерверний token-gate через XMTP

У XMTP token-gating можна реалізувати на стороні клієнта: при вступі в групу користувач підписує attestation свого on-chain статусу. Існуючі учасники верифікують підпис через Ethereum provider. Для складніших сценаріїв — Lit Protocol, де лише гаманець з потрібним NFT може отримати ключ розшифрування каналу.

async function checkTokenGate(userAddress: string, channelId: string): Promise<boolean> { const gateConfig = await getChannelGate(channelId); const client = createPublicClient({ chain: mainnet, transport: http(RPC_URL) }); if (gateConfig.type === 'ERC20_MINIMUM') { const balance = await client.readContract({ address: gateConfig.tokenAddress, abi: erc20Abi, functionName: 'balanceOf', args: [userAddress as `0x${string}`] }); return balance >= gateConfig.minimumAmount; } if (gateConfig.type === 'NFT_HOLDER') { const balance = await client.readContract({ address: gateConfig.contractAddress, abi: erc721Abi, functionName: 'balanceOf', args: [userAddress as `0x${string}`] }); return balance > 0n; } return false; } 

Платіжні канали в чаті

Для мікроплатежів (pay-per-message, tips, spam prevention) інтегруємо платіжний шар:

  • Superfluid streams: відправник відкриває грошовий потік отримувачу, потік активний поки триває розмова.
  • Inline ETH transfers: при відправленні повідомлення — опціональна кнопка «Прикріпити чайові». Створює XMTP повідомлення типу transaction-reference + паралельну on-chain транзакцію.

Зберігання історії та privacy

Децентралізовані транспорти не гарантують постійне зберігання старих повідомлень. Для архіву використовуємо:

  • Ceramic Network: append-only streams з криптографічними гарантіями авторства.
  • Arweave: постійне зберігання, дорожче, але permanent. Для critical communications.
  • Self-hosted: користувачі зберігають повідомлення локально (IndexedDB), синхронізують через IPFS.

Privacy-режим: інтеграція з Railgun для анонімних повідомлень через zk-proofs.

Фронтенд архітектура

Чат — один із найвимогливіших до state management UI компонентів. Для Web3 чату:

  • Real-time messaging: XMTP SDK надає streamMessages() async iterator.
  • Message persistence: TanStack Query з infinite scroll для історії та optimistic updates.
  • Типи контенту: рендеринг markdown, вбудовані NFT прев'ю, transaction previews.
function ChatMessage({ message }: { message: DecodedMessage }) { if (message.contentType?.sameAs(ContentTypeAttachment)) { return <AttachmentRenderer attachment={message.content} />; } if (message.contentType?.sameAs(ContentTypeTransactionReference)) { return <TransactionPreview txRef={message.content} />; } // Текстове повідомлення return <ReactMarkdown>{message.content}</ReactMarkdown>; } 

Процес оцінки та роботи

  1. Збір даних: аналізуємо вимоги, сценарії використання, бюджет.
  2. Аудит: вивчаємо існуючу інфраструктуру, загрози безпеці.
  3. Проектування: вибираємо стек (XMTP/Waku, Ethereum/Polygon).
  4. Оцінка: пропонуємо терміни та вартість.
  5. Розробка: написання смарт-контрактів на Solidity, інтеграція XMTP/Waku, фронтенд.
  6. Тестування: Tenderly, Slither, юніт-тести.
  7. Запуск: деплой у mainnet, документація, навчання команди.

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

  • Аналіз вимог та проектування архітектури.
  • Вибір стека (XMTP/Waku, Ethereum/Polygon).
  • Розробка смарт-контрактів для token-gating та платежів (на Solidity).
  • Інтеграція XMTP/Waku та налаштування relay nodes.
  • Реалізація фронтенду (React/Next.js) з підтримкою Web3-гаманців.
  • Розгортання та тестування (Tenderly, Slither).
  • Документація та передача вихідного коду.
  • Навчання команди замовника.
  • Пост-релізна підтримка.

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

  • Базовий 1-on-1 чат з XMTP та wallet-based identity — 1-2 тижні.
  • Групові чати (XMTP MLS), кілька типів token-gate умов, history persistence — 4-6 тижнів.
  • Повноцінна платформа з кастомним P2P транспортом, платіжними каналами та multi-chain підтримкою — 2-3 місяці.

Вартість розраховується індивідуально. Наша команда має 5+ років досвіду в Web3, виконали 15+ проектів з децентралізованих комунікацій. Готові обговорити ваш проєкт? Зв'яжіться з нами для консультації.