פיתוח צ'אט מבוזר על בלוקצ'יין
אנו מפתחים צ'אטים מבוזרים שבהם הבלוקצ'יין משמש לזהות, ניהול מפתחות, ערוצי תשלום והוכחת קיום, בעוד שההודעות מועברות באמצעות תעבורת 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 שלבים
- הגדרת ארנק: חבר כל ארנק Ethereum (MetaMask, WalletConnect). השג חותם באמצעות ethers.js או viem.
-
יצירת לקוח 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 (דורש עסקה אחת על הרשת). -
יצירת שיחה: קרא ל-
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' })עבור קבוצות. השיחה מוכנה מיד להחלפת הודעות. -
שליחה והרשמה: השתמש ב-
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 חודשים
העלות מחושבת באופן אישי. מוכנים לדון בפרויקט שלך? צור קשר לייעוץ.







