פיתוח צ'אט בלוקצ'יין עם XMTP, Token-Gating והצפנת E2E

כשאתם זקוקים לצ'אט מאובטח עם גישת token-gating, אך אחסון כל הודעה על הבלוקצ'יין הוא יקר מדי, אנחנו בונים מסנג'ר מבוזר שמשתמש בבלוקצ'יין רק לאימות וניהול מפתחות. הצוות שלנו מספק את הפרויקט במפתח מלא—מארכיטקטורה ועד פריסה—ומבטיח שיחות פרטיות ופעילות אמינה עם תמיכה מתמשכת.

שירותי פיתוח בלוקצ'יין

שאלות נפוצות

העבודות האחרונות

  • פיתוח אתר חברה B2B ADVANCE
    פיתוח אתר חברה B2B ADVANCE
    1481
  • פיתוח אפליקציית ווב עבור FEEDME
    פיתוח אפליקציית ווב עבור FEEDME
    1335
  • פיתוח אתר עבור BELFINGROUP
    פיתוח אתר עבור BELFINGROUP
    1034
  • פיתוח חנות מקוונת לחברת FURNORO
    פיתוח חנות מקוונת לחברת FURNORO
    1293
  • עיצוב לוגו לחברת B2B Advance
    עיצוב לוגו לחברת B2B Advance
    738
  • פיתוח אפליקציית ווב עבור Enviok
    פיתוח אפליקציית ווב עבור Enviok
    1031

פיתוח צ'אט מבוזר על בלוקצ'יין

אנו מפתחים צ'אטים מבוזרים שבהם הבלוקצ'יין משמש לזהות, ניהול מפתחות, ערוצי תשלום והוכחת קיום, בעוד שההודעות מועברות באמצעות תעבורת P2P מוגנת קריפטוגרפית. אחסון כל הודעה על הרשת הראשית של Ethereum עולה בין $2 ל-$10 — זהו מרשם ציבורי יקר שאינו מתאים לצ'אט יומיומי. במקום זאת, אנו מתכננים מערכת היברידית המשתמשת בבלוקצ'יין בדיוק במקום שבו הוא מספק יתרונות: אימות, הגבלת אסימונים, מיקרו-תשלומים. לדוגמה, בדיקת בעלות על NFT בעת הצטרפות לצ'אט מתבצעת בקריאת RPC אחת (עלות <$0.001), ורישום משתמש באמצעות ארנק לוקח שנייה. גישה זו חוסכת עד 90% מעמלות הגז בהשוואה לאחסון מלא על הרשת. בעיה אופיינית של לקוח: הבטחת סודיות השיחה תוך שמירה על חוסר שינוי של ההיסטוריה לצורך ביקורת. אנו פותרים אותה באמצעות שילוב של הצפנת E2E (X3DH, כמו ב-Signal) ואחסון מפתחות מבוזר על הבלוקצ'יין. הערך את הפרויקט שלך — כתוב לנו.

כיצד XMTP מספקת הצפנת E2E?

XMTP (Extensible Message Transport Protocol) משתמשת בפרוטוקול X3DH (Extended Triple Diffie-Hellman) כדי ליצור סוד משותף בין השולח למקבל. כל הודעה מוצפנת בצד הלקוח ומפוענחת רק על ידי הנמען. צ'אטים קבוצתיים משתמשים ב-MLS (Messaging Layer Security, RFC 9420) עם סודיות קדימה ואבטחה לאחר פריצה. Signal Protocol משתמש במנגנון דומה, אך XMTP מתאימה אותו לכתובות Ethereum. כתוצאה מכך, אפילו מפעיל צומת XMTP אינו יכול לקרוא את תוכן ההודעה — רק מטא-דאטה (ממי, למי, מתי).

מרחב פתרונות: מאחסון מלא על הרשת להיברידי

אחסון מלא על הרשת: רק למקרים ספציפיים

