Ми стикаємося з типовою ситуацією: клієнт хоче захистити переписку, але водночас зберегти незмінну історію для аудиту. Зберігати кожне повідомлення в блокчейні 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-ноди не може прочитати вміст повідомлень — лише метадані (від кого, кому, коли).
Проблеми, які ми вирішуємо
- Висока вартість on-chain зберігання: одна транзакція з текстом на Ethereum може коштувати $0.5-2, а для частого обміну це мільйони доларів на рік.
- Конфіденційність vs незмінність: потрібна гарантія, що повідомлення не змінять, але без публічного оприлюднення.
- Контроль доступу: обмеження чату для власників певних токенів без централізованого сервера.
- Мікроплатежі: автоматична оплата за кожне повідомлення або чайові без посередників.
Як ми це робимо: технічні деталі
Простір рішень: від 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 кроки
- Налаштування гаманця: Підключіть Ethereum-гаманець (MetaMask, WalletConnect). Отримайте signer через ethers.js або viem.
- Створення клієнта XMTP: Ініціалізуйте
Client.create(signer, { env: 'production' }). Генеруються ключі та реєструється identity (потрібна одна on-chain транзакція). - Створення бесіди: Викличте
client.conversations.newConversation(address)для 1-on-1 абоnewGroup(addresses)для груп. Бесіда готова до обміну. - Відправлення та підписка: Використовуйте
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>;
}
Процес оцінки та роботи
- Збір даних: аналізуємо вимоги, сценарії використання, бюджет.
- Аудит: вивчаємо існуючу інфраструктуру, загрози безпеці.
- Проектування: вибираємо стек (XMTP/Waku, Ethereum/Polygon).
- Оцінка: пропонуємо терміни та вартість.
- Розробка: написання смарт-контрактів на Solidity, інтеграція XMTP/Waku, фронтенд.
- Тестування: Tenderly, Slither, юніт-тести.
- Запуск: деплой у 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+ проектів з децентралізованих комунікацій. Готові обговорити ваш проєкт? Зв'яжіться з нами для консультації.







