טאפרוט (Taproot) – העידכון הבא ברשת הביטקוין
״כל זה אינו משל ולא חלום, זה נכון כאור בצהריים. כל זה יבוא מחר אם לא היום ואם לא מחר אז החל מבלוק 709362״
(נ. שמר, גרסה מקורית)
שינוי גדול וחשוב לפתחנו, SegWit V1, או בשמו העממי Taproot, אושר ברוב מוחץ של קהילת המפתחים והמשתמשים וכח הכריה, והוא ״יתמזלג ברכּוּת״ אל אויר העולם בעוד כ 4 חודשים (נוב׳ 2021).
מדובר בעדכון הגדול והמשמעותי ביותר של פרוטוקול הביטקוין מאז Segwit V0 ב 2017 . נתמקד בשניים מהשינויים המרכזיים בו שהם מהפכניים ממש:
1. חתימות שנור (Schnorr Signature)
חתימת שנור היא שיטה מצוינת להצפנה של מפתח פרטי / מפתח פומבי ולחתימה דיגיטלית שהייתה יכולה להתאים מאוד לביטקוין. בסופו של דבר נבחרה שיטה אחרת (מבוססת עקומים אליפטיים) מכיוון שקלאוס שנור בחר (משום מה) להגן על השיטה שלו בפטנט, ובכך למעשה מנע מאנשים אחרים להתבסס על העבודה שלו ולשלב אותה באלגוריתמים בספריות קוד פתוח ובפרויקטים קריפטוגרפיים כמו ביטקוין.
משפג תוקף הפטנט ב 2008 וחלף די זמן על מנת להטמיע את הרעיון בספריות הקוד הרלוונטיות, בשלה העת לצעוד את הצעד הנוסף ולהכניס אותו אל פרוטוקול הביטקוין, ומכיוון שהשינוי עוסק במנגנון ההצפנה עצמו, לא מדובר על סתם עדכון אלא על לב ליבה של המערכת, קודש הקודשים שלה, האלמנט הקריטי שהופך את פרויקט הביטקוין כולו מרעיון תיאורטי ערטילאי לכסף דיגיטלי מבוזר אמיתי ממשי ובטוח.
חתימות שנור מייצרות מפתחות מעט קצרים יותר )באותה רמת בטיחות( ובנוסף הן מחוננות ביכולת פלאית לאגרגציה: ״סכום החתימות מתאים לחתימת הסכומים״, כלומר, 10 פעולות שנחתמות כיום ע״י 10 מפתחות פרטיים, ועוברות וידוא בנפרד ע״י 10 מפתחות פומביים – המבנה החדש של חתימות שנור יאפשר ״לסכום״ את כל החתימות לכדי חתימה חדשה אחת, ובהתאם ״לסכום״ את כל המפתחות הפומביים לכדי מפתח חדש אחד.
כך גוש מידע גדול של 10 פעולות נפרדות, ישלח לבלוקצ׳יין כפעולה יחידה אחת, עם חתימה אחת, שמצריכה וידוא אחד. המפתח הפומבי החדש הזה, יאמת את ההודעה המורכבת כולה ויוכיח, באותה רמת הוודאות שישנה היום, שמי שיצר אותו אכן שולט בהרכבה של כל 10 ההודעות המחוברות.
2. טאפסקריפט (TapScript)
רשת הבלוקצ׳יין מאפשרת למשתמשים בה ליישם חוזים חכמים. חוזה חכם הוא קוד תוכנה שתכליתו לבדוק רשימת תנאים ובסופה להכריע false או true. לשלם או לא לשלם.
לדוגמה, ״בצע תשלום מתוך הכתובת: באופן מיידי אם ישנו קונצנזוס של כל חמש החתימות, או אם חלפה שנה וסופקו שלוש מתוך חמש החתימות, או אם חלפו שנתיים וסופקה חתימה אחת ובנוסף גם תוצאת גיבוב מתאימה של הודעה כלשהי, או אם חלפו שלוש שנים וסופקה חתימה אחת״.
כיום, על מנת לממש חוזה כזה ולבצע בפועל תשלום מתוך כתובת ביטקוין שלו, המשתמשים נאלצים לייצר טרנזאקציה במשקל גדול ובפרטיות נמוכה. הטרנזאקציה חייבת לכלול את החוזה עצמו, פירוט של איזה מהתנאים מבקשים לממש, את כל החתימות הדרושות לקיום התנאי הזה, ואת כל האינפוטים הרלוונטיים לביצוע התשלום.
טאפסקריפט לעומת זאת, יאפשר ״מרקליזציה״ של כל המידע הזה – ניתן יהיה להביע את החוזה על כל פרטיו באמצעות מבנה נתונים שנקרא עץ מרקל, ועל מנת לממש אותו לא יהיה עוד צורך בטרנזאקציה שמשדרת את כל העץ, אלא אפשר יהיה להסתפק רק בגיבוב של ״הצמרת״ שלו.
המידע שיחשף פומבית אל הבלוקצ׳יין יהיה בסך הכל פעולה חתומה אחת, שמוכיחה שסיפקנו את תנאי מספר 4 מרשימת התנאים של החוזה, וזאת מבלי לחשוף את שאר התנאים שיש בחוזה, ומיהם 5 המפתחות, ומהן תתי הקבוצות הנדרשות מתוכם, או אפילו את העובדה שישנם חמישה מהם. כל מה שיחשף הוא טרנזאקציה אחת, קצרה זולה ופרטית, חתומה ע״י מפתח יחיד.
הדבר יביא לשיפור ניכר בעלויות, בסקיילביליות, בפרטיות, ובתשתית לפיתוחים עתידיים.
דוגמה מובהקת לכך היא סגירת ערוץ לייטנינג. נזכור שהבלוקצ׳יין ״לא יודע״ מהי רשת הברק. את מה שאנחנו מבינים כסגירת ערוץ לייטנינג, הבלוקצ׳יין רואה כתשלום מולטיסיג של 2 מ- 2 , המכיל את שתי החתימות, ובנוסף עוד חוזה, ועוד תנאי בתוך החוזה שמבקשים להראות שמתממש. בסך הכל מדובר בפעולה מורכבת, מרובת חתימות, וניתנת לזיהוי בקלות כסגירת ערוץ לייטנינג.
במצב החדש כל מה שיופיע ע״ג הבלוקצ׳יין היא טרנזאקציה אחת חתומה במפתח יחיד, שאינה ניתנת לזיהוי כשונה מאחיותיה. וכך גם לגבי כל פעולת מולטיסיג או חוזה חכם אחרת. כולן תשוטחנה לכדי טרנזאקציות יחידות ודומות, וככל שהשימוש בטאפרוט יתרחב, אי אפשר יהיה להבדיל יותר בין תשלומים פשוטים לבין תשלומי חוזים מורכבים ולבין סגירת ערוצי לייטנינג.
ארנקים משודרגים
צמתי ביטקוין משודרגים יעברו מהגרסה הנוכחית של SegWit V0, לגרסה חדשה של SegWit V1.
כתובות משודרגות תיפתחנה ב bc1p במקום ב bc1q, הואיל ותקן bech32 מסמן ב-q את 0 וב-p את 1.
ברמה האפליקטיבית, ארנקים משודרגים יוכלו להציע יכולות ניהול מטבעות (coin control) וקונסולידציה אוטומטית, אך לפני כן חשוב להפריד בין רמת הפרוטוקול לרמת האפליקציות:
הפרוטוקול עצמו ישודרג, המזלג יייושם, ובזמן קצר רוב גדול של הצמתים יעדכנו את הקוד שהם מריצים לגרסה החדשה. לעומת זאת באפליקציות, השינוי צפוי להיות איטי יותר, וסביר שיכנס תחילה למקומות בהם הוא נדרש במיוחד:
במקום הראשון נמצאת כאמור רשת הברק – מרוויחה גדולה ומיידית של טאפרוט.
במקום השני ארנקים (ואולי עוד אפליקציות עירבול ופתרונות פרטיות) – מה שיופיע במהירות הוא תמיכה של ארנקים בשליחה אל כתובות טאפרוט. בניגוד להטמעה של סגוויט v0, הפעם השינוי פשוט יותר ומצריך פחות עבודה, וארנקים טובים צפויים לאפשר תשלומים לכתובות טאפרוט בתוך זמן קצר.
לעומת זאת, פיתוח ארנקי נייטיב-טאפרוט אשר יישמו בעצמם חתימות שנור וטאפסקריט, הוא מהלך מורכב שעשוי להמשך זמן ארוך יותר.
במקום השלישי ישנם הבורסות והחלפנים – שם האופרציה מסובכת מאוד מלכתחילה ויתכן שיחלוף זמן רב עד אשר השחקנים המרכזיים יודיעו על תמיכה בטאפרוט. ישנם הרי עוד כמה (וכמה) מתוכם שאינם תומכים אפילו בסגוויט v0 גם כיום.
מעבר לכך, ישנו החשש שבורסות ושירותים שכפופים לרגולציות ממשלתיות יתקלו בקשיים חדשים דווקא מהכיוון הזה. כי מי יבטיח לנו שלא ניתקל בעוד מספר חודשים בפקידי רגולציה שיקבעו שמכיוון שטאפרוט מגדיל את פרטיות המשתמשים אזי הוא מגדיל מניה וביה גם הסיכונים להלבנת הון ומימון טרור, ואולי מי שלא מחפש צרות רגולטוריות וסיכון של האסדרה החוקית במדינה שבה הוא פועל ימנע מלתמוך בטאפרוט.
הטמעת השינוי כמזלג רך
במבט נאיבי נראה שמשהו כאן לא מסתדר.
טאפרוט הוא שינוי עמוק ויסודי בתשתית הבסיסית ביותר של ביטקוין. אפילו אם נתמקד רק באלמנט המעבר מעקומים אליפטיים (ECDCA) לחתימות שנור, נראה שמדובר בהחלפה מוחלטת של החלק החשוב ביותר ברשת: מנגנון החתימה עצמו.
שינוי כל כך רדיקלי וכל כך שורשי, – כיצד יתכן שהוא מזלג רך ולא קשיח? איך נוכל להמשיך לקיים קונצנזוס כשלא תהיה עוד הסכמה בין הצמתים אפילו על השאלה היסודית: האם הטרנזאקציה הזו תקינה או לא.
מזלגות, רכים כקשים, עוסקים בניהול שינויים בקונצנזוס. כאשר אנחנו מבקשים להקשיח את החוקים הקיימים ולהפוך את תנאי הפרוטוקול למחמירים יותר – אזי הבעיה קלה יותר. כל עוד אנחנו בטוחים שלא תיווצר אי הסכמה לגבי ההיסטוריה של הבלוקצ׳יין בין צמתים שהטמיעו את השינוי (צמתים משודרגים) לבין צמתים ישנים, נוכל להטמיע את השינוי במה שנקרא נקרא מזלג רך (soft fork) שלאחריו, כל פעולה שצומת משודרג יאשר גם צומת ישן יאשר. כלומר, כשמבקשים לאמת פעולה מסוימת ע״ג צומת משודרג ומקבלים ממנו תשובה חיובית, אז גם צמתים ישנים יסכימו איתו על התשובה הזאת. (המקרה ההפוך לא מתחייב. מצב שבו צומת משודרג פוסל פעולה בעוד צומת ישן מאשר אותה, הוא תקין לגמרי במזלג רך)
מנגד, כשהחוקים החדשים מתירניים יותר (או מחליפים כליל את הישנים) הקונצנזוס נשבר באופן מיידי. פעולה חדשה שתשודר לרשת תאושר ע״י צמתים משודרגים אבל תיפסל ע״י צמתים ישנים. מצב כזה הוא בלתי נסבל ולא ניתן לקיים אותו ולו לרגע אחד.
שינוי כזה נקרא מזלג קשיח (hard fork) ומרגע שהוא מופיע מתעורר צורך מיידי בכך ש 100% מהצמתים ישורדגו אליו בלא שום דיחוי. מכיוון שלא ניתן להבטיח שידרוג טוטאלי ומיידי כזה, מזלגות קשיחים גורמים בפועל לפיצול של הרשת לשני ענפים נפרדיםשאין ביניהם שום תקשורת.
כאן לב הבעיה. חתימת שנור היא כאמור שינוי מוחלט של החוקים. היא מחליפה לחלוטין את האופן בו צמתים עונים לשאלה ״האם הטרנזאקציה הזו חוקית או לא״. צומת ישן שיתקל בטרנזאקציית שנור יפסול אותה על הסף ולא יבין מה פשר המידע שמבקשים ממנו לאשר.
אז איך אפשר להדיר את שני מנגנוני החתימה בכפיפה אחת? איך אפשר לצפות שצמתים ישנים יאשרו טרנזאקציות חתומות בשיטה שהם לא מכירים? איך טאפרוט הוא מזלג רך?
הפתרון מסתמך על כך ששינויים עתידיים הם אמנם לא ידועים אבל בכל זאת צפויים. לצורך הזה מנגנון ה P2SH של סגוויט (Pay To Script Hash) מקצה סוג מיוחד של פונקציית תשלום שנקראת Pay-To-Anybody אישור תשלום עיוור בלי וידוא בכלל.
המנגנון מניח מראש שבעתיד יגיעו שינויים ותיקונים ושיפורים שהוא לא מודע אליהם היום, אבל מכין את עצמו כבר עכשיו לאפשר אותם לכשיגיע זמנם. כל טרנזאקציה שמשודרת לרשת נושאת מספר גרסה. כשצומת נתקל בטרנזאקציה הוא בודק את מספר הגרסה שלה, אם המספר מוכר לו אז הוא ניגש לבדוק את התקינות של שאר השדות ומוודא את חוקיות החתימה.
אבל אם הגרסה מתקדמת יותר ממה שהוא מכיר אז הוא מבין שמדובר ב״טרנזאקציה מהעתיד״. הצומת לא מנסה לאמת את החתימה אלא מתייחס להוראת התשלום כ Pay-To-Anybody. הצומת מבין שהוא עצמו לא יודע איך לבדוק את החתימה, אבל ישנם צמתים משורדגים שכן יודעים, ומשאיר להם את מלאכת האישור.
צומת ישן לא מנסה לוודא את חוקיות הטרנזאקציה, לא מציג אותה כקיימת כשארנקים או צמתים אחרים פונים אליו בשאלות לגבי תשלומים ויתרות, לא מנסה להכליל אותה בבלוק (אם הוא עוסק בפעולת כריה), ולא משדר אותה הלאה. אבל – הוא כן יקבל אותה כחוקית אם היא כבר מופיעה בבלוק כלשהו. בשביל הצומת הישן, הטרנזאקציה לא חוקית כשהיא בממפול, אבל כן חוקית כשהיא בתוך בלוק. מי שיטפלו בטרנזאקציה בפועל הם הצמתים המשודרגים. אם היא תקינה אז היא תיכרה בפועל לתוך בלוק משודרג וכאן גם החשיבות הגדולה של הטמעת שינויים גדולים כמו טאפרוט רק כשהם נתמכים ברוב גדול מאוד של כוח הכריה.
רק אז, כשהיא רשומה בתוך בלוק, הצומת הישן יאשר את הבלוק כולו ויתייחס לטרנזאקציה כחלק אמיתי מההיסטוריה של הבלוקצ׳יין. כך הקונצנזוס לגבי היסטוריית העסקאות נשמר.
כורה זדונית שתשנה את קוד הכריה שהיא מריצה כדי להכליל בו טרנזאקציית Pay-To-Anybody מזויפת שמשרתת אותה, תצטרך לזייף טרנזאקציית טאפרוט, להשקיע את המאמץ הרב הדרוש לכריית בלוק שמכיל אותה, וכל זאת רק כדי להגיע למצב זמני ורעוע של בלוק רמאי בקצה השרשרת. בלוק שאף צומת משורדג לא יאשר, אלא רק צמתים ישנים שהם כאמור מיעוט קטן. הבלוק ידחה גם על ידי כורים משודרגים וגם על ידי צמתים משודרגים, ואף אחד לא יכרה בלוק נוסף מעליו כי כאמור טאפרוט נכנס לשימוש רק לאחר שהובטח רוב גדול מאוד של כח הכריה מעבר לסתם רוב גדול של הצמתים.
המצב הזה מגן גם על שאר הצמתים הישנים שרואים את הבלוק ואין ביכולתם לקבוע אם כל הטרנזאקציות בו תקינות או שמא כורה זדונית השתילה בו זיופים. בגלל הנדירות של הכריה הזדונית (קרי ההשקעה האדירה הנדרשת על מנת להשיג רוב של כורים רמאים משתפי פעולה), בלוק כזה ינטש מהר מאוד, וגם צמתים ישנים, שהם מיעוט, לא יראו יותר מאפס או אולי אישור בודד לפני הנטישה.
זהו עקרון יסודי של הבלוקצ׳יין. בהחלט עלולות להווצר מידי פעם שתי (או יותר) שרשראות מתחרות, אבל אחת תמיד תנצח בזכות יתרון כח כריה בצד שלה. ובמקרה שלנו, שבו הבטחנו מראש רוב עצום של צמתים וכורים משודרגים, השרשרת המשודרגת תנצח מיידית בזכות היתרון האדיר שלה בכח כריה (hash power).
יתר על כן, כל הצמתים, הישנים והמשודרגים כאחד, נוהגים על פי החוק הבסיסי של העדפת השרשרת הארוכה ביותר שמייצגת את כמות הוכחת העבודה הגדולה ביותר, ובכך יוצא שלמעשה גם הצמתים הישנים משתתפים אקטיבית בניטרול הבלוק הרמאי, אפילו שאין להם את היכולת לזהות בתוכו את הטרנזאקציה הזדונית.
בזכות המנגנון הזה, גם שינוי עומק יסודי כמו טאפרוט בפרט וסגוויט בכלל, לא גורם לסיכון של שבירת קונצנזוס ומזלג קשיח ופיצול ברשת, והטמעתו מתאפשרת במזלג רך.
רועי פיטשון היה תלמיד מחקר באוניברסיטת תל אביב והתמחה במתמטיקה עיונית קריפטוגרפיה וקריפטואנליזה מודרנית.
בנוסף הוא ביטקוינר בנשמה ובאופן כללי בנאדם סבבה.