אחסון הודעות על הרשת הגיוני בתרחישים מצומצמים מאוד:

  • הצעות וממשל (Snapshot, Tally) — חוסר שינוי הוא חשוב
  • יישוב מחלוקות בפרוטוקולי בוררות — ראיות חייבות להיות חסינות לשינוי
  • הודעות קריטיות עבור DAOs — פרסום בר הוכחה

למקרים אלה אנו משתמשים באירועי Ethereum (event MessagePosted(address indexed sender, bytes32 indexed channelId, string content)). Calldata לאחסון טקסט זול יותר מאחסון: ברשת הראשית של Ethereum 1KB calldata ≈ 16000 גז ≈ $0.5-2. ב-Arbitrum או Base — זול פי 10-50.

P2P עם זהות על הרשת: XMTP

XMTP היא פרוטוקול מוכן לייצור להודעות Web3, הסטנדרט דה-פקטו לצ'אט מבוזר. היא משמשת ב-Coinbase Wallet, Converse ו-dApps רבים. ארכיטקטורת XMTP:

  • הזהות מבוססת על כתובת Ethereum. אין צורך בחשבון נפרד.
  • הודעות מוצפנות מקצה לקצה באמצעות X3DH.
  • התעבורה היא רשת P2P מבוזרת של צמתי XMTP.
  • על הרשת: רק מידע מפתח ברישום המשתמש הראשון.
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 תומכת בסוגי תוכן מובנים: התראות עסקאות, קבצים מצורפים של NFT, אישורי קריאה. זה חשוב במיוחד בהקשר DeFi: "שלחתי לך 100 USDC" עם תצוגה מקדימה של העסקה.

צ'אטים קבוצתיים: XMTP MLS

XMTP v3 הוסיפה קבוצות המבוססות על MLS — פרוטוקול קריפטוגרפי להצפנה קבוצתית עם סודיות קדימה ואבטחה לאחר פריצה. קבוצה היא קבוצת משתתפים, שלכל אחד מפתחות משלו; הסרה מהקבוצה מונעת קריאת הודעות עתידיות.

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']);

מדוע בלוקצ'יין אינו מתאים לאחסון הודעות

אחסון הודעות על הרשת אינו כלכלי לשימוש המוני: עסקה בודדת עם טקסט יכולה לעלות $0.5-2 ב-Ethereum, ולחילופין תכופים מדובר במיליוני דולרים בשנה. הערך העיקרי של הבלוקצ'יין הוא באימות מבוזר ובקרת גישה. רישום משתמש באמצעות חתימת ארנק (EIP-4361) מספק הוכחה קריפטוגרפית לבעלות על הכתובת ללא סיסמאות. הגבלת אסימונים מאפשרת הגבלת גישה לצ'אט על סמך תנאים על הרשת (למשל, יתרת NFT). ערוצי תשלום (Superfluid) הופכים מיקרו-תשלומים עבור הודעות או מנויים לאוטומטיים. על ידי שימוש בבלוקצ'יין רק לזהות, אנו מפחיתים עלויות ב-80-95% ומשיגים מדרגיות.

השוואה בין XMTP ל-Waku

מאפיין XMTP Waku
זהות כתובת Ethereum (חובה) אופציונלי, ניתן להשתמש בכל אחת
תעבורה רשת P2P של צמתי XMTP P2P (libp2p, gossipsub)
הצפנה X3DH + MLS אופציונלי (בשכבת היישום)
אחסון היסטוריה חיצוני (Ceramic, Arweave) Waku Store (TTL מוגבל)
הגבלת אסימונים דרך היישום דרך שכבה חיצונית
מיקרו-תשלומים Superfluid פתרונות חיצוניים

כיצד לשלב XMTP ב-4 שלבים

  1. הגדרת ארנק: חבר כל ארנק Ethereum (MetaMask, WalletConnect). השג חותם באמצעות ethers.js או viem.
  2. יצירת לקוח XMTP: אתחל 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 (דורש עסקה אחת על הרשת).
  3. יצירת שיחה: קרא ל-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']); עבור 1-on-1 או Client.create(signer, { env: 'production' }) עבור קבוצות. השיחה מוכנה מיד להחלפת הודעות.
  4. שליחה והרשמה: השתמש ב-client.conversations.newConversation(address) לשליחה ו-newGroup(addresses) לקבלת הודעות בזמן אמת. הכל מוצפן E2E.

