הצעה לשיפור: KIP9
שכבה: קונצנזוס, Mempool, P2P.
תיאור: פורמולת מסה מורחבת להפחתת נפיחות במצבי גדילה.
מחבר: מיכאל סאטון, אורי ניומן, שי וויבורסקי, יונתן סומפולינסקי.
סטטוס: פעיל.
אנו מציעים מנגנון לוויסות קצב הצמיחה של מערך UTXO הן במסגרות אורגניות והן במסגרות עוינות. ההצעה שלנו שונה באופן מהותי מניסיונות קיימים לצמצם את התנפחות המצב (למשל, חוסר מדינה או רנטה של מצב, שניהם דורשים מעורבות פעילה של המשתמש), וכרוך רק בשינוי פשוט בלוגיקה של אופן חישוב המסה של עסקה. בהצעה זו, אנו מפרטים את הנוסחה המתוקנת ואת השלכותיה ומתארים כיצד תוכנות מערכת אקולוגית כגון ארנקים, מאגרים ובורסות צריכות להסתגל לשינוי זה מבלי לפגוע באיכות השירות. אנו מספקים סקירה אינטואיטיבית של מאפייני נוסחת המסה החדשה ודוחים את הטיפול הפורמלי לפרסום טרום-הדפסה שיפורסם בקרוב.
מוטיבציה
לפני מספר חודשים, רשת Kaspa התמודדה עם מתקפת אבק שניצלה את התפוקה הגבוהה כדי ליצור UTXOs זעירים רבים, מה שהגדיל לנצח את עלויות האחסון של צמתים מלאים. ההתקפה נתקלה בהתנגדות ובסופו של דבר נעצרה על ידי פריסת תיקון mempool [2]. התיקון הטיל הגבלה על מספר העסקאות עם יותר פלטים מאשר קלטים המותרים בכל בלוק; ראה [1] לתיאור מפורט של ההתקפה ופתרון שלה. מכיוון שעסקאות סטנדרטיות רבות הן מסוג זה (לרוב, עסקה עם קלט יחיד, פלט יעד ופלט שינוי), הדבר הביא לאי נוחות ניכרת ב-UX וב-QoS. תוכנית KIP זו שואפת להתמודד עם אתגר התנפחות המצב באופן יסודי יותר, על ידי הכנסת פונקציית עלות עסקה – או מסה – שמגבילה באופן אינהרנטי את התקפות התנפחות המצב. בעוד שהמצב הנוכחי של המערכת נסבל (התיקון מגדיל את העיכוב של עסקאות כאלה בתריסר שניות במקרה הרע), אימוץ מוגבר יחריף מאוד את האפקט הזה, ויספק מוטיבציה מספקת להאיץ את יישום הפתרון בר-קיימא.
מפרט
המפרט הפורמלי של השינויים המוצעים מתואר להלן, ולאחר מכן סקירה וניתוח מפורטים.
נוסחת מסה מורחבת
אנו מתייחסים לכמות המכונה כיום "מסה" בשם compute_mass, ומציגים כמות חדשה בשם storage_mass. כפי שהשם מרמז, הראשונה מווסתת את עלויות החישוב בעוד שהשנייה מווסתת את עלויות האחסון. אנו מגדירים מחדש את המסה הכוללת של עסקה כמקסימום על פני שניהם:
בהקשר של מסת אחסון, עסקה מעוצבת כשני אוספים של ערכים: ערכי הקלט I וערכי הפלט O. אנו משתמשים בסימון הבא
מסת האחסון מוגדרת באופן הבא:
מסת אחסון
כאשר C הוא קבוע השולט בקורלציה של ערך KAS ההפוך ליחידות מסה.
גרסה רגועה של נוסחת המסה מתייחסת לקלטים ולפלטים באופן סימטרי:
מסת אחסון ∗(tx) = C ⋅ (∑ o ∈ O 1 o − ∑ v ∈ I 1 v) + .
אנו קוראים לכך הנוסחה הרגועה. כפי שמוצג ב-[3], ניתן להשתמש ב-storage_mass* עבור עסקאות המקיימות
כחובה במערכות קונצנזוס, חישוב מסת האחסון חייב להשתמש רק במספרים שלמים ואינו יכול להסתמך על חשבון נקודה צפה. משמעות הדבר היא שיש לחשב את הקבוע C בתוך כל שבר, אחרת אובדן הדיוק יהפוך את החישוב לחסר תועלת. להלן קומפילציה של הפסאודו-קוד הכולל לחישוב נוסחת המסה המורחבת החדשה:
מסת אחסון (בניגוד למסת חישוב) לא ניתנת לחשב ממבנה העסקאות העצמאי, אלא דורשת הכרת ערכי הקלט המדויקים, הזמינים רק עם הקשר UTXO מלא (כלומר, נדרשת עסקה מאוכלסת).
התאמת ריבוי UTXO
כדי לחדד עוד יותר את נוסחת המסה המורחבת, חישוב מסת האחסון מותאם כדי להתחשב בערכי UTXO עם גדלי מפתח ציבורי לא סטנדרטיים של סקריפטים (כלומר גדולים מ-35 בתים אופייניים), ובכך ללכוד את האחסון המתמשך הנוסף הנדרש.
- הגדרת יחידת בסיס: הגדר יחידת אחסון UTXO בסיסית כ- UtxoUnit = 100 בתים – נגזר מהחלקים הקבועים של UTXO (63 בתים) בתוספת גודל המפתח הציבורי הסטנדרטי המרבי (35 בתים).
- חישוב ריבוי: עבור ערך UTXO נתון, חשב את הריבוי שלו כך:
ערך P מייצג כמה רשומות בגודל סטנדרטי תופס בפועל את ה-UTXO.
לאחר מכן, הרשומה מטופלת כ-P רשומות, כאשר כל אחת מהן מכילה סכום.רשומה / P KAS.
(entry.amount/PKAS)
- כוונון הרכיב ההרמוני: המונח ההרמוני המקורי בנוסחת מסת האחסון הוא:
עבור כל פלט, זה מוכלל כעת ל:
- התאמת הרכיב האריתמטי: באופן דומה, הרכיב האריתמטי המקורי:
מוכלל ל:
כאשר פאי הוא ריבוי ערכי הקלט i וסכום ערכי הקלט נשאר ללא שינוי.
הפחתה זו ממפה ביעילות ערכי UTXO גדולים יותר לשימוש ביחידות סטנדרטיות מרובות, ומיישרת את מסת האחסון להשפעת האחסון בפועל של גדלי UTXO לא סטנדרטיים.
קבועים
אנו מציעים לקבוע את C = 10⁻¹2. שים לב שערכי קלט ופלט של עסקאות מיוצגים ב-dworks (הידועים גם בשם sompis), שהם היחידה הקטנה ביותר של ערך KAS (KAS יחיד שווה ל-10⁶ dworks).
חוקי P2P וכרייה
ניתן ליישם את נוסחת המסה החדשה כמדיניות mempool ולא ככלל קונצנזוס. יתרון זה הוא שאינו דורש פורק כדי לפרוש, אך החיסרון הוא שניתן לסמוך על הכורים שיעקבו אחר מדיניות זו. עקב דחיפות העדכון, אנו מציעים לפרוס אותו בתחילה ככלל P2P/כרייה, תוך הכללתו גם בפורק הקשה הקרוב ביותר.
כלל P2P צומת המקבל tx דרך RPC או P2P צריך לאמת את העסקה ולחשב את המסה שלה באמצעות הנוסחה החדשה. אם המסה המחושבת עולה על המסה הסטנדרטית (כרגע 100,000 גרם), יש לדחות את tx מה-mempool ולא לשדר אותו לעמיתים.
כרייה המסה החדשה צריכה לשמש את אלגוריתם בחירת העסקה של mempool כדי לחשב את יחס העמלות/מסה, ומסת תבנית הבלוק הכוללת צריכה לכבד את מגבלת מסת הבלוק (500,000 גרם).
קונצנזוס (מזלג קשה)
יישום ההצעה כשינוי קונצנזוס דורש את העדכונים הבאים:
שדה מסת עסקה יש להוסיף שדה חדש ומפורש בשם storage_mass למבנה העסקה. שדה זה משמש כהתחייבות למסת האחסון הנצרכת על ידי העסקה, עד שניתן יהיה לאמת אותה בהקשר מלא של UTXO. כדי להפוך את המסה המוצהרת לאחידה, יש לבצע גיבוב של שדה המסה בעת חישוב גיבוב העסקה. עם זאת, אנו מציעים שהלוגיקה לחישוב מזהה עסקה תתעלם משדה זה, שכן הדבר מונע שינויים מיותרים בתוכנת המערכת האקולוגית (לקוחות כמו ארנקים מחשבים לעתים קרובות את המזהה באופן מקומי). שימו לב שארנקים המרכיבים עסקה יכולים להשאיר את שדה המסה ריק, ולתת לכורים למלא אותו עבורם במהלך בניית תבנית הבלוק.
כלל אימות בלוק השדה storage_mass של עסקה מייצג את מסת האחסון שלה. ניתן לחשב את מסת החישוב של עסקה בנפרד. ככזה, עבור כל העסקאות בבלוק, מסת האחסון ומסת החישוב יעברו מעקב ויסוכמו באופן עצמאי, ומסת האחסון הכוללת ומסת החישוב הכוללת ייבדקו כדי לוודא שהן נמצאות מתחת למגבלת מסת הבלוק. מעקב עצמאי אחר מסות אלו מאפשר ניצול טוב יותר של שטח הבלוק בהתחשב במסת החישוב ומסת האחסון הצורכות משאבים שונים בצומת.
כלל אימות עסקה המסה המלאה מחושבת רק במהלך אימות עסקה הקשרית (כלומר, אימות עם הקשר UTXO מלא של הבלוק המכיל או בלוק שרשרת הממזג אותו). אם המסה המחושבת אינה תואמת את המסה המבוצעת, העסקה נחשבת ללא חוקית ונמחקת. כמו כללי אימות עסקאות אחרים, בלוקים המכילים עסקאות המבוצעות למסת אחסון שגויה נחשבים פסולים מהשרשרת הנבחרת.
ארנקים
מפתחי ארנקים נוכחיים במערכת האקולוגית של Kaspa מכירים את המונח "compounding". כאשר compute_mass של עסקה גדול מ-M (כאשר M = 100,000 הוא מגבלת מסת העסקה הסטנדרטית), ארנקים מרכיבים שרשרת או עץ של עסקאות להרכבה איטרטיבית של UTXOs עד שניתן לבצע תשלום סופי בערך הרצוי, שבדרך כלל גדול. באופן דומה, עם הצגת storage_mass, ארנקים עשויים להיתקל במקרים בהם התשלום הרצוי קטן ביותר ו-storage_mass ההתחלתי גדול מ-M. להלן נציין תהליך "פיצול", אשר באופן איטרטיבי "מוציא איזון" זוג UTXOs עד שאחד מהם קטן מספיק כדי לבצע את המיקרו-תשלום. ראוי לציין שתהליך חוסר איזון זה מסתמך על רגישות הנוסחה הרגועה להתפלגות ערכי הקלט.
דמיינו משתמש עם UTXO יחיד המחזיק 1 KAS ומבצע תשלום של 0.05 KAS. לשם פשטות, נניח שעמלת העסקה היא תמיד 0.001 KAS. שרשרת העסקאות הבאה מבצעת את המיקרו-תשלום הרצוי מבלי לעלות על M באף עסקה:
בסעיף אלגוריתם ארנק אנו מפרטים במלואו אלגוריתם לאי-איזון אשר ממזער את מספר השלבים הנדרשים לביצוע המיקרו-תשלום, ודנים בקשר לאלגוריתמי ארנק קיימים. בסעיף מיקרו-תשלומים אנו מספקים שיטות חלופיות ללא עלות לתמיכה במיקרו-תשלומים בטווח הארוך.
כיום, לרוב המכריע של עסקאות Kaspa יש פלטים גדולים מ-KAS אחד, שעבורם storage_mass כמעט ולא עולה על M. לפיכך, דרך פשוטה אך קצרת טווח מאוד עבור ארנקים להסתגל לנוסחה החדשה היא לדחות תשלומים מתחת ל-0.2 KAS (בערך הערך שבו storage_mass מתקרב ל-M). אם ערך השינוי קטן מאוד, יש להשתמש בקלטים גדולים/יותר, או שניתן להגדיל את העמלה כדי לצרוך את העודף. יוצאים מן הכלל לשימוש הנפוץ הם שירותים דמויי ברז המשמשים להדגמה או ניסוי עם המערכת. אנו מציעים להתאים את תהליך הפיצול כך שלארנק המגבה שירותים כאלה תמיד יהיו UTXOs קטנים מספיק מוכנים לביצוע המיקרו-תשלום הבא.
RPC API
לפני יישום ה-hard-fork, כל תוכנות הכרייה חייבות לעדכן את ממשק הלקוח RPC שלהן לגרסה הכוללת את שדה מסת העסקה החדש. אחרת, בלוקים המוגשים דרך RPC יעברו גיבוב שגוי וייחשבו כלא חוקיים.
תורגם לעברית על ידי צוות האתר, נכתב במקור על ידי מייקל סאטון, אורי ניומן, שי וויבורסקי ויונתן סומפולינסקי.
קישור למקור ב Github
רציונל
להלן סקירה כללית של החלטות התכנון שהתקבלו והרציונליות שמאחוריהן. הצהרות פורמליות המוצגות מסתמכות על הניתוח ב-[3].
מסת עסקאות לעומת עמלות
בקספה, הקיבולת של בלוק ניתנת בכמות הנקראת מסה. ההבדל בין מסה לגודל הוא שסוגים שונים של נתונים נחשבים "כבדים" או "צפופים יותר", במובן שהם צורכים יותר מסה לכל בייט. לדוגמה, לחתימות יש מסה גבוהה יחסית לכל בייט בהשוואה לנתונים אחרים מכיוון שאימותן הוא אינטנסיבי מבחינה חישובית. למפרט מדויק של אופן חישוב compute_mass כיום, ראו כאן.
הגדלת עלות המסה של עסקאות מבזבזות אחסון היא אמצעי נגד יעיל לוויסות צמיחת המצב, מכיוון שהיא מאפשרת לנו לשלוט בכמה כל בלוק מגדיל את המצב (במידה מוגבלת אך מספקת, כפי שנראה בקרוב). גישה זו יכולה להיחשב כגרסה ניתנת להתאמה של הטלת עמלות גבוהות על עסקאות בזבזניות, עם היתרונות הבאים:
- זה לא דורש הערכה של מה נחשב עמלה "גבוהה". במקום זאת, העמלה מוערכת באופן טבעי כערך הבלוקספייס שנצרך על ידי העסקה.
- זה עובד בהיעדר שוק עמלות פעיל. גם אם אין עמלות, מגבלות המסה וקצב הבלוקים המוגבל מווסתות את גידול האחסון.
עלויות אחסון ריבועיות באמצעות עלויות מסה מקומיות
המטרה הכוללת שלנו היא להפוך את העלות של בזבוז כמות מסוימת של אחסון לריבועית בכמות האחסון המבוזבזת. כלומר, ניצול פי עשרה של אחסון דורש פי 100 יותר מסה, ניצול פי 100 יותר אחסון דורש פי 10,000 יותר מסה, וכו'.
כפי שצוין בסעיף הקודם, ניתן לראות גבולות תחתונים של צריכת מסה כגבולות תחתונים של הזמן הנדרש לביצוע סדרה של עסקאות. לחלופין, ניתן לטעון שהתקציב הנעול בתוך מקטע אחסון מוסיף עלות נוספת לבעל המטבע, בצורה של רכישה ראשונית, ריבית שלא צברנו וכו'. לכן, חיפשנו נוסחה שבה המסה המצטברת הנדרשת לבזבוז כמות מסוימת של אחסון פוחתת עם התקציב הנעול בתוכו. אם נשתמש בצמיחה כדי לציין את האינפלציה באחסון הנגרמת על ידי ההתקפה, האילוץ הרצוי הוא שהמסה המצטברת תהיה פרופורציונלית לצמיחה 2 / תקציב.
תכנון פונקציית מסה המספקת צמיחה ריבועית כזו הוא מאתגר, עקב שני רצונות מנוגדים:
- תמחור מסה מקומי: המסה של עסקה מוגדרת באופן מקומי ואינה תלויה בעסקאות אחרות.
- עלות גלובלית: העלות צריכה להיות ריבועית במצב האינפלציה שנגרמה, ללא קשר לאופן שבו התוקף בנה את ההתקפה שלו. תוקף יכול לבנות את ההתקפה שלו בדרכים רבות, וליצור עסקאות רבות עם תלות שלובות ביניהן, ונוסחת המסה חייבת להבטיח שגם ההתקפה החכמה ביותר תשלם בסופו של דבר מחיר ריבועי.
כדי להמחיש את המורכבות, שקלו לנסות את הפעולה הנ"ל על ידי הגדרת המסה של עסקה עם I קלטים ו-O פלטים להיות פרופורציונלית ל-(O − I)2. בעוד שבאופן מקומי זה משיג צמיחה ריבועית, תוקף חכם יכול להגדיל את גודל ה-UTXO המוגדר על ידי N ערכים על ידי יצירת N עסקאות, כל אחת עם קלט אחד ושני פלטים. המסה המצטברת של ההתקפה היא לינארית ב-N ולא ריבועית. למעשה, אנו מוכיחים ב-[3] שכל ניסיון לחשב מסה על סמך כמות הקלטים והפלטים או הערך הכולל שלהם (תוך התעלמות מאופן חלוקת הערכים) ייכשל. הסיבה לכך מסתכמת בסופו של דבר בתצפית הבאה: המסה של עסקה עם שני פלטים בעלי ערך V / 2 זהה לזו של עסקה (עם אותם קלטים) המוציאה שני קלטים בעלי ערכים εV ו-(1 − ε)V עבור ε קטן באופן שרירותי, וניתן לנצל לרעה את התכונה הזו כדי להגדיל את האחסון בזול.
בחינה מחודשת של נוסחת המסה
ייצוג מתמטי יותר של הנוסחה שהוגדרה לעיל ניתן לתת באמצעות הממוצעים ההרמוניים והאריתמטיים (H, A בהתאמה):
מסת אחסון
הרעיון מאחורי נוסחה זו הוא שיש לחייב עסקה עבור נפח האחסון שהיא דורשת ולזכות עבור נפח האחסון שהיא מפנה. עם זאת, יש הבדל עקרוני ביניהם: חיוב האחסון צריך לשקף את מידת פיזור התפוקות, בעוד שהזיכוי צריך לשקף רק את מספר UTXO שנצרכו ואת הערך הכולל שלהם. בדרך זו, עסקאות שאינן מגדילות את מערך ה-UTXO הרבה (או אפילו מקטינות אותו) אך יוצרות תפוקות זעירות יחויב בכבדות, בעוד שעסקאות שהקלטים והפלטים שלהן הם באותו סדר גודל לא ישלמו מסה רבה, גם אם הן כן מגדילות את מערך ה-UTXO. זה שולל את היכולת של מתקפת אחסון, מכיוון שהתקפה כזו דורשת פירוק UTXO גדולים ל-UTXO קטנים. זו הסיבה ששימוש בממוצע האריתמטי לזיכוי ובממוצע ההרמוני לזיכוי הגיוני: הממוצע האריתמטי זהה עבור כל שתי קבוצות של ערכים באותו גודל וסכום, הוא "שוכח" לחלוטין כיצד הערכים מתפלגים. מצד שני, הממוצע ההרמוני רגיש ביותר לאופן שבו הערכים מתפלגים והופך קטן מאוד אם הערך הקטן ביותר הוא קטן מאוד (לפי הגדרה, הסכום ההרמוני של N > 1 ערכים, שאחד מהם הוא v, קטן מ-v N).
ב-[3], אנו ממסדים פרשנות אינטואיטיבית זו על ידי הוכחה שהגדרה זו של storage_mass מקיימת את התכונה ש-storage_mass הכולל הנדרש לביצוע קבוצת עסקאות מוגבל תחתון על ידי פונקציה ריבועית של צמיחת המצב הגלובלית שהיא גרמה. באופן פורמלי יותר, נניח ש-G הוא DAG של עסקאות המכילות ערך מצרפי של תקציב (G), אשר מגדיל את קבוצת UTXO על ידי ערכי צמיחה (G). אז
מסת אחסון
להלן נציג דוגמאות קונקרטיות של השלכותיה של מגבלה זו.
ניתוח ביטחוני ורגולציה של צמיחה
בסעיף זה, אנו בוחנים את ההשלכות של יישום מדיניות מסת האחסון, תוך שימוש ב-C = 10 12. אנו מתייחסים לתוקף המבקש להגדיל את דרישות האחסון בג'יגה-בייט אחד. לשם כך, עליהם ליצור 20 מיליון, או 2 ⋅ 10 7 רשומות UTXO חדשות. כעת נוכל לשאול את עצמנו שתי שאלות: 1. כמה זמן תימשך ההתקפה בהינתן תקציב קבוע? 2. כמה יקרה צריכה להיות ההתקפה בהינתן שהיא צריכה להימשך פרק זמן קבוע.
- תקציב קבוע. נניח שלתוקף יש תקציב של 20,000 קא'. כלומר, 2 ⋅ 10 4 ⋅ 10 8 dworks. אם נחבר זאת לגבול, נקבל ש- C ⋅ צמיחה 2 / תקציב = (10 12 ⋅ 4 ⋅ 10 14) / (2 ⋅ 10 4 ⋅ 10 8) = 2 ⋅ 10 14. כלומר, ההתקפה תעלה 2 ⋅ 10 14 גרם, מה שידרוש את מלוא הקיבולת של 400 מיליון בלוקים. לפיכך, ב-10BPS, התקפה כזו תדרוש לפחות שנה וחצי, בהנחה שהתוקף משתמש ב-100% מתפוקת הרשת והעמלות זניחות.
- קצב צמיחה קבוע. נניח שהתוקף מעוניין להגדיל את האחסון בג'יגה-בייט שלם תוך יום אחד (שוב, בהנחה שהתוקף מקבל את כל תפוקת הרשת תמורת עמלות זניחות). ב-10BPS, לרשת יש תפוקה של קצת יותר מ-4 ⋅ 10⁻¹ גרם ליום. הצבה בגבול וסידור מחדש נקבל תקציב ≥ C ⋅ צמיחה 2 / מסה. הצבה של C = 10⁻¹², צמיחה = 2 ⋅ 10⁻¹ ומסה = 4 ⋅ 10⁻¹ נקבל שהתקציב הנדרש הוא לפחות 10⁻¹⁵ / 4 dworks, שהם 2.5 מיליון קספה.
בסך הכל, ההתקפה היא או איטית מאוד או יקרה מאוד. כיצד זה משתווה למתקפת האבק? התקפה זו יצרה 1185 UTXOs לבלוק. ב-10BPS, זה אומר 50GB ליום. ללא הגבול הריבועי, המגבלה היחידה למתקפה כזו היא שכל פלט חייב להיות לפחות 10,000 dworks. במילים אחרות, בהנחה של 10BPS, תוקף יכול להגדיל את האחסון ב-50GB ביום אחד עבור 100,000 קאספ. החישוב לעיל מראה שעם תקציב של 100,000 קאספ, ייקח 750 שנים לבזבז 50GB. לעומת זאת, בזבוז של 50GB ביום אחד דורש תקציב של 125 מיליון קאספ.
אנו יכולים גם להשתמש בגבול כדי לספק גבול עליון מוחלט של התרחיש הגרוע ביותר על הצמיחה האורגנית של קבוצת UTXO. נניח לפשטות שהמחזור הכולל הוא 20 מיליארד קאספ. ב-10BPS, קיבולת המסה היומית היא כ-4 ⋅ 10 11. הגבול הריבועי מרמז שב-d ימים האחסון יכול לגדול לכל היותר ב-460 d ג'יגה-בייט. זה מאפשר לנו להגביל את גידול האחסון כפונקציה של הזמן שחלף מאז יישום מדיניות המסה. במהלך היום הראשון, האחסון יכול לגדול לכל היותר בטרה-בייט אחד. במהלך השנה הראשונה: לכל היותר 10 טרה-בייט. במהלך עשר השנים הראשונות: לכל היותר 25 טרה-בייט. הגעה ל-100 טרה-בייט תדרוש כמעט 130 שנים, ופטה אחת לא תתרחש לפני 13 אלף שנים. זוהי צמיחה מתונה מאוד בהתחשב בכך שהיא מגבילה אפילו את התרחיש הגרוע ביותר האפשרי: כל מחזיקי הקספה מאחדים כוחות כדי להגדיל את האחסון ככל האפשר, תוך הצלחה ליישם את האסטרטגיה הטובה ביותר לעשות זאת.
איכות השירות
אנו דנים בהשלכות של מסת אחסון על עסקאות יומיומיות נפוצות.
ראשית, נבחן עסקה עם קלט יחיד של 100 kaspa, ושני פלטים כמעט שווים בערכים של ~ 50 kaspa. אנו יכולים לחשב את מסת האחסון הזו.
לעומת זאת, ניתן לבדוק ש-compute mass (tx) ≥ 2000, כך שאנו רואים שהמסה הכוללת לא משתנה, למרות העובדה ש-tx היא עסקה בעלת ערך נמוך יחסית עם יותר פלטים מתשומות.
באופן כללי יותר, אנו רואים ש-storage_mass הופך לדומיננטי רק כאשר מופיעים קלטים קטנים יחסית (כאשר הסף המדויק הוא ביחס הפוך לתקציב הכולל של העסקה). ובכל זאת, אפילו בשימוש יומיומי, אנו רואים שיכולים להופיע פלטים קטנים. UTXOs קטנים מופיעים בדרך כלל כשינוי או כמיקרו-תשלומים, ובכל דרך שבה נגדיר את C, עלינו לקחת בחשבון את האפשרות שתשלום סטנדרטי מארנק סטנדרטי עלול לחרוג מסף זה, דבר שישפיע על איכות השירות של משתמשים רגילים. בסעיף אלגוריתם ארנק נראה כיצד לחבר עסקאות לשליחת ערכים קטנים באופן שרירותי, ובסעיף מיקרו-תשלומים נדון באסטרטגיות להפחתת עלות זו לחלוטין.
עסקה tx היא מצטברת אם |O| ≤ |I| וכל הערכים ב-O שווים, כלומר = תקציב / |O| (לרוב, יש לנו ש- |O| = 1). מכיוון שכל הערכים ב-O זהים, יש לנו ש-H(O) = A(O) = תקציב / |O| ומקבלים ש-מסת אחסון (tx) = C ⋅ ( | O | A (O) − | I | A (I)) + = C ⋅ ( | O | 2 − | I | 2 תקציב) + = 0. לפיכך, חיבור מספר פלטים למספר שווה או קטן יותר של פלטים בעלי ערך שווה לעולם לא יביא למסת אחסון. זה נכון ללא קשר לגודל ערכי הפלט.
כדאי לדון מעט כיצד עמלות משפיעות על תופעה זו. נוכחות של עמלה משנה את משוואת המסה כך:
מסת אחסון (tx) = C ⋅ (|O | 2 תקציב − תשלום − |I | 2 תקציב) , ולאחר סידור מחדש מסוים, ניתן לראות שמסת האחסון הופכת חיובית אם ורק אם
(1 − (| O | | I |)2) < תקציב העמלות. ראוי לציין שהתנאי לעיל תלוי לחלוטין במספר התשומות והפלטים וביחס העמלות לתקציב, לא בערכים בפועל או אפילו ב-C. עם זאת, בתרחישים שבהם מסת האחסון חיובית, הערך בפועל שלה תלוי בכל הכמויות הללו. הדוגמה הראשונה שקופצת לעין היא המקרה |I | = | O|, שבו ברור שכל עמלה חיובית תביא למסת אחסון חיובית. עם זאת, ניתן לראות באופן מספרי שאם הערכים אינם קטנים מאוד ו/או העמלה גדולה מאוד, מסת האחסון עדיין תהיה קטנה ממסת החישוב.
במקרה |O| = 1 התנאי הופך ל-(1 − 1 |I|2) < תקציב העמלות. לכן, אפילו עבור |I| = 2, מסת האחסון נעלמת אלא אם כן העמלה היא לפחות שלושה רבעים מהערך הכולל.
המסקנה הכללית מהניתוח היא שפונקציית מסת האחסון מטפלת "יפה" בהרכבה, אפילו בנוכחות עמלות.
בורסות ובריכות
בורסאות ובריכות אמורים להפיק תועלת מהצעה זו באופן מיידי. שתיהן אינן עוסקות בדרך כלל בתשלומים זעירים, והטלאי שנפרס כעת מגביל מאוד את יכולתן להגיש עסקאות רבות בזמנים של עומס מוגבר. כמו כן, בטווח הארוך, ניתן להתייחס לבורסה כאל ארנק פעיל ביותר שנפחי ההפקדות והמשיכות שלו זהים בערך. כלומר, ערכי ההפקדות מפוזרים בערך באותו אופן כמו אלו של המשיכות. על ידי התאמת קלטים לפלט באותו גודל, בורסות יכולות לשמור על מסת אחסון נמוכה גם בעתיד שבו עסקאות אופייניות יהיו בעלות ערכים נמוכים (למשל, תת-כספה).
באופן דומה, פולים יכולים להסיר את רוב מסת האחסון על ידי קביעת מגבלת המשיכה לגדולה יותר מפלט טיפוסי של מטבעות.
מיקרו-תשלומים
פתרון מקיף חייב לקחת בחשבון גם תרחישים שבהם משתמשים רגילים רוצים להוציא סכומים קטנים מאוד (קטנים בהרבה מ-0.1 קפסאה). אנו דנים כיצד ניתן להשיג זאת, בהנחה שכל הארנקים מכילים לפחות קפסאה אחת (כלומר 10 8 dworks).
דמיינו מיליונר אקסצנטרי עם חיבה לגלידה. בכל בוקר, הגיבורה שלנו לוקחת ארנק המכיל UTXO יחיד של לפחות 1000 קפסאה, והולכת לדוכן לקנות גביע וניל במחיר נוח של 0.1 קפסאה. כיצד המיליונרית צריכה לשלם עבור הרכישה שלה?
נבחן עסקה tx עם קלט יחיד של ערך V ושני פלטים של ערכים v ו-V − v כאשר v ≪ V
בפרט, כדי לשלם לספק 0.1 כספא, ולהחזיר את העודף לעצמו, המיליונר יצטרך ליצור עסקה שמשקלה כ-100,000 גרם. זהו חמישית מהקיבולת של בלוק. כלומר, העמלות עבור עסקה זו יהיו יקרות פי 40 מעסקאות "סטנדרטיות" (שמסת האחסון שלהן נמוכה ממסת החישוב שלהן). תשלום סכום זה עבור עסקה בודדת עשוי להיות נסלח כמוצא חד פעמי אחרון, אך משתמשים לא יסכימו (ואסור להם) לשלם אותו מדי יום.
הנקודה המרכזית היא להבין שהסוחר שמוכר את הגלידה אינו שומר כמויות קטנות כאלה ללא הגבלת זמן, אלא יגדיל אותן בסופו של דבר (נניח על בסיס יומי). עם זאת, הפעולות העתידיות של הסוחר אינן ידועות למערכת, והפעולה אינה ניתנת להבחנה מקומית מפעולות של תוקף אבק מכוון. במודל מבוסס חשבון, עסקה כזו תופיע רק כהעברה של ערך קטן בין חשבונות גדולים משמעותית. בעיקרו של דבר, מודל החשבון מטמיע את ההרכבה העתידית של התשלום בפעולה המקומית.
אנו טוענים שניתן לחקות התנהגות מדויקת זו גם במודל UTXO על ידי יצירת עסקה חתומה הדדית. הספק והמיליונר יוצרים עסקה יחד עם שתי קלט של 1000 כספא, אחת שהוצאה על ידי הספק והשנייה שהוצאה על ידי המיליונר, ושתי פלטים, אחת משלמת 1000.1 כספא לספק והשנייה משלמת 999.9 כספא למיליונר. זה מקל על התשלום תוך הסרת עלויות מסת האחסון. שימו לב ש-UTXO הזמין לסוחר אינו חייב להתאים במדויק בערכו לארנקו של המיליונר. אפילו באמצעות UTXO של 10 כספא, התוצאות הן 999.9 ו-10.1. מכיוון שהתפוקה הקטנה ביותר גדולה בהרבה, המסה תצא קטנה בהרבה.
החיסרון של פתרון זה הוא שהסוחר חייב שיהיה לו ארנק חם זמין כל הזמן ולשתף פעולה עם הלקוח כדי ליצור עסקה חתומה הדדית. ב-KIP הבא, נציין כתובות ארנק אוטומטיות, כאשר UTXOs בבעלות כתובות כאלה יאפשרו לכל אחד להוסיף ליתרה שלו מבלי שבעל ה-UTXO יצטרך לחתום עליו. בין היתר, מנגנון זה יאפשר למיליונר לרכוש גלידה כמתואר לעיל, באמצעות הארנק שלו בלבד.
אלגוריתם הארנק
בסעיף זה אנו מספקים אלגוריתם אופטימלי לביצוע תשלום בערך נתון באמצעות קבוצה נתונה של UTXOs. האלגוריתם הוא "אופטימלי" במובן שהוא ממזער את מספר העסקאות הנדרשות לביצוע תשלום זה ואת המסה הכוללת שהן צורכות.
הצהרת אחריות: האלגוריתם המתואר אינו מכסה את כל מקרי הקצה האפשריים (במיוחד היבטים הקשורים לעמלות), והוא מובא כאן כהנחיה לדרך שיש לנקוט. בעזרת הקהילה אנו מקווים לפרסם בקרוב יישום מקיף עצמאי (בצורת מחברת Python Jupyter), אשר יענה על הצורך בייחוס מדויק יותר.
סמן את M כמסת האחסון המקסימלית שיכולה להיות לעסקה בודדת. הערך M יכול להיות גבול הממפול המשותף (כרגע מוגדר ל-100,000 גרם), או מוגדר על ידי המשתמש. בנוסף, נניח שיש יחס המרה r של מסה לעמלה. הערך של r מתקבל בדרך כלל על ידי תוכנת הארנק על ידי ניטור השימוש ברשת. לפיכך, עסקה במסה m תשלם עמלה של rm. נציין ש-F = rM ייצג את העמלה של עסקה בעלת הכבדות המקסימלית.
נניח שהמשתמש מעוניין לבצע תשלום עם ערך P וכבר אספנו מספיק קלטים I כך ש
האלגוריתם מניח מראש שטרנזקציה המורכבת מ-I ו-O =
בעל מסת חישוב ≤ M אך מסת אחסון > M. אחרת, אם מסת החישוב גדולה מדי, יש לפתור אותה באמצעות השיטות הנוכחיות של הרכבה על ידי בניית עץ עסקאות. נזכיר כי עסקאות הרכבה כאלה לעולם לא יהיו בעלות מסת אחסון, כך שלעולם אין צורך לפתור את שתי המטרות במקביל. בסופו של דבר אנו מגיעים לעסקת שורש שבה מסת החישוב נמוכה מספיק, ובנקודה זו ניתן לטפל במסת אחסון במידת הצורך.
אופטימיזציה בשלב יחיד. אנו מתחילים בפתרון שלב יחיד בתהליך. השאלה שאנו שואלים היא "בהינתן גבול מסה M וקבוצת קלטים I, מהו ערך התשלום המינימלי האפשרי מבלי לעלות על M?". או במונחים מתמטיים יותר, "מהי האסימטריה המקסימלית שאנו יכולים ליצור בין 2 הפלטים בהינתן האילוצים?". נסמן כי N הוא הרכיב השלילי של מסת האחסון כמתואר על ידי הנוסחה הרגועה. שימו לב ש-I ומספר הפלטים (שידוע שהוא 2 במקרה זה), מספיקים לחישוב חלק זה. תהא
מסמן את ערך התפוקה הכולל. עלינו לפתור את המשוואה הבאה:
גילוי נאות
נכתב במקור על ידי מיכאל סאטון, אורי ניומן, שי וויבורסקי, יונתן סומפולינסקי..
האמור לעיל מובא לצורכי ידע כללי בלבד ואינו מהווה ייעוץ פיננסי, השקעות, מס, או המלצה למסחר בנכסים דיגיטליים או כל ייעוץ אחר ואינו תחליף להתייעצות עם גורם מוסמך.
הכותב / מתרגם ומערכת האתר אינם אחראים לכל נזק, הפסד או טעות הנובעים מהסתמכות על המידע המוצג כאן או במסמכים של צד ג' שתורגמו לעברית.
המסמך תורגם לעברית על ידי צוות kaspa.co.il למען הקהילה
במידה ומצאתם טעות בתרגום נשמח אם תעדכנו אותנו בטופס יצירת קשר
תגובה אחת
Pingback: הצעה לשיפור כספא kip-00010 - כספא - Kaspa