איגרגציית נתונים מרובת שרשראות: ארכיטקטורה ויישום

איגרגציית נתונים מרובת שרשראות: ארכיטקטורה ויישום המשימה נראית פשוטה: "לאסוף נתונים ממספר בלוקצ'יינים." בפועל, זו אחת המשימות המורכבות ביותר מבחינה טכנית בתשתית Web3. לכל רשת יש מודל נתונים משלה, לוגיקת סופיות משלה, API RPC משלה, מגבלות קצב, וספציפי

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

שאלות נפוצות

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

  • image_website-b2b-advance_0.webp
    פיתוח אתר חברה B2B ADVANCE
    1452
  • image_web-applications_feedme_466_0.webp
    פיתוח אפליקציית ווב עבור FEEDME
    1310
  • image_websites_belfingroup_462_0.webp
    פיתוח אתר עבור BELFINGROUP
    1005
  • image_ecommerce_furnoro_435_0.webp
    פיתוח חנות מקוונת לחברת FURNORO
    1270
  • image_logo-advance_0.webp
    עיצוב לוגו לחברת B2B Advance
    719
  • image_crm_enviok_479_0.webp
    פיתוח אפליקציית ווב עבור Enviok
    1012

אגרגציית נתונים מרובת-שרשרות: ארכיטקטורה ויישום

המשימה נראית פשוטה: "לאסוף נתונים ממספר בלוקצ'יינים." בפועל, זו אחת המשימות המורכבות ביותר מבחינה טכנית בתשתית Web3. לכל רשת יש מודל נתונים משלה, לוגיקת סופיות משלה, RPC API, מגבלות קצב ומוזרויות ספציפיות. Ethereum חי ב-UTC עם בלוקים של ~12 שניות, Solana מייצרת slots של ~400ms ומתייחסת לאישורים בצורה שונה, TON בעל ארכיטקטורת sharded שבה "בלוק" הוא מושג רופף. איסוף כל זה ל-API יחיד עם נתונים עקביים אינו הישג הנדסי טריוויאלי.

הצוות שלנו מביא למעלה מ-5 שנות ניסיון בפיתוח תשתית בלוקצ'יין ובנה אגרגטורים ל-15+ רשתות. אנו מכירים את כל המלכודות: מארגונים מחדש לא ברורים ועד חיסכון בקריאות RPC. אנו מבטיחים זמינות של 99.9% ומציעים הערכה חינם לפרויקט שלך.

אתגרים באיחוד נתונים מרשתות שונות

מודלי נתונים שונים

