פיתוח מערכת מכרזי אצווה (בסגנון CoW)

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

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

שאלות נפוצות

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

  • פיתוח אפליקציית ווב עבור FEEDME
    פיתוח אפליקציית ווב עבור FEEDME
    1376
  • פיתוח חנות מקוונת לחברת FURNORO
    פיתוח חנות מקוונת לחברת FURNORO
    1350
  • עיצוב לוגו לחברת B2B Advance
    עיצוב לוגו לחברת B2B Advance
    796
  • פיתוח אפליקציית ווב עבור Enviok
    פיתוח אפליקציית ווב עבור Enviok
    1088
  • פיתוח לוגו חברת AIDER
    פיתוח לוגו חברת AIDER
    1034
  • פיתוח CRM עבור Chasseurs
    פיתוח CRM עבור Chasseurs
    1130

פיתוח מכרזי batch: היכן נשבר הזרם הקמעונאי

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

החלקה על נפח קמעונאי פוגעת הכי חזק. ההזמנה עצמה כמעט אינה מזיזה את המחיר, אבל סביבה נבנה תור של עסקאות מקדימות, והביצוע יוצא ב-1–3% גרוע יותר מהציטוט שהלקוח ראה על המסך. בלימיט קשיח העסקה מתבטלת כולה: העמלה על הניסיון הכושל כבר הוצאה, והמשתמש שולח את ההזמנה מחדש.

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

השורש של שלושת הכשלים הוא אחד: לזרם אין רגע אחד שבו כל ההזמנות מותאמות לפי מחיר אחד. נפרט כיצד זה נסגר באמצעות ביצוע הזמנות בקבוצות (batch) — ומה בדיוק משתנה בפיתוח מכרזי batch.

מה נותן ביצוע בקבוצות: האפקט במטריקות הפרוטוקול

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

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

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

ככל שהקבוצה גדולה יותר, כך שיעור ההתאמות גבוה יותר, ולכן הזמנה קטנה מקבלת מחיר שאינו בר-השגה עבורה לבדה.

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

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

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

פורמטים של מכרז קבוצתי: מחיר אחיד, קיזוז מעגלי

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

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

וריאנט מתי מתאים מגבלות
מכרז קבוצתי טהור זרם צפוף ואחיד בכיוון אחד, חשוב להגן מפני עקיפת הזמנות יש מעט נזילות פנימית, חלק מההזמנות נשארות בלי ביצוע
קיזוז מעגלי של הזמנות נגדיות אינטרסים בכיוונים שונים נסגרים לשרשרת A→B→C→A יש צורך בחיפוש מעגלים בגרף; בזוגות נדירים הקיזוז נשאר חלקי
חישוב היברידי עם נזילות חיצונית הנפח הפנימי אינו מספיק, יש צורך במקור משלים תלות במקור חיצוני: מוסיפה השהיה וסיכון לאי-זמינותו
חישוב תקופתי לפי לוח זמנים שוק דליל, שבו חשובה צפיות המחזור ההזמנה ממתינה עד סוף החלון, ובגבולו נוצר חלון ארביטראז'

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

סדר ההטמעה: מביקורת זרם ההזמנות ועד לקבלה

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

  1. ביקורת זרם ההזמנות. מוציאים לוגים של הזמנות וביטולים, מחשבים את שיעור ההזמנות הנגדיות, את שיעור ההזמנות הניתנות לביצוע חלקי ואת עומק הספר. בפלט — פרופיל הזרם: באיזו תדירות ההזמנות חופפות ואיזה נפח באמת נכנס לקבוצה.
  2. סכמת חישוב הקבוצה. קובעים את גבולות חלון האיסוף, את רגע סגירת הקבוצה, את כלל המחיר האחיד ואת סדר חלוקת היתרה. הסכמה מתואמת לפני הקוד — אחרת החישוב מניב תוצאה תקינה אך בלתי צפויה.
  3. כללי בחירת הפתרונות. מתארים אילו קבוצות הזמנות נחשבות קבילות, כיצד מיושבת תיקו ומה עושים עם הזמנות שלא נכנסו לקבוצה. הכללים הופכים לחלק מהתצורה, ולא מהלוגיקה בקוד.
  4. הגדרת מעגל החישוב. מקימים שירות חישוב, שער לקבלת הזמנות ומעבד לנתוני החישוב. הקבוצה מחושבת כולה: או שכל ההזמנות שבתוכה עוברות, או שאף אחת לא.
  5. בדיקה על נתונים היסטוריים. מריצים זרמים קודמים דרך הסכמה החדשה ומשווים למה שבוצע קודם. פערים מוסברים לפי כל הזמנה: היכן הסתדר טוב יותר, היכן אחרת.
  6. מסירה וקבלה. מוסרים את סכמת החישוב, כללי הבחירה, נהלי התורנות והמטריקות. הקבלה — לפי תוצאות הרצה מקבילה, ולא לפי הדגמה.

