פריסת תשתית בלוקצ'יין: צמתים, RPC, אינדוקס
ה-Subgraph קרס ב-3:47 לפנות בוקר. עד הבוקר המשתמשים ראו יתרות מיושנות, עסקאות "נתקעו" בממשק, והתמיכה קיבלה 47 פניות בשעה. הסיבה: ה-handler ב-subgraph נכשל על עסקה עם לוג אירוע לא סטנדרטי — וכל האינדוקס נעצר. נתקלנו במצבים כאלה עשרות פעמים. הניסיון שלנו מראה: תשתית בלוקצ'יין לא סולחת על פערים בניטור. הבטחת זמינות ללא ניטור רב-שכבתי וארכיטקטורה עמידה לתקלות היא בלתי אפשרית. במשך למעלה מ-8 שנים בעבודה עם Ethereum, Polygon ו-Solana, פיתחנו גישה המאפשרת פריסה צפויה של תשתית בכל קנה מידה — מצומת בודד ועד רשת רב-שרשרתית עם עשרות subgraphs.
ארכיטקטורת שכבת RPC
כל אינטראקציה של dApp עם הבלוקצ'יין עוברת דרך RPC — ה-API מסוג JSON-RPC שמספק צומת. שלוש אפשרויות:
ספקים מנוהלים — Alchemy, QuickNode, Infura, Ankr. עלויות תפעול מינימליות, SLA, ניטור מובנה. מגבלות: מגבלות קצב (Alchemy Free: 300 RU/sec), נעילת ספק, וזמינות נמוכה אפשרית בזמן תקלות ספק. עבור רוב הפרויקטים — הבחירה הנכונה בהתחלה.
צמתים עצמיים — שליטה מלאה, ללא מגבלות קצב, ללא תלות בצד שלישי. עלות: צומת Ethereum ארכיוני דורש 2.5–3TB SSD, שרת חזק ותמיכת DevOps. סנכרון מאפס ב-Ethereum דרך Geth/Nethermind — 3–7 ימים. מוצדק בעומס גבוה או בדרישות השהיה.
היברידי — צומת עצמי כעיקרי, ספק מנוהל כגיבוי. סטנדרט לפרוטוקולים עם TVL גבוה. איזון עומסים נכון יכול להפחית עלויות ב-20–30% לעומת הגדרה מנוהלת טהורה. בהיקף בקשות חודשי גבוה, ההיברידי חוסך משמעותית.
| ספק | חוזקה | מגבלה |
|---|---|---|
| Alchemy | Supernode, Enhanced APIs, webhooks | יקר בהיקפים גבוהים |
| QuickNode | השהיה נמוכה, רב-שרשרתי | יקר יותר מ-Alchemy בתוכנית הבסיסית |
| Infura | אמינות היסטורית | מגבלות קצב בחינם, תקלה אחת גדולה עצרה חצי מ-DeFi |
| Ankr | זול, 40+ שרשראות | פחות יציב |
איך להקים שכבת RPC ללא נקודת כשל אחת?
לפחות שני ספקים, DNS round-robin עם בדיקת בריאות כל 5 שניות, מעבר אוטומטי כשהשהיה >500 אלפיות השנייה. בפועל, זה נותן זמינות של 99.99% בזמן כשל של כל ספק. לפרוטוקולים עם TVL גבוה, אנו ממליצים על HA-proxy מותאם (nginx או Envoy) מול שני ספקים מנוהלים.
למה תכנית RPC היברידית משתלמת יותר ממנוהלת טהורה?
בהיקפי בקשות גבוהים, ספקים מנוהלים יכולים להיות יקרים מאוד; היברידי המשתמש בצומת עצמי כעיקרי וגיבוי מנוהל מקצץ עלויות משמעותית מבלי לאבד SLA.
לקוחות צומת Ethereum
לקוחות ביצוע: Geth (הנפוץ ביותר), Nethermind (C#, סנכרון מהיר), Besu (Java, ארגוני), Erigon (הסנכרון המהיר ביותר, מצב ארכיון יעיל ~2TB במקום 3TB).
לקוחות קונצנזוס (אחרי The Merge): Lighthouse (Rust), Prysm (Go), Teku (Java), Nimbus (Nim). כל צומת אחרי The Merge דורש זוג של לקוחות ביצוע + קונצנזוס.
ל-DevOps: eth-docker — תצורות Docker Compose לכל שילובי הלקוחות. הגדרת ניטור דרך Grafana + Prometheus היא חובה; לוח מחוונים סטנדרטי זמין במאגר של כל לקוח.
The Graph: אינדוקס אירועים
פרוטוקול The Graph — אינדוקס מבוזר. subgraph מתאר אילו אירועים מאילו חוזים לאינדקס וכיצד להפוך אותם לסכמת GraphQL.
מבנה subgraph:
-
subgraph.yaml— מניפסט: כתובות חוזה, startBlock, אירועים לטיפול -
schema.graphql— סכמת GraphQL של ישויות -
src/mapping.ts— מטפלי אירועים ב-AssemblyScript
dataSources: - kind: ethereum name: UniswapV3Pool network: mainnet source: address: "0x88e6A0c2dDD26FEEb64F039a2c41296FcB3f5640" abi: UniswapV3Pool startBlock: 12370624 mapping: eventHandlers: - event: Swap(indexed address,indexed address,int256,int256,uint160,uint128,int24) handler: handleSwap מטפלי AssemblyScript — לא TypeScript. אין טיפוסי nullable, אין closures, אין הרבה APIs סטנדרטיים. שגיאה ב-handler עוצרת את אינדוקס ה-subgraph על אותה עסקה. חשוב: הוסיפו try-catch לפעולות שעלולות להיכשל (למשל, dataSources: - kind: ethereum name: UniswapV3Pool network: mainnet source: address: "0x88e6A0c2dDD26FEEb64F039a2c41296FcB3f5640" abi: UniswapV3Pool startBlock: 12370624 mapping: eventHandlers: - event: Swap(indexed address,indexed address,int256,int256,uint160,uint128,int24) handler: handleSwap עבור ישות שאולי לא קיימת).
איך להימנע מעצירות אינדוקס של subgraph?
לוגים של Graph Node מנוטרים בזמן אמת; על hasIndexingErrors = true מופעלת התראה והפעלה מחדש אוטומטית של הצומת (דרך systemd או Kubernetes). זמן השבתה טיפוסי על שגיאה — 150–300 שניות להתאוששות. בנוסף, לייצור אנו מגדירים watchdog שמפעיל מחדש את Graph Node אם הפיגור של ה-subgraph עולה על 50 בלוקים.
בחירה בין שירות מתארח לרשת מבוזרת
Graph Hosted Service (חינמי, ריכוזי) הוצא משימוש לטובת Subgraph Studio + Graph Network. לייצור: פריסה על Graph Network עם אות ק curation של GRT — ה-subgraph מקבל indexers ביחס ל-curation.
חלופות ל-The Graph: Ponder (TypeScript, מתארח עצמאית, קל יותר לניפוי), Envio (אינדקסר מהיר במיוחד, תומך ב-EVM + לא-EVM), Subsquid (TypeScript, רשת משלו), Moralis Streams (מנוהל, מבוסס webhook). הניסיון שלנו מראה: לפרויקטים בעומס גבוה עם לוגיקה ייחודית, Ponder או Envio יעילים יותר — הם נותנים שליטה מלאה על התהליך ואינם דורשים טוקנומיקת GRT.
Webhooks והתראות בזמן אמת
Alchemy Webhooks ו-QuickNode Streams מאפשרים קבלת אירועים בזמן אמת דרך HTTP webhook או WebSocket. לניטור כתובות, עסקאות חדשות, mints — זה מהיר יותר מסקירת RPC.
Tenderly — פלטפורמה לניטור והתראות. ניתן להגדיר התראה על אירוע חוזה ספציפי, שינוי יתרה, קריאת פונקציה עם פרמטרים מסוימים. סימולציית עסקאות דרך Tenderly API היא invaluable לניפוי.
ניטור ו-Observability
מחסנית ניטור מינימלית לפרוטוקול:
On-chain: OpenZeppelin Defender Sentinel — צופה באירועי חוזה, מפעיל webhook או Autotask כשהתנאים מתקיימים. Forta Network — בוטים בקהילה מזהים אנומליות (משיכות גדולות, flash loans, התקפות ממשל).
תשתית: Grafana + Prometheus לצמתים, Datadog או Grafana Cloud למדדים מנוהלים. התראות על: צומת בפיגור של 10+ בלוקים, השהיית RPC >500ms, פיגור subgraph >100 בלוקים.
זמינות: Better Uptime או PagerDuty על נקודת קצה RPC ונקודת בריאות subgraph (The Graph מספק store.get()).
למה ניטור ללא Tenderly אינו מספיק?
Tenderly מספק סימולציית עסקאות ועקבות מפורטים — קריטי לניפוי שגיאות subgraph וחוזה חכם. Forta מתמקד באנומליות רשת, לא בתשתית שלך. השילוב של Tenderly עם לוח מחוונים Grafana מותאם מכסה 90% מתרחישי התקלות.
תשתית רב-שרשרתית
פרוטוקול על 5 שרשראות = 5 נקודות קצה RPC נפרדות, 5 subgraphs, 5 תצורות ניטור. ניתן לניהול אך דורש אוטומציית פריסה.
לפריסת subgraph רב-רשתית: _meta { hasIndexingErrors, block { number } }, graph deploy --network mainnet וכו' עם בסיס קוד אחיד וכתובות ספציפיות לרשת בקבצי תצורה נפרדים.
Chainlink CCIP ו-LayerZero להודעות חוצות-שרשרת דורשות ניטור של שתי השרשראות ושל עסקאות בממסרי ביניים. reorg בשרשרת המקור אחרי mint מאושר בשרשרת היעד היא בעיית גשר קלאסית. פתרון: המתנה לסופיות (ב-Ethereum ~15 דקות אחרי Merge לסופיות כלכלית) לפני אישור בשרשרת היעד.
תהליך הקמת תשתית
- ביקורת מחסנית נוכחית — קביעת שרשראות, היקף בקשות, דרישות השהיה וזמינות.
- עיצוב ארכיטקטורה — בחירת ספקים, איזון עומסים, יתירות.
- פיתוח subgraph — מניפסט → סכמה → handlers → בדיקות על Graph Node מקומי → פריסה ל-testnet → mainnet.
- הגדרת ניטור — התראות Tenderly, לוח מחוונים Grafana, אינטגרציית PagerDuty.
- תיעוד ו-runbook — מה לעשות כש: subgraph בפיגור, השבתת RPC, desync של צומת.
- העברה לתפעול — הדרכת צוות, העברת גישה, תמיכה בחודש הראשון.
מה כלול
- פריסת צמתים מנוהלים או מתארחים עצמאית של Ethereum, Polygon, BNB Chain
- הקמת שכבת RPC עם עיקרי/גיבוי ואיזון עומסים
- פיתוח ופריסת subgraph לפרוטוקול שלך
- חיבור ניטור (Tenderly, Grafana, התראות)
- Runbook ותיעוד תפעולי
- הדרכת צוות (עד 4 שעות מקוונות)
- תמיכה ל-30 יום לאחר המסירה
ציר זמן
| משימה | משך |
|---|---|
| הקמת RPC וניטור בסיסי | 1–2 שבועות |
| Subgraph לפרוטוקול אחד | 2–4 שבועות |
| צומת מתארח עצמאית עם ניטור | 2–3 שבועות |
| תשתית מלאה (רב-שרשרת, ניטור, runbooks) | 6–10 שבועות |
כל הפרויקטים מנוהלים במאגר GitHub/GitLab עם CI/CD; קוד התצורה נשאר אצלך. הזמינו פריסת תשתית — נראה לכם איך לקצץ עלויות ב-20–30% מבלי לאבד אמינות. קבלו ייעוץ — נדגים כיצד פרסנו תשתית לפרוטוקול עם TVL גדול ב-Ethereum ו-Arbitrum. צרו קשר.