רשתות EVM (Ethereum, Arbitrum, Polygon, BSC) חולקות מודל משותף: בלוקים, עסקאות, קבלות עם לוגים. אבל גם כאן יש הבדלים:

  • Arbitrum מוסיף interface ChainCollector { getLatestBlock(): Promise<UnifiedBlock>; getBlockRange(from: bigint, to: bigint): Promise<UnifiedBlock[]>; getTransactionsByAddress(address: string, fromBlock: bigint): Promise<UnifiedTx[]>; subscribeNewBlocks(callback: (block: UnifiedBlock) => void): Unsubscribe; } ועסקאות מערכת ספציפיות (sequencer batch submissions)
  • Optimism/Base יש להם סוג interface UnifiedTx { chain: ChainId; hash: string; blockNumber: bigint; timestamp: number; // unix from: string; // normalized lowercase hex для EVM, base58 для Solana to: string | null; value: bigint; // в наименьших единицах нативного токена status: 'success' | 'failed' | 'pending'; finality: 'unconfirmed' | 'safe' | 'finalized'; raw: unknown; // оригинальные данные сети } לעסקאות L1→L2 שחסר להן Primary: Собственные ноды (Geth+Lighthouse, Reth для архива) ↓ failover Secondary: Alchemy / QuickNode (premium tier) ↓ failover Tertiary: Infura / публичные RPC (только для некритичных запросов) סטנדרטי
  • zkSync Era משתמשת ב-AA מקורי — אין הבחנה בין EOA לחוזים; כל החשבונות הם חוזים

Solana היא פרדיגמה שונה לחלוטין: אין "עסקה שקוראת למתודת חוזה" — במקום זאת, "הוראות בעסקה מועברות לתוכניות." פענוח דורש מקביל ל-ABI: IDL (Interface Definition Language, פורמט Anchor).

מודלי UTXO (Bitcoin, Litecoin) שונים מהותית: אין יתרות חשבון, רק outputs שלא נוצלו. "יתרת כתובת" היא סכום כל ה-UTXOs שבהם הכתובת היא output.

סמנטיקות סופיות שונות

רשת מנגנון סופיות
Ethereum PoS + Casper FFG ~15 דקות (checkpoint מאושר)
Arbitrum One Optimistic Rollup ~7 ימים (חלון הוכחת הונאה) לסופיות L1
Polygon PoS Heimdall checkpoints ~30 דקות לסופיות Ethereum
Solana Tower BFT ~12-32 slots (~6–16 שניות)
Bitcoin PoW 6 אישורים (~60 דקות) — תקן מקובל

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

לפי מפרט Ethereum לאחר Merge, עומק הארגון מחדש רק לעיתים רחוקות עולה על 2 בלוקים.

ארכיטקטורת האגרגטור

שכבת האספנים (Chain Collectors)

כל אספן הוא שירות מבודד האחראי על רשת אחת עם ממשק משותף:

interface ChainCollector { getLatestBlock(): Promise<UnifiedBlock>; getBlockRange(from: bigint, to: bigint): Promise<UnifiedBlock[]>; getTransactionsByAddress(address: string, fromBlock: bigint): Promise<UnifiedTx[]>; subscribeNewBlocks(callback: (block: UnifiedBlock) => void): Unsubscribe; } 

סוגים מאוחדים מנרמלים את המוזרויות של כל רשת:

interface UnifiedTx { chain: ChainId; hash: string; blockNumber: bigint; timestamp: number; // unix from: string; // normalized lowercase hex для EVM, base58 для Solana to: string | null; value: bigint; // в наименьших единицах нативного токена status: 'success' | 'failed' | 'pending'; finality: 'unconfirmed' | 'safe' | 'finalized'; raw: unknown; // оригинальные данные сети } 

ניהול צמתים וספקים

בעיה: RPC ציבוריים לא אמינים, מגבלות קצב בלתי צפויות, Alchemy/Infura הופכים ליקרים בקנה מידה.

אסטרטגיה: מאגר ספקים מדורג

Primary: Собственные ноды (Geth+Lighthouse, Reth для архива) ↓ failover Secondary: Alchemy / QuickNode (premium tier) ↓ failover Tertiary: Infura / публичные RPC (только для некритичных запросов) 

מפסק חשמל על כל ספק: אם שיעור השגיאות > 5% במשך 60 שניות או זמן השהיה > פי 2 מ-p99 הבסיסי — הסר את הספק מהרוטציה, בדיקת בריאות כל 30 שניות.

לנתוני ארכיון (בלוקים היסטוריים > 128 בלוקים אחורה ב-Ethereum) יש צורך בצומת ארכיון — זה סיפור נפרד. הפעלת צומת ארכיון של Ethereum על ספק ענן עולה בערך $400-600/חודש, אבל שימוש במאגר ספקים מדורג יכול להפחית עלויות RPC חודשיות בעד 50%, ולחסוך אלפים ליישומים עם נפח גבוה. Erigon דורש ~3TB לארכיון Ethereum מלא, Reth מעט פחות. עבור רוב הפרויקטים, זול יותר להשתמש ב-Alchemy Archive או QuickNode Archive מאשר לארח צומת משלך.

בניית אגרגטור משלך יכולה לחסוך עד 50% בעלויות תשתית בהשוואה לשימוש ב-API של צד שלישי, מה שיכול להסתכם באלפי דולרים בחודש ליישומים עם תפוקה גבוהה.

למה צומת משלך או מאגר ספקים חשוב?

אמינות RPC משפיעה ישירות על עקביות הנתונים. ללא יתירות, אתה מסתכן בפיגור באיסוף נתונים או אובדן בלוקים במהלך ארגונים מחדש. צמתים משלך מפחיתים עלויות לטווח ארוך: כל קריאת RPC עולה כסף, ועם מיליוני עסקאות, החיסכון יכול להגיע עד 50% מתקציב התשתית. אנו ממליצים על גישה מדורגת לאיזון בין עלות לאמינות.

שכבת נורמליזציה וטרנספורמציה

נתוני בלוקצ'יין גולמיים רק לעיתים רחוקות נדרשים כפי שהם. טרנספורמציות נפוצות: פענוח אירועי ERC-20 Transfer

const ERC20_TRANSFER_TOPIC = "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef"; function decodeTransfer(log: Log): TokenTransfer | null { if (log.topics[0] !== ERC20_TRANSFER_TOPIC) return null; return { token: log.address, from: `0x${log.topics[1].slice(26)}`, to: `0x${log.topics[2].slice(26)}`, amount: BigInt(log.data), }; } 

העשרה בנתוני טוקן: עבור כל const ERC20_TRANSFER_TOPIC = "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef"; function decodeTransfer(log: Log): TokenTransfer | null { if (log.topics[0] !== ERC20_TRANSFER_TOPIC) return null; return { token: log.address, from: `0x${log.topics[1].slice(26)}`, to: `0x${log.topics[2].slice(26)}`, amount: BigInt(log.data), }; } , אנו צריכים GET /v1/address/{address}/transactions?chains=eth,arb,polygon&limit=50 GET /v1/tx/{chain}/{hash} GET /v1/address/{address}/token-balances?chains=eth,bsc WS /v1/subscribe?address={addr}&chains=eth,arb&events=transfer,swap , decimals, USD price. אנו שומרים מטא-דאטה של טוקנים ב-Redis עם TTL של 24 שעות, ומעדכנים מחירים כל 30 שניות מ-CoinGecko/CoinMarketCap.

אגרגציה חוצת-שרשרות: כדי להציג "יתרת כתובת כוללת בכל הרשתות ב-USD", אנו צריכים לנרמל עשרוניות שונות, להמיר דרך הזנות מחירים, ולטפל בגרסאות wrapped של אותו טוקן (USDC ב-Ethereum ≠ USDC.e ב-Arbitrum).

שכבת אחסון

לנתונים חמים (7–30 הימים האחרונים): PostgreSQL עם חלוקה לפי chain_id + תאריך. אינדקסים על (chain_id, address, block_number) ו-(chain_id, tx_hash). טבלאות היפר של TimescaleDB אם נפח הנתונים גבוה — דחיסה אוטומטית של מחיצות ישנות.

לנתונים קרים (ארכיון): ClickHouse — מסד נתונים עמודי, יעיל בסדר גודל מ-PostgreSQL לשאילתות אנליטיות על תקופות גדולות. ClickHouse מהיר פי 10-100 מ-PostgreSQL לשאילתות אנליטיות על מערכי נתונים גדולים. שאילתה "כל עסקאות USDC > $10k בשנה האחרונה בכל רשתות EVM" על 100M+ שורות — ClickHouse מחזיר תוצאות בשניות, PostgreSQL בדקות.

לחיפוש כתובות/גיבובים: ElasticSearch או פשוט PostgreSQL עם LIKE — להתאמות מדויקות, אינדקס גיבוב מספיק.

הבטחת עקביות נתונים במהלך ארגונים מחדש

זה החלק הקשה ביותר. אלגוריתם:

  1. כל בלוק נשמר עם is_canonical = true ו-parent_hash
  2. בלוק חדש עם אותו block_number אבל hash שונה מצביע על ארגון מחדש פוטנציאלי
  3. עקוב אחר parent_hash אחורה עד שנמצא אב קדמון משותף
  4. סמן את כל הבלוקים בענף ה"ישן" כ-is_canonical = false, הוסף בלוקים של הענף ה"חדש"
  5. נתוני ה-API הפלט תמיד מסוננים לפי is_canonical = true
  6. Webhooks/מערכות במורד הזרם מקבלות אירועי tx.orphaned לעסקאות שבוטלו

עבור Ethereum, עומק ארגון מחדש הוא נדיר ביותר > 2 בלוקים לאחר Merge. עבור Polygon PoS, ראינו ארגונים מחדש של 30+ בלוקים. חיץ תצפית: 128 בלוקים לרשתות EVM.

שכבת API

REST + WebSocket לזמן אמת:

GET /v1/address/{address}/transactions?chains=eth,arb,polygon&limit=50 GET /v1/tx/{chain}/{hash} GET /v1/address/{address}/token-balances?chains=eth,bsc WS /v1/subscribe?address={addr}&chains=eth,arb&events=transfer,swap 

GraphQL נוח אם לקוחות צריכים גמישות בשאילתות: בקשה אחת מקבלת עסקאות + יתרות + מטא-דאטה של טוקנים. אבל זה מוסיף מורכבות לשרת — בעיות N+1, צריך DataLoader.

הגבלת קצב: per-API-key, חלון הזזה, מגבלות נפרדות ל-REST ו-WebSocket (חיבורי WebSocket יקרים יותר). Redis + סקריפט Lua לספירות אטומיות.

ניטור ותפעול

מדדים קריטיים:

  • פיגור אספן — ההפרש בין חותמת הזמן של הבלוק האחרון ברשת לזמן שבו הבלוק עובד. התראה אם הפיגור > 2 דקות.
  • עומק ארגון מחדש — עומק ארגון מחדש מקסימלי ב-24 השעות האחרונות. התראה אם העומק > 10.
  • שיעור שגיאות RPC — לפי ספק ומתודה. התראה אם > 1%.
  • עומק תור — אם המעבד לא יכול לעמוד בקצב האספן, התור גדל. התראה אם העומק > 10k הודעות.

לוח מחוונים של Grafana עם פאנלים לכל שרשרת: בלוק נוכחי, פיגור, TPS, שיעור שגיאות.

פרטי יישום ניטוראנו משתמשים ב-Prometheus לאיסוף מדדים ו-PagerDuty להתראות. לכל אספן יש בדיקות בריאות; אם צומת הופך ללא זמין, אנו עוברים אוטומטית לספק גיבוי.

מחסנית טכנולוגית

רכיב טכנולוגיה
אספנים Node.js (viem/ethers) + Go לרשתות עם תפוקה גבוהה
תור Apache Kafka (תפוקה גבוהה) או RabbitMQ (בינוני)
אחסון חם PostgreSQL 15 + TimescaleDB
אחסון קר ClickHouse
מטמון Redis Cluster
API Node.js (Fastify) או Go (Fiber)
ניטור Prometheus + Grafana + PagerDuty
אורכיסטרציה Kubernetes עם HPA על אספנים

מה כלול

  1. דיאגרמת ארכיטקטורת מערכת
  2. קוד מקור לאספנים ו-API
  3. תיעוד פריסה ותפעול
  4. ניטור והתראות (לוחות מחוונים של Grafana)
  5. חודשיים של תמיכה טכנית
  6. הכשרה לצוות הלקוח

ציר זמן ל-MVP (3–4 רשתות EVM, ללא ארכיון, REST API): 8–12 שבועות. מערכת מלאה עם 10+ רשתות, ClickHouse, WebSocket, ניטור: 5–7 חודשים.

צמתים משלך זולים ב-50% משימוש בספקי RPC של צד שלישי לרשתות עם תפוקה גבוהה. חיסכון בספקי RPC באמצעות אופטימיזציית שאילתות וצמתים משלך יכול להגיע עד 50%.

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