הגרלה שקופה עם הוכחה שכל אחד יכול לבדוק
לפני ההגרלה מפרסמים ״טביעת אצבע״ של רשימת המשתתפים ושל מספר סודי. אחרי ההגרלה חושפים את המספר, וכל אחד יכול לבדוק בדף האימות שהרשימה לא השתנתה ושהזוכים יצאו בדיוק מהחישוב. בלי שרת, ובלי שצריך לסמוך עלינו או על מי שעורך את ההגרלה.
- מחולל קריפטוגרפי, בלי הטיה
- שום דבר לא נשלח לשרת
- חינם, בלי הרשמה
- 1הכנה
- 2פרסום ההתחייבות
- 3הגרלה וחשיפה
10 משתתפים (כפולים יורדים)
משהו שעוד לא ידוע ויתפרסם אחרי סגירת ההרשמה, למשל תוצאות הגרלת צ׳אנס מסוימת.
הזוכים יעלו לכאן
קודם מתחייבים ומפרסמים, ורק אחר כך מגרילים.
איך זה עובד
מכינים ומתחייבים
מדביקים את המשתתפים ומקבלים שתי טביעות אצבע לפרסום.
מפרסמים
מעלים את ההודעה עם טביעות האצבע, לפני שנגמרת ההרשמה.
מגרילים וחושפים
מגרילים, ומשתפים קישור שבו כל אחד בודק את התוצאה.
איך זה עובד: מעטפה סגורה, בגרסה דיגיטלית
חשבו על מעטפה סגורה עם פתק שמונח על השולחן לפני ההגרלה. אי אפשר להחליף את הפתק בלי שכולם יראו. כאן המעטפה היא טביעת אצבע SHA-256: קוד קצר שנגזר מהמספר הסודי ומרשימת המשתתפים, ואין דרך מעשית למצוא מספר או רשימה אחרים שייתנו אותו קוד.
אחרי ההגרלה חושפים את המספר הסודי. כל אחד יכול לחשב את טביעת האצבע שלו, לראות שהיא זהה לזו שפורסמה, ולחשב את הזוכים מחדש.
למה כדאי לערבב גם ערך ציבורי
מי שבוחר את המספר הסודי יכול, בתיאוריה, לנסות הרבה מספרים עד שייצא הזוכה שהוא רוצה, ורק אז לפרסם. כדי לסגור גם את הפרצה הזו מכריזים מראש על ערך ציבורי שעוד לא ידוע, למשל תוצאות הגרלת צ׳אנס מסוימת או מספר התגובות בסגירת ההרשמה, ומערבבים אותו בחישוב בזמן ההגרלה.
מכיוון שהמספר הסודי פורסם לפני שהערך הציבורי היה ידוע, אי אפשר היה לבחור אותו כך שיתאים לזוכה מסוים.
מה בודקים בדף האימות
- רשימת המשתתפים תואמת את טביעת האצבע שפורסמה, אז אף אחד לא נוסף ולא נמחק.
- המספר הסודי תואם את טביעת האצבע שלו, אז הוא לא הוחלף אחרי ההגרלה.
- חישוב מחדש של ההגרלה נותן בדיוק את אותם זוכים ואותם ממתינים, באותו סדר.
הנוסחה המלאה, למי שרוצה לבדוק לבד
טביעת הרשימה היא SHA-256 של השמות מחוברים בירידת שורה. המפתח הוא SHA-256 של השורה pur-draw-v1|seed|publicValue|listHash|winners|backups. מהמפתח נגזר רצף מספרים: SHA-256 של ״מפתח:0״, ״מפתח:1״ וכן הלאה, כל אחד נקרא כשמונה מספרים של 32 ביט. הזוכים הם הצעדים הראשונים של ערבוב פישר־ייטס, עם דחייה של ערכים שהיו יוצרים הטיה.
כל החישוב רץ בדפדפן, והקוד זהה בדף ההגרלה ובדף האימות.
מקורות: Durstenfeld, Algorithm 235: Random permutation (1964) · MDN: Crypto.getRandomValues()
שאלות נפוצות
למה לא פשוט לצלם את המסך בזמן ההגרלה?
צילום מסך מראה רק את התוצאה, לא את מה שקרה לפניה. אפשר להגריל כמה פעמים עד שיוצא הזוכה הרצוי ולצלם רק את הפעם האחרונה. בהגרלה שקופה ההתחייבות מתפרסמת מראש, ולכן הגרלה חוזרת הייתה נחשפת.
מה אם אאבד את המספר הסודי?
בלי המספר הסודי אי אפשר להשלים את ההגרלה. לכן מורידים את ״קובץ המארגן״ מיד אחרי ההתחייבות ושומרים אותו. אפשר לטעון אותו מחדש בדף הזה בכל זמן.
אפשר להוסיף משתתפים אחרי הפרסום?
לא, וזה בכוונה. שינוי ברשימה משנה את טביעת האצבע שלה, ובדף האימות יראו שהיא לא תואמת. אם צריך לשנות, מתחילים התחייבות חדשה ומפרסמים אותה.
הרשימה פרטית. חייבים לפרסם אותה?
לא. אפשר לפרסם רק את טביעות האצבע ואת מספר המשתתפים. אחרי ההגרלה אפשר לשתף את הרשימה עם מי שצריך לבדוק, למשל עם המפקח על ההגרלה.
זה מחליף פיקוח של עורך דין או רואה חשבון?
לא. זה כלי שמאפשר לכל אחד לבדוק את התוצאה, אבל כשהחוק או ההיתר דורשים מפקח, צריך מפקח. ההוכחה יכולה לעזור לו לתעד את ההגרלה.