שער אסימונים ללא שרת באמצעות XMTP

ב-XMTP, ניתן ליישם הגבלת אסימונים בצד הלקוח: בעת ניסיון להצטרף לקבוצה, המשתמש חותם על אישור סטטוסו על הרשת. משתתפים קיימים מאמתים את החתימה באמצעות ספק Ethereum. לתרחישים מורכבים יותר — 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;
}

ערוצי תשלום בצ'אט

למיקרו-תשלומים (תשלום לכל הודעה, טיפים, מניעת ספאם) אנו משלבים שכבת תשלום:

  • זרמי Superfluid: השולח פותח זרם כספי למקבל; הזרם פעיל כל עוד השיחה נמשכת. סגירת השיחה סוגרת את הזרם.
  • העברות ETH מובנות: בעת שליחת הודעה — כפתור "צרף טיפ" אופציונלי. יוצר הודעת XMTP מסוג conversation.send(text) + עסקה מקבילה על הרשת.

אחסון היסטוריה ופרטיות

תעבורות מבוזרות אינן מבטיחות אחסון קבוע של הודעות ישנות. לארכיון אנו משתמשים ב:

  • Ceramic Network: זרמים הניתנים להוספה בלבד עם ערבויות קריפטוגרפיות למחבר
  • Arweave: אחסון קבוע, יקר יותר אך קבוע. משמש לתקשורת קריטית
  • אירוח עצמי: משתמשים מאחסנים הודעות מקומית (IndexedDB), מסנכרנים דרך IPFS

מצב פרטיות: שילוב עם Railgun להודעות אנונימיות באמצעות zk-proofs.

ארכיטקטורת חזית

צ'אט הוא אחד מרכיבי ה-UI התובעניים ביותר בניהול מצב. לצ'אט Web3:

  • הודעות בזמן אמת: XMTP SDK מספק איטרטור אסינכרוני streamMessages()
  • שמירת הודעות: TanStack Query עם גלילה אינסופית להיסטוריה ועדכונים אופטימיים
  • סוגי תוכן: עיבוד markdown, תצוגות מקדימות NFT מובנות, תצוגות מקדימות עסקאות
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>;
}

השוואת גישות

גישה זהות תעבורה אחסון היסטוריה הגבלת אסימונים מיקרו-תשלומים
אחסון מלא על הרשת Ethereum על הרשת (tx) על הרשת טבעי רק ETH
XMTP Ethereum (כתובת) רשת P2P XMTP חיצוני (Ceramic) דרך היישום Superfluid
Waku אופציונלי P2P (libp2p) Waku Store דרך שכבת היישום חיצוני

מה כלול בעבודה

  • ניתוח דרישות ועיצוב ארכיטקטורה
  • בחירת מחסנית (XMTP/Waku, Ethereum/Polygon)
  • פיתוח חוזים חכמים להגבלת אסימונים ותשלומים
  • שילוב XMTP/Waku והגדרת צומת ממסר
  • יישום חזית (React/Next.js) עם תמיכה בארנק Web3
  • פריסה ובדיקות (Tenderly, Slither)
  • תיעוד והעברת קוד מקור
  • הכשרת צוות הלקוח
  • תמיכה לאחר השחרור

הערכות לוחות זמנים

  • צ'אט בסיסי 1-on-1 עם XMTP וזהות מבוססת ארנק — 1-2 שבועות
  • צ'אטים קבוצתיים (XMTP MLS), תנאי הגבלת אסימונים מרובים, שמירת היסטוריה — 4-6 שבועות
  • פלטפורמה מלאה עם תעבורת P2P מותאמת אישית, ערוצי תשלום ותמיכה מרובת רשתות — 2-3 חודשים

העלות מחושבת באופן אישי. מוכנים לדון בפרויקט שלך? צור קשר לייעוץ.