Vitalik Buterin דרך ה בלוג ויטליק בוטרין
זוהי מראה של הפוסט ב https://medium.com/@VitalikButerin/zk-snarks-under-the-hood-b33151a013f6
זהו החלק השלישי בסדרת מאמרים המסבירים כיצד פועלת הטכנולוגיה מאחורי zk-SNARKs; המאמרים הקודמים בנושא תוכניות חשבון ריבועי ו זיווג עקומה אליפטית נדרשים קריאה, ומאמר זה יניח ידע בשני המושגים. ההנחה היא גם ידע בסיסי של מה הם zk-SNARKs ומה הם עושים. ראה גם המאמר של כריסטיאן רייטוויסנר כאן למבוא טכני נוסף.
במאמרים הקודמים, הצגנו את תוכנית האריתמטיקה הריבועית, דרך לייצג כל בעיה חישובית עם משוואה פולינומית שמתאימה הרבה יותר לצורות שונות של תחבולות מתמטיות. הצגנו גם זיווגים של עקומה אליפטית, המאפשרים צורה מוגבלת מאוד של הצפנה הומומורפית חד-כיוונית המאפשרת לך לבצע בדיקת שוויון. עכשיו, אנחנו הולכים להתחיל מהנקודה שבה הפסקנו, ולהשתמש בצמדי עקומה אליפטית, יחד עם כמה טריקים מתמטיים אחרים, על מנת לאפשר למוכיח להוכיח שהוא יודע פתרון עבור QAP מסוים מבלי לחשוף שום דבר אחר על פתרון ממשי.
מאמר זה יתמקד ב פרוטוקול פינוקיו מאת Parno, Gentry, Howell ו-Raykova מ-2013 (המכונה לעתים קרובות PGHR13); ישנן כמה וריאציות על המנגנון הבסיסי, כך שתוכנית zk-SNARK המיושמת בפועל עשויה לעבוד מעט אחרת, אך העקרונות הבסיסיים באופן כללי יישארו זהים.
כדי להתחיל, הבה ניכנס להנחת המפתח ההצפנה העומדת בבסיס האבטחה של המנגנון שבו אנו הולכים להשתמש: *ידע-של-מעריך* הנחה.
בעיקרון, אם אתה מקבל זוג נקודות � ו- �, כאשר �⋅�=�, ותקבל נקודה �, אז לא ניתן להמציא �⋅� אלא אם כן � "נגזר" מ- � בדרך כלשהי שאתה יודע. זה אולי נראה מובן מאליו אינטואיטיבית, אבל הנחה זו למעשה לא יכולה להיגזר מכל הנחה אחרת (למשל קשיות יומן דיסקרטית) שבה אנו משתמשים בדרך כלל בהוכחת אבטחה של פרוטוקולים מבוססי עקומה אליפטית, ולכן zk-SNARKs למעשה נשענים על משהו בסיס רעוע יותר מקריפטוגרפיה של עקומה אליפטית באופן כללי יותר - למרות שהוא עדיין יציב מספיק כדי שרוב הקריפטוגרפים בסדר עם זה.
עכשיו, בואו ניכנס לאופן שבו ניתן להשתמש בזה. נניח שזוג נקודות (�,�) נופל מהשמים, כאשר �⋅�=�, אבל אף אחד לא יודע מה הערך של �. כעת, נניח שיצא לי זוג נקודות (�,�) שבהן �⋅�=�. לאחר מכן, הנחת ה-KoE מרמזת שהדרך היחידה שיכולתי לעשות את צמד הנקודות הזה הייתה לקחת � ו- �, והכפלת שתיהן בגורם r כלשהו שאני מכיר אישית. שים לב גם שבזכות הקסם של זיווגי עקומה אליפטית, בדוק ש�=�⋅� למעשה לא מצריך ידיעה � – במקום זאת, אתה יכול פשוט לבדוק אם �(�,�)=�(�,�).
בואו נעשה משהו יותר מעניין. נניח שיש לנו עשרה זוגות של נקודות נופלות מהשמים: (�1,�1),(�2,�2)...(�10,�10). בכל המקרים, ��⋅�=��. נניח שאספק לך אז זוג נקודות (�,�) כאשר �⋅�=�. מה אתה יודע עכשיו? אתה יודע ש� הוא איזה צירוף ליניארי �1⋅�1+�2⋅�2+…+�10⋅�10, שבו אני מכיר את המקדמים �1,�2…�10. כלומר, הדרך היחידה להגיע לזוג נקודות כזה (�,�) היא לקחת כמה כפולות של �1,�2…�10 ולחבר אותן יחד, ולבצע את אותו חישוב עם �1,�2... �10.
שים לב שבהינתן קבוצה ספציפית של �1…�10 נקודות שאולי תרצה לבדוק עבורן שילובים ליניאריים, אינך יכול למעשה ליצור את �1…�10 נקודות הנלוות מבלי לדעת מה זה, ואם אתה כן יודע מה זה � הוא אז אתה יכול ליצור זוג (�,�) שבו �⋅�=� עבור כל מה שתרצה, מבלי לטרוח ליצור שילוב ליניארי. מכאן שכדי שזה יעבוד זה הכרחי לחלוטין שמי שיוצר את הנקודות האלה יהיה אמין ולמעשה ימחק � ברגע שהוא יצר את עשר הנקודות. מכאן מגיע המושג "התקנה מהימנה"..
זכור שהפתרון ל-QAP הוא קבוצה של פולינומים (�,�,�) כך �(�)⋅�(�)−�(�)=�(�)⋅�(�), כאשר:
- � הוא שילוב ליניארי של קבוצת פולינומים {�1…��}
- � הוא השילוב הליניארי של {�1…��} עם אותם מקדמים
- � הוא שילוב ליניארי של {�1…��} עם אותם מקדמים
הקבוצות {�1…��},{�1…��} ו-{�1…��} והפולינום � הם חלק מהצהרת הבעיה.
עם זאת, ברוב המקרים בעולם האמיתי, �,� ו- � גדולים ביותר; עבור משהו עם אלפים רבים של שערי מעגל כמו פונקציית גיבוב, לפולינומים (והגורמים לשילובים הליניאריים) עשויים להיות אלפים רבים של איברים. לפיכך, במקום שהמוכיח יספק את הצירופים הליניאריים ישירות, אנחנו הולכים להשתמש בטריק שהצגנו למעלה כדי שהמוכיח יוכיח שהם מספקים משהו שהוא שילוב ליניארי, אבל בלי לחשוף שום דבר אחר.
אולי שמתם לב שהטריק שלמעלה עובד על נקודות עקומה אליפטיות, לא על פולינומים. לפיכך, מה שקורה בפועל הוא שאנו מוסיפים את הערכים הבאים להגדרה המהימנה:
- �⋅�1(�),�⋅�1(�)⋅��
- �⋅�2(�),�⋅�2(�)⋅��
- ...
- �⋅�1(�),�⋅�1(�)⋅��
- �⋅�2(�),�⋅�2(�)⋅��
- ...
- �⋅�1(�),�⋅�1(�)⋅��
- �⋅�2(�),�⋅�2(�)⋅��
- ...
אתה יכול לחשוב על t כעל "נקודה סודית" שבה הפולינום מוערך. � הוא "מחולל" (נקודת עקומה אליפטית אקראית שצוינה כחלק מהפרוטוקול) ו�,��,�� ו�� הם "פסולת רעילה", מספרים שחייבים להימחק בכל מחיר, או אחרת מי שיש לו אותם יוכל להביא הוכחות מזויפות. עכשיו, אם מישהו נותן לך זוג נקודות �, � כאלה ש�⋅��=� (תזכורת: אנחנו לא צריכים �� כדי לבדוק זאת, מכיוון שאנו יכולים לבצע בדיקת התאמה), אז אתה יודע שמה שהם הם נותנים לך הוא שילוב ליניארי של �� פולינומים המוערכים ב- �.
לפיכך, עד כה על המוכיח לתת:
- ��=�⋅�(�),��′=�⋅�(�)⋅��
- ��=�⋅�(�),��′=�⋅�(�)⋅��
- ��=�⋅�(�),��′=�⋅�(�)⋅��
שימו לב שהמוכיח למעשה לא צריך לדעת (ולא אמור לדעת!) �,��,�� או �� כדי לחשב ערכים אלה; במקום זאת, המוכיח אמור להיות מסוגל לחשב את הערכים הללו רק מהנקודות שאנו מוסיפים להגדרות המהימנות.
השלב הבא הוא לוודא שלכל שלושת השילובים הליניאריים יש את אותם מקדמים. זה נוכל לעשות על ידי הוספת קבוצה נוספת של ערכים להגדרה המהימנה: �⋅(��(�)+��(�)+��(�))⋅�, כאשר � הוא מספר נוסף שצריך להיחשב כ"רעיל בזבוז" והושלך ברגע שההגדרה המהימנה הושלמה. לאחר מכן נוכל לבקש מהמוכיח ליצור שילוב ליניארי עם הערכים הללו עם אותם מקדמים, ולהשתמש באותו טריק צימוד כמו לעיל כדי לוודא שהערך הזה תואם ל-�+�+� שסופק.
לבסוף, עלינו להוכיח ש-�⋅�−�=�⋅�. אנו עושים זאת שוב עם בדיקת התאמה:
�(��,��)/�(��,�)?=�(�ℎ,�⋅�(�))
איפה �ℎ=�⋅�(�). אם הקשר בין המשוואה הזו לבין �⋅�−�=�⋅� אינו הגיוני עבורך, חזור וקרא את מאמר על זיווגים.
ראינו למעלה כיצד להמיר �,� ו� לנקודות עקומה אליפטיות; � הוא רק המחולל (כלומר, נקודת העקומה האליפטית המקבילה למספר אחד). אנו יכולים להוסיף �⋅�(�) להגדרה המהימנה. � קשה יותר; � הוא רק פולינום, ואנו חוזים מעט מאוד מבעוד מועד לגבי מה יהיו המקדמים שלו עבור כל פתרון QAP בנפרד. לפיכך, עלינו להוסיף עוד נתונים להגדרה המהימנה; ספציפית הרצף:
�,�⋅�,�⋅�2,�⋅�3,�⋅�4….
ב-Zcash Trusted Setup, הרצף כאן מגיע לכ-2 מיליון; זה כמה כוחות של � אתה צריך כדי לוודא שתמיד תוכל לחשב �(�), לפחות עבור מופע ה-QAP הספציפי שאכפת להם ממנו. ועם זה, המוכיח יכול לספק את כל המידע עבור המאמת כדי לבצע את הבדיקה הסופית.
יש עוד פרט אחד שאנחנו צריכים לדון בו. רוב הזמן אנחנו לא רוצים רק להוכיח באופן מופשט שקיים פתרון כלשהו לבעיה ספציפית כלשהי; במקום זאת, אנו רוצים להוכיח או את נכונותו של פתרון ספציפי כלשהו (למשל, להוכיח שאם אתה לוקח את המילה "פרה" ו-SHA3 hash אותה מיליון פעמים, התוצאה הסופית מתחילה ב-0x73064fe5), או שקיים פתרון אם אתה מגביל חלק מהפרמטרים. לדוגמה, במופע של מטבע קריפטוגרפי שבו סכומי העסקאות ויתרות החשבון מוצפנים, אתה רוצה להוכיח שאתה מכיר מפתח פענוח k כזה ש:
decrypt(old_balance, k) >= decrypt(tx_value, k)
decrypt(old_balance, k) - decrypt(tx_value, k) = decrypt(new_balance, k)
המוצפן old_balance
, tx_value
ו new_balance
יש לציין בפומבי, שכן אלו הם הערכים הספציפיים שאנו מחפשים לאמת באותו זמן מסוים; רק מפתח הפענוח צריך להיות מוסתר. יש צורך בשינויים קלים בפרוטוקול כדי ליצור "מפתח אימות מותאם אישית" התואם להגבלה ספציפית כלשהי על התשומות.
עכשיו, בואו נזוז קצת אחורה. קודם כל, הנה אלגוריתם האימות בשלמותו, באדיבות בן ששון, טרומר, וירצה וצ'יזה:
השורה הראשונה עוסקת בפרמטריזציה; בעצם, אתה יכול לחשוב על תפקידו כיצירת "מפתח אימות מותאם אישית" למקרה הספציפי של הבעיה שבו מצוינים חלק מהטיעונים. השורה השנייה היא בדיקת השילוב הליניארי עבור �,� ו�; השורה השלישית היא הבדיקה שלשילובים הליניאריים יש אותם מקדמים, והשורה הרביעית היא בדיקת המוצר �⋅�−�=�⋅�.
בסך הכל, תהליך האימות הוא כמה כפלי עקומה אליפטית (אחד לכל משתנה קלט "ציבורי") וחמישה בדיקות זיווג, שאחת מהן כוללת כפל זיווג נוסף. ההוכחה מכילה שמונה נקודות עקומה אליפטיות: זוג נקודות כל אחת עבור �(�),�(�) ו�(�), נקודה �� עבור �⋅(�(�)+�(�)+�(� )), ונקודה �ℎ עבור �(�). שבע מהנקודות הללו נמצאות על עקומת �� (32 בתים כל אחת, מכיוון שניתן לדחוס את הקואורדינטה � לביט בודד), וביישום Zcash נקודה אחת (��) נמצאת על העקומה המפותלת ב- ��2 (64 בתים), כך שהגודל הכולל של ההוכחה הוא ~288 בתים.
שני החלקים הקשים ביותר מבחינה חישובית ביצירת הוכחה הם:
- חלוקה (�⋅�−�)/� כדי לקבל � (אלגוריתמים המבוססים על טרנספורמציה מהירה של פורייה יכול לעשות זאת בזמן תת ריבועי, אבל זה עדיין די אינטנסיבי מבחינה חישובית)
- ביצוע הכפלות והוספות של העקומה האליפטית כדי ליצור את הערכים �(�),�(�),�(�) ו-�(�) והזוגות המתאימים להם
הסיבה הבסיסית לכך שיצירת הוכחה כל כך קשה היא העובדה שמה שהיה שער לוגי בינארי יחיד בחישוב המקורי הופך לפעולה שיש לעבד בהצפנה באמצעות פעולות עקומה אליפטית אם אנחנו עושים מזה הוכחה של אפס ידע. . עובדה זו, יחד עם העל-לינאריות של טרנספורמציות פורייה מהירות, פירושה שיצירת הוכחה נמשכת ~20-40 שניות עבור עסקת Zcash.
שאלה חשובה נוספת היא: האם אנחנו יכולים לנסות להפוך את ההגדרה המהימנה לקצת... פחות תובענית אמון? למרבה הצער איננו יכולים להפוך את זה לחסר אמון לחלוטין; הנחת ה-KoE עצמה מונעת יצירת זוגות עצמאיים (��,��⋅�) מבלי לדעת מהו �. עם זאת, אנו יכולים להגביר מאוד את האבטחה על ידי שימוש בחישוב �-of-� מרובה צדדים - כלומר, בניית ההגדרה המהימנה בין � צדדים בצורה כזו שכל עוד לפחות אחד מהמשתתפים מחק את הפסולת הרעילה שלהם אז אתה בסדר .
כדי לקבל קצת תחושה כיצד היית עושה זאת, הנה אלגוריתם פשוט לקחת סט קיים (�,�⋅�,�⋅�2,�⋅�3...), ו"להוסיף" את הסוד שלך כך שאתה צריך גם את הסוד שלך וגם את הסוד הקודם (או קבוצת הסודות הקודמת) כדי לרמות.
ערכת הפלט היא פשוט:
�,(�⋅�)⋅�,(�⋅�2)⋅�2,(�⋅�3)⋅�3…
שים לב שאתה יכול לייצר את הסט הזה תוך ידיעת הסט המקורי וה-s בלבד, והסט החדש מתפקד באותו אופן כמו הסט הישן, למעט שימוש כעת ב-�⋅� כ"פסולת רעילה" במקום �. כל עוד אתה והאדם (או האנשים) שיצרו את הסט הקודם לא מצליחים למחוק את הפסולת הרעילה שלך ומאוחר יותר משתפים פעולה, הסט הוא "בטוח".
לעשות זאת עבור ההגדרה המהימנה המלאה היא לא מעט יותר קשה, מכיוון שיש כמה ערכים מעורבים, והאלגוריתם צריך להיעשות בין הצדדים בכמה סבבים. זהו תחום של מחקר פעיל כדי לראות אם ניתן לפשט עוד יותר את אלגוריתם החישוב הרב-צדדי ולהפוך אותו לדרוש פחות סבבים או להפוך אותו לאפשרי מקבילים יותר, שכן ככל שתוכל לעשות זאת, כך יהיה אפשרי לכלול יותר צדדים בהליך ההגדרה המהימן . זה סביר לראות מדוע מערך מהימן בין שישה משתתפים שכולם מכירים ועובדים אחד עם השני עלול לגרום לאנשים מסוימים אי נוחות, אבל מערך מהימן עם אלפי משתתפים יהיה כמעט בלתי ניתן להבדיל מחוסר אמון כלל - ואם אתה ממש פרנואיד , אתה יכול להיכנס ולהשתתף בהליך ההגדרה בעצמך, ולהיות בטוח שמחקת באופן אישי את הערך שלך.
תחום נוסף של מחקר פעיל הוא השימוש בגישות אחרות שאינן משתמשות בזוגיות ובאותה פרדיגמת הגדרה מהימנה כדי להשיג את אותה מטרה; לִרְאוֹת המצגת האחרונה של אלי בן ששון עבור חלופה אחת (אם כי יש להזהיר, זה לפחות מסובך מבחינה מתמטית כמו SNARKs!)
תודה מיוחדת לאריאל גביזון וכריסטיאן רייטוויסנר על הביקורת.
- הפצת תוכן ויחסי ציבור מופעל על ידי SEO. קבל הגברה היום.
- PlatoData.Network Vertical Generative Ai. העצים את עצמך. גישה כאן.
- PlatoAiStream. Web3 Intelligence. הידע מוגבר. גישה כאן.
- PlatoESG. פחמן, קלינטק, אנרגיה, סביבה, שמש, ניהול פסולת. גישה כאן.
- PlatoHealth. מודיעין ביוטכנולוגיה וניסויים קליניים. גישה כאן.
- BlockOffsets. מודרניזציה של בעלות על קיזוז סביבתי. גישה כאן.
- מקור: מודיעין נתונים של אפלטון.