אחת המטרות העיקריות שפרויקטים מבוססי בלוקצ'יין שואפים להשיג היא אימות הנתונים. לדוגמאות חיות, אתה יכול להסתכל על זהות דיגיטלית ואחסון מסמכים מקוונים ובדיקות. ואכן, כל אחד מהמקרים הללו מחייב את אימות יוזם הפעולה/העסקה כדי לאשר את האדם או הישות. לדוגמה, אם לאדם יש את הטופס הדיגיטלי של תעודת זהות, זה הופך להיות חיוני להבטיח בעלות. לפיכך זוהי דוגמה מצוינת לבעיה של אימות נתונים. בואו נסקור את הצורה הפשוטה ביותר של הפתרון - חתימה דיגיטלית, שבדיקתה היא אחת הנקודות המכריעות במהלך פיתוח החוזה החכם.
הגישה פשוטה:
1) המערכת מייצרת הודעה לפי חוקים ידועים לכולם
2) החותם מקבל את ההודעה ומוסיף סט ספציפי של סמלים - חתימה דיגיטלית, קוד שנבנה מההודעה על ידי מפתח פרטי
3) החתימה שנוצרה נשלחת כעת לחוזה, שם היא מפורקת כדי לאחזר את כתובת החותם.
Solidity מציעה לך את אלגוריתם ה-ECDSA ליצירת חתימות ופירוק נוסף. אנחנו לא צריכים לצלול עמוק לתוך האלגוריתם עצמו (תוכל למצוא את המידע הדרוש במקורות המתאימים). כל מה שאנחנו צריכים לדעת הוא ש-ECDSA היא דוגמה לקריפטוגרפיה א-סימטרית, שבה המשתמש הראשון יוצר חתימה עם המפתח הפרטי שלו, והמשתמש השני מיישם אלגוריתם סטנדרטי כדי לאחזר את המפתח הציבורי של החותם. כך, הוא יכול לאמת את מקור החתימה. במקום זאת, בואו נתמקד בחלק המעשי - שימוש בחתימות ובדיקות.
קודם כל, אנחנו צריכים לזהות בעיה. לדוגמה, החוזה צריך לבצע פעולה כלשהי, נניח, לאחסן את הכתובת של המתקשר. למרות שהחוזה צריך לבצע אחסון רק אם המתקשר מאומת, אנחנו צריכים להיות בטוחים שאף אחד לא יכול להשתמש בכתובת שלו ללא רשות. כדי לאחזר את המתקשר האותנטי, עלינו ליצור הודעה כלשהי, לחתום עליה ולפרק אותה במסגרת החוזה.
אתה יכול למצוא את פתרון סטנדרטי בתיעוד Solidity (לדוגמה, ב0.8.4 - הגרסה היציבה האחרונה ברגע המאמר). המסמכים מציעים לנו את החוזה, שהצריך את הפונקציונליות המובנית הבאה: הפקת הודעות, פיצול חתימה וקוד הרכבה כדי לאחזר את החותם. הדוגמה מציגה את כל השיטות הדרושות והיא די פשוטה, אם כי יש לה שני חסרונות: היא חסרה אוניברסליות, ואין דוגמה טובה לבדיקת פתרונות. זו הסיבה שאני מספק את הגרסה שלי לקוד ו(המטרה בפועל) - אסטרטגיית הבדיקה של החוזה.
בטח, אתה יכול להשתמש ספריית OpenZeppelin הסטנדרטית עבור פעולות ה-ECDSA, אבל תתמודד שוב עם אותן בעיות - חוסר גמישות וגישות בדיקה. אז בואו נצלול לתוך הדוגמה שלי ללוגיקה מבוססת חתימות. אתה יכול למצוא את השלם דוגמה עובדת ב-GitHub שלי, אבל יש כמה מקומות שאני רוצה להציג במלואם.
קודם כל נכין את ההודעה. כפי שאתה יכול לראות, הוא נוצר משתי כתובות ארנק ארוזות ומגובבות:
קטע הקוד החשוב השני הוא גיבוב ההודעה יחד עם הודעת Ethereum הרגילה:
זה מראה שההודעה נשלחה בתוך רשת Ethereum ויש לה אורך של 32 בתים, שאינו מספר אקראי. לאחר פעולות קודמות, יש לנו את ה-hash, באורך של 32 בתים. חיוני שתהיה פונקציית הגיבוב הנוספת בצורה כזו, ונדון בהנמקה מעט מאוחר יותר.
חלקי קוד אחרים הם די סטנדרטיים. הפונקציה לפיצול החתימה היא כדלקמן:
והנה הפונקציה לאחזר את החותם:
עבור הממשק החיצוני, נשתמש בפונקציה המותאמת, שמקבלת את החתימה והארגומנטים הדרושים, בודקת אם המשתמש כבר רשום, יוצר את ההודעה ומאמת את החתימה:
ראשית, נחקה את ההודעה שצריך לחתום. אנחנו נשתמש ethers.js ספרייה, שהיא (יחד עם web3) הספרייה המשומשת והנוחה ביותר. מכיוון שזו ספריית קוד פתוח, אתה חופשי לחקור הקוד והמסמכים שלו. כמו כן, ספרייה זו נותנת לנו את הממשק המושלם לבניית ההודעה הבאה:
אחד החסרונות של שניהם web3 ו אתרים ספריות היא שאין להן את כל הפונקציות עבור סביבת ה-Ganache המקומית מכיוון ששתי הספריות מכוונות לעבוד עם צמתי Ethererum מלאים. עם זאת, ישנה גישה לבדיקה מקומית באמצעות פונקציונליות של חשבון web3. אם כי עליך ליצור חשבון נוסף, שיטמיע את פונקציונליות הזמר ויספק חיבור לספק ה-web3 הנוכחי:
אז עכשיו יש לנו את ההודעה שנוצרה ונחתמה. אבל, זה לא הכל; נשארו כמה דברים לדבר עליהם. שתי הספריות (web3 ו-ethers) מתחת למכסה המנוע מספקות גיבוב נוסף של ההודעה לפני יצירת החתימה. כמו כן, ההודעה אינה רק hash אלא משולבת עם הודעת Ethereum הסטנדרטית שראינו קודם לכן:
ובגלל זה הוספנו לחוזה את השיטה הנוספת. לכן, אם אתה רוצה להשתמש בהודעות מותאמות אישית, לדלג על hashing נוסף וכו', עליך ליצור גרסה מותאמת אישית של פונקציונליות החתימה. דנו בסיבה לעיל - שתי הספריות הסטנדרטיות מיישמות את הגישה האופיינית לחתימה על ההודעה, אותה ניתן לשנות רק על ידי ביטול הפונקציונליות.
כשלב האחרון, הבה נריץ את הבדיקה ונבדוק אם היא פועלת כהלכה:
בדקנו את יצירת החתימה, ההודעה שנוצרה, אישור החתימה ודחייה. אז זה אוסף די שלם של בדיקות לפונקציונליות האימות.
- חֶשְׁבּוֹן
- פעולה
- נוסף
- אַלגוֹרִיתְם
- תעשיות
- טיעונים
- מאמר
- אוֹתֶנְטִי
- קצת
- מקרים
- בדיקות
- קוד
- חוזה
- קריפטוגרפיה
- נוֹכְחִי
- נתונים
- צעצועי התפתחות
- דיגיטלי
- זהות דיגיטלית
- מסמכים
- סביבה
- ethereum
- רשת אתרנט
- פָּנִים
- ראשון
- גמישות
- להתמקד
- טופס
- חופשי
- מלא
- פונקציה
- טוב
- שירים
- has has
- HTTPS
- ia
- זהות
- מידע
- IP
- IT
- מפתח
- האחרון
- סִפְרִיָה
- מקומי
- בינוני
- רשת
- צמתים
- הַצָעָה
- המיוחדות שלנו
- באינטרנט
- לפתוח
- קוד פתוח
- תפעול
- פְּרָטִי
- מפתח פרטי
- פרויקטים
- ציבורי
- מפתח ציבורי
- סקירה
- הפעלה
- סט
- פָּשׁוּט
- So
- מוּצָקוּת
- לפצל
- אחסון
- חנות
- אִסטרָטֶגִיָה
- מערכת
- מבחן
- בדיקות
- בדיקות
- המקור
- us
- אימות
- ארנק
- ויקיפדיה
- בתוך
- תיק עבודות
- עובד