מדוע צמתים סטנדרטיים אינם מתמודדים עם זרימת נתונים
צומת מלא מחזיק את מצב כל הרשת ומגיש נתונים דרך קריאות RPC — זה נוח לארנק, אך לא לאנליטיקה ותרחישי מוצר.
כל בקשת היסטוריה היא либо מעבר על בלוקים, либо eth_getLogs בטווח צר, וברגע שבלוק אחד מכיל כמה אלפי אירועים, הצומת מתחיל להחזיר תשובות בחלקים או לנתק את החיבור לחלוטין בגלל timeout. האפליקציה מקבלת לא נתונים אלא fragments, ואי אפשר לשחזר מהם תמונה שלמה.
פיגור האינדוקסציה — הבעיה המערכתית השנייה. הצומת מסתנכרן עם הרשת, אבל שכבת הקריאה שלכם חיה בתהליך נפרד ובעומס שיא לא מספיקה לקצב הגעת בלוקים חדשים: התור גדל, והפער בין אירוע on-chain להופעתו במסד הנתונים שלכם נמדד בעשרות דקות. עבור תרחישי מסחר, תשלומים וניטור, משמעות הדבר היא החלטות שמתקבלות על בסיס נתונים מיושנים.
סוג הכשל השלישי — החמצת אירועים בזמן ארגוני שרשרת (reorgs) וניתוקי חיבורים.
אם האינדקסר לא עוקב אחרי החלפת הענף הקנוני ולא יודע לבצע rollback לרשומות שכבר נכתבו, במסד נשארים אירועים מבלוקים שנזרקו: יתרות והיסטוריות סוטות מהמצב האמיתי של הרשת, ואיתור מקור הסטייה בדיעבד הוא כמעט בלתי אפשרי.
צומת סטנדרטי לא מיועד להיות מקור אמת עבור המוצר — הוא תוכנן כחבר בקונסנזוס. בדיוק משום כך, למשימות עם זרימת אירועים צפופה בונים אינדקסר בלוקצ'יין מותאם אישית: pipeline קריאה משלו, כתיבה אידמפוטנטית, בקרת עומק אישורים וטיפול מפורש ב-reorgs. נפרט כיצד זה נסגר בפועל.
מה נותן צינור עיבוד נתונים עצמאי
השהיית האינדוקסציה מפסיקה להיות תלויה בתשתית של אחרים
חוקרים ציבוריים מספקים נתונים דרך מאגר משותף: ברגעי עומס שיא, בקשות לבלוקים טריים עומדות בתור, והאפליקציה מקבלת את מצב הרשת בפיגור שאינכם שולטים בו.
צינור עצמאי קורא בלוקים ישירות מהצומת ומאחסן אותם במסד נתונים עצמאי — ההשהיה בין יציאת הבלוק לזמינותו ב-API נשמרת בטווח צפוי ואינה גדלה יחד עם העומס של אחרים. עבור פעולות שבהן חשובה טריות המצב, זה ההבדל בין "נתונים מאתמול" ל"נתונים מהשניות האחרונות".
שלמות ההיסטוריה וטיפול בארגונים מחדש
מקורות חיצוניים לעתים קרובות מספקים היסטוריה מקוצרת: חלק מההעברות הפנימיות, לוגים של אירועים וקריאות שירות לא נכנסים לאינדקס הציבורי. צינור עצמאי כותב את כל מה שעבר דרך הבלוק, כולל עסקאות פנימיות ואירועי חוזים — שליפות לפי כתובת או טוקן לא מאבדות רשומות בעומק.
בנפרד נסגר נושא הארגונים מחדש: בעת ביטול השרשרת, האינדקסר מסמן את הבלוקים המושפעים כלא תקפים ובונה מחדש את הטווח המושפע, כך שבמסד הנתונים לא נשארים מצבים "תלויים" שצפים לאחר מכן בדוחות.
עמידות לעדכוני רשת והפחתת פעולות ידניות
הרשת משנה את פורמט הבלוקים, מוסיפה סוגי אירועים חדשים, מעדכנת חוזים — החוקר הציבורי מתאים את עצמו לכך בעצמו, אבל השליפות שלכם נשברות בשקט. צינור עצמאי מתאר את סכמת הנתונים באופן מפורש: בעת שינוי הפורמט מתוקן מודול פירוק אחד, שאר הלוגיקה וה-API נשארים כשהיו.
זה מסיר תיקונים ידניים קבועים בעת עדכוני רשת — הצוות לא מבזבז מחזורים על לפרק "למה השדה נעלם", אלא מקבל זרם נתונים יציב שאפשר להישען עליו במוצר.
דרכי ארגון אינדוקסציה: השוואת מצבים
בחירת המצב קובעת לא רק את מהירות הופעת הנתונים באינדקס, אלא גם את עלות התשתית, ואת האופן שבו המערכת שורדת בנייה מחדש של ההיסטוריה. בפועל ישנן שתי סכמות טהורות, אך התצורה העובדת היא כמעט תמיד שלישית — היברידית. להלן השוואה לפי מתי כל מצב מתאים והיכן הוא מתחיל להיתקל במגבלות.
| מצב | מתי מתאים | מגבלות |
|---|---|---|
| אינדוקסציה בזרימה | נדרשים נתונים עדכניים בהשהיה של שניות: יתרות, פעולות, אירועי חוזים בזמן אמת | דורש חיבור יציב לצומת ותור; בעת ניתוק ייתכנו פספוסים, נדרש בקרת סדר ואספקה חוזרת של בלוקים |
| עיבוד באצוות | טעינה ראשונית של היסטוריה, אנליטיקה, דוחות, שבהם חשובה שלמות ולא שניות | הנתונים מופיעים בהשהיה; בטווחי בלוקים גדולים גדל זמן המעבר והעומס על הצומת |
| מצב היברידי | מוצר עם ממשק חי והיסטוריה עמוקה בו-זמנית | מורכב יותר בתחזוקה: שני מעגלים, תיאום מצב ונקודת בדיקה אחודה |
מדוע היברידי מכסה יותר משימות
המעגל הזורם מחזיק את "הראש" של השרשרת ומספק אירועים עדכניים, המעגל האצוותי מדביק את ההיסטוריה ומחשב מחדש קטעים בעת שינוי לוגיקת הפירוק. ההפרדה מסירה את הסתירה העיקרית: ממשק חי אינו ממתין עד שכל ההיסטוריה תיבנה מחדש באינדקס, ובנייה מחדש אינה מאטה את קליטת הבלוקים החדשים.
המרכיב המרכזי כאן — אידמפוטנטיות הכתיבה ונקודות בדיקה לפי גובה הבלוק. אם העיבוד נפל באמצע הטווח, המעגל מתרומם מהנקודה האחרונה שנשמרה, ולא מתחיל מהתחלה. זה הופך כשל מ"נבנה מחדש את הכל באינדקס" ל"מדביקים את מה שהוחמץ".
מגבלות ההיברידי הן ארגוניות, לא טכניות: נדרשת משמעת בסכמת הנתונים ונקודת בדיקה אחודה, אחרת המעגלים מתחילים להתפצל. אנו מניחים אותה בשלב התכנון, ולכן המצב נבחר לפי המשימה, ולא לפי נוחות המימוש.
כיצד אנו בונים אינדקסר בלוקצ'יין מותאם אישית
את העבודה מתחילים בבדיקת תשתית: בוחנים אילו צמתים כבר מורמים, כיצד מוגדרת הסנכרון עם הרשת, אילו שאילתות לבלוקצ'יין נשלחות היום ואילו מהן מאטות את המוצר.
בשלב זה קובעים מדדי יעד — עומק האינדוקס, פיגור מותר מהבלוק האחרון, מערך השדות בתשובה — כדי לבדוק בהמשך את התוצאה לפי מספרים ולא לפי תחושות.
- בדיקת תשתית. מנתחים את הצמתים הנוכחיים, האחסון, העומס ונקודות הכשל. קובעים מה נעשה בו שימוש חוזר ומה יצטרך להיות מוחלף, והיכן האינדקסר ייתקל בתקרה עם גידול במספר השאילתות.
- תכנון הצינור. מתכננים את זרימת הנתונים: קליטת בלוקים, פירוק אירועים, העשרה, כתיבה לאחסון, מסירה דרך API. מראש מגדירים עיבוד חוזר במקרה של כשל — כדי שבלוק שהוחמץ לא ישאיר חור בנתונים.
- הגדרת האינדקסר. מרימים שירותים, מגדירים כללי סינון אירועים וסכמות אחסון בהתאם לשאילתות הספציפיות של המוצר. בנפרד מגדירים ניטור פיגור והתראות בעת עצירת הסנכרון.
- בדיקת שלמות. משווים את הנתונים שאונדקסו עם נתוני הרשת בקטעי בקרה: כמה אירועים הוחמצו, האם היתרות והמצבים תואמים. מריצים תרחישי עומס ובודקים את ההתנהגות בעת אתחול מחדש.
- מסירה ותמיכה. מוסרים קונפיגורציות, סכמות ותיעוד, ומכשירים את צוות הלקוח. בהמשך מלווים: עוקבים אחר עדכוני הרשת ומתקנים את כללי האינדוקס.
כל שלב מסתיים בתוצאה ניתנת לבדיקה, ולכן הסטייה נראית מיד, ולא בפרודקשן. תארו את המשימה — נחזור עם הערכה ותוכנית עבודה.
ארטיפקטים ותיעוד לאחר ההטמעה
לאחר הפעלת האינדקסר, הצוות לא נשאר עם "קופסה שחורה": כל מה שמתאר את התנהגות המערכת מועבר כחומרי עבודה. לפיהם המהנדס שלכם יוכל להקים סביבה מאפס, לשחזר את התצורה ולהבין מדוע העיבוד בנוי דווקא כך.
- תצורות האינדקסר והצמתים: פרמטרים לחיבור לרשת, עומק עיבוד מחדש בעת ארגון מחדש, מגבלות על גודל אצווה, הגדרות ניסיונות חוזרים.
- תרשימי זרימת נתונים: מקבלת בלוקים ועד כתיבה לאחסון והגשה דרך API — עם נקודות שבהן אפשריים עיכובים ואובדנים.
- נהלי תחזוקה: הפעלות מחדש מתוכננות, אינדוקס מחדש בעת שינוי סכימה, סדר פעולות בעת אי-התאמה בין המצב לרשת.
- מדיניות גישה: תפקידים לקריאה ולכתיבה, הפרדה לפי נקודות קצה, כללי רוטציה של מפתחות וסודות.
- תיאור סכימת האחסון: טבלאות, אינדקסים, אסטרטגיית מחיצה וניקוי נתונים מיושנים.
- סט בדיקות: נקודות קצה ל-health, מדדים של פיגור מראש הרשת, התראות על עצירת עיבוד.
- הוראות פריסה: סדר הקמת הרכיבים, תלויות, משתני סביבה, דרישות משאבים.
- יומן החלטות: אילו חלופות נשקלו ומדוע נבחרה האפשרות הנוכחית — כדי ששינויים עתידיים לא ישברו את הלוגיקה.
החומרים מועברים במאגרים ובוויקי של הצוות שלכם, ולא בהתכתבות. אנחנו נשארים בקשר בשלב שבו המהנדסים שלכם מבצעים את העריכות הראשונות — זה מפחית את הסיכון שהתיעוד יתרחק מהתצורה בפועל.
מקרה בוחן: איך צמצמנו את השהיית האינדוקסציה פי שלושה
הלקוח — שירות אנליטיקה על רשת מבוססת בלוקצ'יין תואם EVM — הגיע עם סימפטום, לא עם משימה: הנתונים בדשבורדים פיגרו אחרי הרשת, ובשעות הבוקר האינדקסר קרס בעיבוד חוזר. את האינדקסר שלהם כתבו למשימה, אבל הוא קרא בלוקים באופן סדרתי לחלוטין, בחוט אחד, ושמר מצב בטבלה אחת ללא חלוקה למחיצות. בעומס שיא התור של בלוקים שלא עובדו גדל מהר יותר מקצב הווירקר לפנות אותו.
מה היה לפני
ההשהיה בין הופעת בלוק ברשת לזמינותו ב-API הגיעה עד 40 דקות בשיאים. ארגונים מחדש (reorgs) בעומק של יותר משני בלוקים שברו את המצב: האינדקסר לא ביטל אירועים שכבר נרשמו, ובבסיס הנתונים נשארו רשומות "תלויות" מהענף שבוטל. אחת לכמה ימים התהליך קרס בגלל זיכרון — הפעלה מחדש משמעה חישוב מלא מאפס ועוד כמה שעות של השבתה.
מה שינינו
הפרדנו בין קריאה לכתיבה: אספן נפרד מושך בלוקים במנות ומכניס אותם לתור, ובריכת וירקרים מפנה אותו במקביל לפי טווחים. הכנסנו טיפול מפורש בארגונים מחדש — כאשר יש אי-התאמה של האשים, האינדקסר מבטל את הטווחים שנפגעו לפי היומן וקורא מחדש את הענף הקנוני. את המצב פרשנו לפי מחיצות עם נקודות ביקורת: לאחר קריסה התהליך ממשיך מהגובה המאושר האחרון, ולא מאפס.
מה נהיה
| מדד | לפני | אחרי |
|---|---|---|
| השהיית אינדוקסציה בשיא | עד 40 דק' | 12–13 דק' |
| כשלים בגלל ארגונים מחדש | באופן קבוע | המחלקה בוטלה |
| השבתה לאחר תקלה | שעות, חישוב מלא | שניות, מנקודת ביקורת |
ההשהיה הצטמצמה פי שלושה, וההפעלות מחדש הידניות יצאו מהתהליך לחלוטין. בנפרד הוצאנו את המדדים של האינדקסר עצמו — עומק התור, פיגור בגובה, מספר הביטולים — כדי שצוות הלקוח יראה דגרדציה לפני שהמשתמשים יבחינו בה.
במה נבדל אינדקסר מותאם אישית מפתרונות מוכנים?
אינדקסרים מוכנים הם קווי ייצור אוניברסליים: הם קוראים בלוקים, מפענחים אירועים סטנדרטיים ומסדרים אותם לסכימת אחסון משלהם. כל עוד אתם עובדים עם חוזים טיפוסיים ורשת אחת, זה מספיק.
הבעיה מתחילה במקום שבו הלוגיקה של המוצר שלכם סוטה ממה שהכלי המוכן מסוגל לספק "מהקופסה": חוזים לא סטנדרטיים, מבני נתונים משלכם, חישוב מחדש של מצב לפי בלוקים היסטוריים, איחוד של כמה רשתות לשאילתה אחת.
פיתוח מותאם אישית מתחיל בשאלה "אילו שאילתות צריכות להתבצע במהירות", ולא "אילו נתונים יש בבלוקים". המהנדסים מתכננים את סכימת האחסון עבור תרחישים ספציפיים: אגרגטים לפי כתובות, היסטוריית יתרות לכל גובה, קשרים בין אירועים של חוזים שונים. פתרון מוכן לא יציע סכימה כזו — המודל שלו קבוע, ואתם מתאימים את המוצר אליו, ולא להפך.
הקריטריונים לבחירה פשוטים. אם צריך סקירה של הרשת, העברות סטנדרטיות ואירועים של חוזים פופולריים — כלי מוכן יסגור את המשימה מהר יותר ובזול יותר בתחזוקה.
אם נדרשים מדדים משלכם, אגרגציה לא סטנדרטית, היסטוריה עמוקה או כמה רשתות בתשובה אחת — קו הייצור האוניברסלי ייתקל במגבלות, ודרכי עקיפין יאכלו יותר משאבים מאשר פיתוח עצמאי.
בנפרד יש להתייחס לעמידות בפני ארגון מחדש של השרשרת וכשלים של צמתים. באינדקסר מותאם אישית הלוגיקה של ביטולים ועיבוד חוזר של בלוקים מתוכננת עבור הנתונים שלכם: ברור אילו רשומות מחושבות מחדש ואילו נשארות תקפות. בפתרונות מוכנים זה קופסה שחורה — כשמתרחשת אי-התאמה צריך להבין מה בדיוק אבד.
את ההשוואה יש לערוך לא לפי מספר הרשתות הנתמכות, אלא לפי כמה מהר תקבלו תשובה לשאלה חדשה לנתונים. כלי מוכן עונה על שאלות שכבר הוטמעו בו, מותאם אישית — על אלו שיעלו במוצר מחר.
ספקות טכניים נפוצים בעת הטמעה
אינדקסר הוא לא אינטגרציה חד-פעמית, אלא שירות שחי יחד עם הרשת: חוזים משתנים, אירועים מתווספים, יוצאים עדכונים של הצומת. לכן הדבר הראשון שבודק הלקוח הטכני הוא לא "האם זה יעבוד", אלא "מה יהיה בעוד חצי שנה". להלן הספקות שעולים בכל פרויקט, וכיצד אנו סוגרים אותם מבחינה הנדסית.
עד כמה קשה לתחזק אינדקסר מותאם אישית בכוחות עצמנו?
המורכבות אינה בקוד, אלא בתפעול: ארגונים מחדש, בלוקים מפגרים, גידול מסד הנתונים, אינדוקס מחדש לאחר שדרוג חוזה. אנו מוסרים את השירות עם מדדים (השהיית אינדוקס, עומק התור, שיעור שגיאות), התראות על פיגור ותקנון אינדוקס מחדש — הצוות רואה את המצב בלי לקרוא קוד מקור. עדכון סכימת האירועים נעשה באמצעות מיגרציה, ולא בכתיבה מחדש מאפס.
האם זה תואם לתשתית ולצמתים הנוכחיים שלנו?
האינדקסר מתחבר לצמתים שלכם או לספקים חיצוניים דרך ממשקים סטנדרטיים, ואת התוצאה מוסר לאחסון רגיל — מסד נתונים רלציוני, מנוע חיפוש או תור. בקלט — קריאות RPC רגילות ומנויים לאירועים, בפלט — סכימה שצורך ה-backend שלכם.
המיגרציה אינה מחייבת עצירת השירותים הנוכחיים: האינדקס החדש מתמלא במקביל, והמעבר — בהחלפת מקור הקריאה.
כיצד מובטחים אבטחת הנתונים ושלמותם?
הנתונים נלקחים מבלוקים מאושרים תוך התחשבות בסופיות, ולכן אירועים מענפים מבוטלים אינם נכנסים לאינדקס. ההרשאות מופרדות: לשירות האינדוקס יש רק קריאה לצומת וכתיבה לסכימה שלו, ומפתחות החתימה נשמרים בנפרד מתהליך העיבוד. כל אירוע מלווה בהפניה לבלוק ולעסקה — כל רשומה ניתנת לבדיקה בשרשרת.
מה אם הרשת או החוזה ישתנו לאחר ההפעלה?
שדרוג חוזה הוא תרחיש שגרתי: גרסה חדשה של אירועים מתוארת בסכימה נפרדת, והנתונים הישנים נשארים זמינים. בעת שינוי הפורמט אנו מוסיפים מטפל ומפעילים אינדוקס מחדש של טווח הבלוקים הנדרש, בלי לגעת בשאר ההיסטוריה. גרסאות הסכימה מובנות מלכתחילה, ולכן המעבר מתבצע ללא השבתה.
תארו את הרשת שלכם ואת היקף האירועים — נחזור עם הערכה ותוכנית הטמעה.
נדון במשימה שלכם ונציע תוכנית עבודה
כדי להציע תוכנית עבודה ולא מילים כלליות, אנחנו צריכים להבין את המשימה שלכם ברמת הנתונים: אילו רשתות וחוזים אנחנו מאנדקסים, אילו אירועים וקריאות למתודות חשובים, ומה בדיוק צריך להיכנס לתשובות ה-API.
תארו את התרחיש — מאיפה מגיעות הבקשות, אילו שאילתות קריטיות מבחינת מהירות, האם נדרשת עומק היסטורי או רק בלוקים עדכניים. לפי תיאור זה נרכיב טיוטת ארכיטקטורה ונחזור עם הערכת לוחות זמנים ושלבים.
בשיחה הראשונה נבהיר דרישות וגבולות:
- מקורות נתונים: אילו רשתות, נודים או ספקים, האם נדרש גישה לצמתים ארכיוניים;
- מודל נתונים: אילו ישויות, קשרים ואגרגטים צריכים להיות באינדקס, באיזו תדירות מחושבים מחדש;
- עומס והשהיה: כמה בקשות בשנייה צפויות, איזו השהיה מהבלוק ועד לתשובה מקובלת;
- עמידות: מה עושים בעת ארגון מחדש של השרשרת, פספוס בלוק, נפילת צומת — האם נדרש השלמה אוטומטית;
- הרשאות ותשתית: היכן פורסים, שרתים משלנו או ענן, מי מחזיק במפתחות ובנתונים;
- אינטגרציות: אילו שירותים וצוותים יקראו מהאינדקס, ובאיזה פורמט נוח להם לקבל נתונים;
- התפתחות: אילו מדדים ושאילתות יופיעו בהמשך, כדי לכלול אותם בסכמה בלי לשנות אותה.
בהמשך נציע את הצעדים הבאים: נתעד את הדרישות המוסכמות במסמך קצר, נציג תרשים של זרימת הנתונים והרכב האינדקס, ונחלק את העבודה לשלבים עם תוצאה ניתנת לבדיקה בכל שלב. אתם רואים מה ובאיזה סדר נעשה, היכן אפשר להשיק גרסה ראשונה ואיך היא מתרחבת.
תארו את המשימה בצורה חופשית — נחזור עם הערכה ותוכנית עבודה.







