אנחנו רואים את זה כל הזמן: חוזים חכמים נכתבים, ביקורות עוברות, אבל הפרויקט נתקע על תשתית בסיסית—צמתים קורסים, מגבלות קצב של RPC חונקות, אירועים הולכים לאיבוד. לכן אנחנו בונים תשתית כך שלא תצטרכו לחשוב עליה. תשתית blockchain מוכנה לייצור היא לא רק צומת; היא מחסנית מלאה: הגדרת צומת, ריבוב RPC, אינדקסר מותאם אישית, צינור אירועים, וניטור. תשתית ה-blockchain שלנו כוללת צמתים ייעודיים, RPC עם גיבוי, אינדקסרים מותאמים אישית, וניטור—הכל בחבילה אחת.
עם ניסיון של למעלה מ-5 שנים ו-20+ פרויקטי blockchain, אנו מבטיחים תשתית מוכנה לייצור שמקצרת את זמן התקלות ב-80%. עבור פרויקט DeFi טיפוסי, התשתית שלנו חוסכת $24,000 בשנה בעמלות RPC. עבור פרויקט המטפל ב-100 מיליון בקשות חודשיות, צמתים מתארחים עצמית מפחיתים את עלויות ה-RPC מ-$60,000 ל-$12,000 בשנה—חיסכון של $48,000.
תוך 3–6 שבועות אנו מקימים הכל מאפס: מבחירת המחסנית ועד ל-runbook מתועד עם התראות. הניסיון מראה שתשתית מתוכננת היטב מקצרת את זמן התקלות ב-80%.
תשתית מוכנה לייצור כוללת צמתים ייעודיים עם גיבוי, אינדקסרים מותאמים אישית לאירועים, ניטור של כל המדדים, ושחזור אוטומטי. בלעדיה, אפילו חוזה חכם מושלם נשאר בלתי נגיש למשתמשים. אנו מגדירים כל שכבה: מבחירת לקוח הצומת (Reth או Geth) ועד להגדרת התראות Prometheus. בואו נפרק את הרכיבים המרכזיים באמצעות פרויקט DeFi אמיתי המטפל ב-1000 בקשות בשנייה.
שכבות של תשתית Blockchain
+-------------------------------------------------+ | Application Layer | | (Frontend, API, Business Logic) | +-------------------------------------------------+ | Data Access Layer | | (GraphQL API, REST API, WebSocket) | +-------------------------------------------------+ | Indexing Layer | | (The Graph / custom indexer / event processor)| +-------------------------------------------------+ | Node Layer | | (Archive node / full node / light client) | +-------------------------------------------------+ | Blockchain Layer | | (Ethereum / L2 / custom chain) | +-------------------------------------------------+ לכל שכבה יש דרישות אמינות וקנה מידה. נסקור את העיקריות.
צומת מתארח עצמית מול ספק RPC: קריטריוני בחירה
צמתים מתארחים עצמית נדרשים כאשר: נדרשים צמתי ארכיון לשאילתות היסטוריות (ספקים גובים הרבה); מגבלות קצב קריטיות (100k+ בקשות ביום הופכות ספקים ליקרים או מגבילים); פרטיות חשובה (הספק רואה את כל הבקשות); נדרשות שיטות debug/trace (לא זמינות מספקים).
עבור 80% מהפרויקטים, ספק חיצוני מספיק. צמתים מתארחים עצמית מיועדים למקרים שבהם העומס או דרישות השליטה חורגים מהמגבלות.
| קריטריון | צומת מתארח עצמית | ספק RPC |
|---|---|---|
| עלות לכל מיליון בקשות | ~$0.5–1 (חומרה) | $5–40 |
| זמן עד להשקה | 2–4 ימים לסנכרון | מיידי |
| מגבלות קצב | אין | כן |
| שיטות debug/trace | כן | לא |
| אמינות | דורש ניטור פרואקטיבי | SLA 99.9% |
הרצת Reth (Rust Ethereum) מסנכרנת מהר יותר מ-Geth—סנכרון צומת מלא תוך 24–48 שעות. דוגמת הגדרה:
reth node \ --chain mainnet \ --http \ --http.addr 0.0.0.0 \ --http.port 8545 \ --http.api eth,net,web3,debug,trace \ --ws \ --ws.addr 0.0.0.0 \ --ws.port 8546 \ --authrpc.addr 127.0.0.1 \ --authrpc.port 8551 \ --authrpc.jwtsecret /path/to/jwt.hex \ --datadir /data/reth דרישות חומרה: 4+ CPU, 16+ GB RAM, 2+ TB NVMe, קישור 25 Mbps. גם עם ספק, יש צורך בגיבוי. תבנית: מאזן עומסים עם בדיקות בריאות:
class RpcMultiplexer { private providers: JsonRpcProvider[]; private healthStatus: Map<string, boolean>; constructor(endpoints: string[]) { this.providers = endpoints.map(url => new JsonRpcProvider(url)); this.healthStatus = new Map(); this.startHealthChecks(); } async getHealthyProvider(): Promise<JsonRpcProvider> { const healthy = this.providers.filter( (p, i) => this.healthStatus.get(String(i)) !== false ); if (healthy.length === 0) throw new Error('No healthy RPC providers'); return healthy[Math.floor(Math.random() * healthy.length)]; } private startHealthChecks(): void { setInterval(async () => { for (let i = 0; i < this.providers.length; i++) { try { await this.providers[i].getBlockNumber(); this.healthStatus.set(String(i), true); } catch { this.healthStatus.set(String(i), false); } } }, 15_000); } } צינור אירועים: רכיבים והכרחיות
הצינור מעבד אירועי blockchain: מאזין לבלוקים חדשים, מנתח לוגים, מאחסן נתונים, ומודיע לשירותים. The Graph הוא פתרון מוכן לרוב פרויקטי ה-EVM. ללוגיקה מורכבת, אנו כותבים אינדקסר מותאם אישית.
אינדקסר מותאם אישית נבנה ב-TypeScript עם חידוש סמן (cursor) ועיבוד טרנזקציוני. דוגמה:
class EventIndexer { private db: Pool; private provider: JsonRpcProvider; async indexFromBlock(startBlock: number): Promise<void> { let currentBlock = startBlock; const headBlock = await this.provider.getBlockNumber(); while (currentBlock <= headBlock) { const batch = Math.min(currentBlock + 999, headBlock); const logs = await this.provider.getLogs({ fromBlock: currentBlock, toBlock: batch, address: CONTRACT_ADDRESSES, }); await this.db.query('BEGIN'); try { for (const log of logs) await this.processLog(log); await this.updateCursor(batch); await this.db.query('COMMIT'); } catch (e) { await this.db.query('ROLLBACK'); throw e; } currentBlock = batch + 1; } } } עקרונות מפתח: חידוש סמן, אידמפוטנטיות, טיפול ב-reorg.
למערכות בעומס גבוה, אנו משתמשים ב-Kafka כאוטובוס: מאזינים כותבים ל-topics, מעבדים קוראים ומתמידים ל-PostgreSQL. זה מספק קנה מידה אופקי וסבילות לתקלות.
למה ניטור קריטי לתשתית Blockchain?
המחסנית שלנו: Prometheus + Grafana. מדדים: פיגור אינדקסר (+-------------------------------------------------+ | Application Layer | | (Frontend, API, Business Logic) | +-------------------------------------------------+ | Data Access Layer | | (GraphQL API, REST API, WebSocket) | +-------------------------------------------------+ | Indexing Layer | | (The Graph / custom indexer / event processor)| +-------------------------------------------------+ | Node Layer | | (Archive node / full node / light client) | +-------------------------------------------------+ | Blockchain Layer | | (Ethereum / L2 / custom chain) | +-------------------------------------------------+ ), סך האירועים המעובדים (reth node \ --chain mainnet \ --http \ --http.addr 0.0.0.0 \ --http.port 8545 \ --http.api eth,net,web3,debug,trace \ --ws \ --ws.addr 0.0.0.0 \ --ws.port 8546 \ --authrpc.addr 127.0.0.1 \ --authrpc.port 8551 \ --authrpc.jwtsecret /path/to/jwt.hex \ --datadir /data/reth ), שגיאות RPC (class RpcMultiplexer { private providers: JsonRpcProvider[]; private healthStatus: Map<string, boolean>; constructor(endpoints: string[]) { this.providers = endpoints.map(url => new JsonRpcProvider(url)); this.healthStatus = new Map(); this.startHealthChecks(); } async getHealthyProvider(): Promise<JsonRpcProvider> { const healthy = this.providers.filter( (p, i) => this.healthStatus.get(String(i)) !== false ); if (healthy.length === 0) throw new Error('No healthy RPC providers'); return healthy[Math.floor(Math.random() * healthy.length)]; } private startHealthChecks(): void { setInterval(async () => { for (let i = 0; i < this.providers.length; i++) { try { await this.providers[i].getBlockNumber(); this.healthStatus.set(String(i), true); } catch { this.healthStatus.set(String(i), false); } } }, 15_000); } } עם תוויות method ו-error_type), זמן עיבוד בלוק (class EventIndexer { private db: Pool; private provider: JsonRpcProvider; async indexFromBlock(startBlock: number): Promise<void> { let currentBlock = startBlock; const headBlock = await this.provider.getBlockNumber(); while (currentBlock <= headBlock) { const batch = Math.min(currentBlock + 999, headBlock); const logs = await this.provider.getLogs({ fromBlock: currentBlock, toBlock: batch, address: CONTRACT_ADDRESSES, }); await this.db.query('BEGIN'); try { for (const log of logs) await this.processLog(log); await this.updateCursor(batch); await this.db.query('COMMIT'); } catch (e) { await this.db.query('ROLLBACK'); throw e; } currentBlock = batch + 1; } } } ). התראות: פיגור > 100 בלוקים → קריטי, שגיאות RPC > 10/דקה → אזהרה, עיבוד > 30 שניות → אזהרה.
מדדי ניטור מפורטים
-
resource "aws_instance" "node" { ami = data.aws_ami.ubuntu.id instance_type = "c6i.4xlarge" root_block_device { volume_type = "gp3" volume_size = 2000 iops = 3000 } user_data = templatefile("${path.module}/scripts/node-init.sh", { chain = "mainnet" }) }: ספירת כשלי RPC, תוויות: method, error_type -
eth_blockNumber: כמה רחוק מאחורי ה-blockchain האינדקסר נמצא -
rpc_errors_total > 10: היסטוגרמה של זמן עיבוד בלוק -
provider_health: 0/1 עבור כל נקודת קצה RPC -
node_sync_status: בוליאני אם הצומת מסונכרן
ספי התראה: כל מדד החורג מהמגבלות המוגדרות מראש מפעיל הודעת PagerDuty.
איך להפוך פריסת תשתית Blockchain לאוטומטית?
אנו משתמשים ב-Terraform ו-Ansible לאוטומציה. Terraform מנהל משאבי ענן (שרתים, רשתות), Ansible מטפל בהגדרת צומת ושירות. זה מאפשר שכפול תשתית בין סביבות והתאוששות מהירה. דוגמת מודול Terraform לצומת Ethereum:
resource "aws_instance" "node" { ami = data.aws_ami.ubuntu.id instance_type = "c6i.4xlarge" root_block_device { volume_type = "gp3" volume_size = 2000 iops = 3000 } user_data = templatefile("${path.module}/scripts/node-init.sh", { chain = "mainnet" }) } שלבים אופייניים ולוחות זמנים
| שלב | תוכן | משך |
|---|---|---|
| הערכה | ניתוח דרישות, ארכיטקטורה | 1–3 ימים |
| הגדרת צומת | הגדרת צומת / RPC | 3–5 ימים |
| אינדקסר | Subgraph או אינדקסר מותאם אישית | 1–2 שבועות |
| צינור אירועים | Kafka/Redis, מעבדים, webhooks | 3–5 ימים |
| ניטור | Prometheus + Grafana + התראות | 2–3 ימים |
| בדיקות עומס | בדיקות לחץ | 2–3 ימים |
| תיעוד | Runbook, תגובה לאירועים | 1–2 ימים |
מה כלול בעבודה
- תיעוד ארכיטקטורה (דיאגרמות, תיאור מחסנית)
- גישה לניטור ודשבורדים
- הדרכת צוות (סדנת runbook)
- תמיכה באירועים ב-30 הימים הראשונים לאחר הפריסה
- קוד מקור Terraform/Ansible לשכפול
איך להקים גיבוי RPC: שלב אחר שלב
- פרוס שני צמתים באזורים שונים (AWS eu-west-1 ו-us-east-1) או השתמש בספקים שונים.
- הגדר בדיקות בריאות על כל צומת: probe
eth_blockNumberכל 15 שניות. - הקם מאזן עומסים (HAProxy או NGINX) עם round-robin ובדיקות בריאות פסיביות.
- הוסף לוגיקת retry בצד הלקוח: בשגיאות 429 או 503, עבור לנקודת הקצה הבאה.
- הגדר התראת Prometheus:
rpc_errors_total > 10לדקה → קריטי.
תיעוד הגדרת צומת Ethereum - https://ethereum.org/en/developers/docs/nodes-and-clients/
ניהול מפתחות: מפתחות קריאה בלבד לאינדקסרים ו-APIs, מפתחות טרנזקציות ב-AWS KMS או Vault, מפתחות מנהל רק דרך multisig. סובב מפתחות API כל 90 יום.
טעויות אופייניות בהקמת תשתית
- שימוש בספק RPC יחיד ללא גיבוי → השבתה בהפסקת ספק.
- אין חידוש סמן באינדקסר → אינדוקס מחדש מלא לאחר כשל.
- התעלמות ממגבלות קצב של ספק → חסימות פתאומיות בעומס שיא.
- חומרה לא נכונה לצמתים → סנכרון איטי וקריסות תכופות.
צרו קשר לייעוץ על התשתית שלכם. אנו מבטיחים 99.9% זמינות לפתרון שלכם. חיסכון בעלויות תשתית יכול להגיע עד 60% בהשוואה לספקים מסחריים בעומס גבוה. הזמינו פריסת turnkey.
אנו ממליצים לעיין בEthereum - https://en.wikipedia.org/wiki/Ethereum ובתיעוד The Graph - https://thegraph.com/docs/.