חבילת המסירה: תצורת החישוב, תפקידים, נהלים

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

  • תצורת החישוב — משך חלון המכרז, גודל ה-batch, כללי העדיפות של ההזמנות, ספי החלקה מותרת ומגבלות על ביצוע, עם סימון לכל פרמטר: על מה הוא משפיע ובאילו גבולות בטוח לשנות אותו.
  • סכמות אינטראקציה בין הרכיבים — מסלול ההזמנה מקליטה ועד חישוב, רגע קביעת המחירים, נקודות השוואה מול מקורות חיצוניים ומקומות שבהם החישוב נעצר בעת פער.
  • מדיניויות גישה ותפקידים — מטריצת «תפקיד — פעולה — סביבה» עבור מפעיל, מנהל סיכונים ומהנדס תורן; בנפרד — סדר הנפקה ושלילה של מפתחות והפרדת הרשאות לשינוי פרמטרים ולתנועת כספים.
  • נהלי תחזוקה — לוח בדיקות, סדר עדכון תלויות, קריטריונים לעצירת החישוב, נהלי תורנות וערוצי התראה בעת חריגות.
  • תוכנית שחזור החישוב — נקודות בקרה של מצב, סדר הרצה חוזרת של ה-batch מיומן ההזמנות וגבולות פער מותר בעת השוואת התוצאה.
  • תיעוד — תיאור הארכיטקטורה, סכמות נתונים, יומן החלטות עם נימוקים לווריאנטים שנדחו והוראות למשמרת התורנית.
  • מעגל בדיקות — סטים של הזמנות עם תוצאות ייחוס ותרחישי הרצה, כדי שהשינויים שלכם ייבדקו לפני העלאה ולא אחריה.

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

מקרה בוחן: כיצד חישוב קבוצתי הסיר את המרוץ אחר סדר ההזמנות

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

במדידות לפני ההטמעה שיעור ההזמנות המבוצעות עמד על כ-58%, ופיזור המחירים בין המשתתפים בתוך אותו זרם הגיע עד 3%.

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

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

מדד לפני אחרי
שיעור ההזמנות המבוצעות 58% 91%
פיזור המחירים בין משתתפי הקבוצה עד 3% 0.2–0.4%
ניסיונות חוזרים לשלוח הזמנה עד 4 להזמנה בודדים
עומס על מעגל החישוב ליניארי עם זרם ההזמנות חישוב אחד לקבוצה

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

המדידות לפני ואחרי נלקחו על אותו פרופיל עומס — העלייה בשיעור הביצועים מוסברת בהחלפת מודל החישוב, ולא בשינוי בזרם.

במה שונה ביצוע קבוצתי ממסחר רציף

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

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

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

אחרת נראית הגורל של ביצוע חלקי. במסחר רציף ההזמנה נסגרת בחתיכות, עשויה לתלות בספר שעות, ובעליה אינו יודע לא את הנפח הסופי ולא את המחיר הממוצע עד הסוף.

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

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

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

ספקות טכניים: השהיות, נזילות, עדכונים

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

השהיית חישוב הקבוצה — עד כמה היא גדולה?

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

ספר ההזמנות דליל — האם יהיה בכלל ביצוע?

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

האם אפשר לעדכן חוזים בלי לעצור את החישוב?

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

כיצד לוודא שהחישוב תקין ותואם למסחר הנוכחי?

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

נדון במשימה: חישוב בקבוצות לזרם ההזמנות שלכם

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

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

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

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