המדריך השלם לפרוטוקול ביטקוין 2

//המדריך השלם לפרוטוקול ביטקוין 2

המדריך השלם לפרוטוקול ביטקוין (חלק 1, חלק 2 וחלק 3) מתאר לעומק את מערכת המטבע, ממש עד המידע הגולמי באופן מובן ומעניין. תוכן זה מכוון לקוראים בעלי ידע בתחום המטבעות הדיגיטליים ו/או קריפטוגרפיה ו/או תכנות, במידה ואתם לא בטוחים הקליקו כאן לכל המאמרים שכדאי לדעת קודם.

הוכחת עבודה Proof of Work

נדמיין שקיים משתמש בשם סמי שמאוד רוצה לבצע הונאה ברשת ביטקוין, הוא בחר לנסות ולבצע את ההונאה הבסיסית והשכיחה ביותר והיא נקראת "בזבוז כפול" (Double Spending) וכשמה כן היא, לנסות ולהשתמש יותר מפעם אחת באותם המטבעות שהרי בסופו של דבר מדובר בקובץ דיגיטלי. מה ימנע ממנו או מאחרים להעתיק אותו שוב ושוב? סמי מצא שהדרך הטובה ביותר לבצע זאת היא ע"י שימוש במערכת מחשוב בעלת כוח משמעותי ביחס לקיים ברשת המטבע. ניסיון ההונאה מתבצע באופן הבא:

סמי :הודעה מספר 679TCpsEznzgvRz – להחסיר ממני 3 מטבעות ולהוסיף אותם לאבי.

סמי:הודעה מספר – 679TCpsEznzgvRz להחסיר ממני 3 מטבעות ולהוסיף אותם לרמי.

סמי:הודעה מספר – 679TCpsEznzgvRz להחסיר ממני 3 מטבעות ולהוסיף אותם לנתי.

ההודעות הנ"ל משודרות מהמערכת מחשב של סמי אל הנמענים ולמעשה לרשת המטבע כולה דרך הצמתים (הצמתים/כורים מתעדכנים בניהם בכל עסקה שנעשית). בשלב זה אנו יודעים שבכדי לאשר עסקה כל אחד מן הנמענים הנ"ל "מבקש" מרשת המטבע לאשר שהכול כשר וחוקי ע"י בדיקה שהרכיבים הרלוונטיים בקוד מולאו כנדרש. זכרו, באחריות רשת המטבע (הקוד/פרוטוקול מהערכת) לאשר שהכול חוקי לכן השלב הראשון הוא בדיקה שכל הפרוטוקולים מולאו כתנאי לכניסתם למאגר זיכרון (שלב לפני כניסה לבלוק). אך כרגע בנקודה זו קיים כשל חמור וסמי מנסה לנצל אותו לטובתו, הכשל הוא שרשת המטבע היא סה"כ המשתמשים בה והכוח של רשת המטבע הוא סה"כ שיתוף כוח החישוב של המשתמשים בה(צמתים/כורים), בדוגמה שלפנינו הנחנו שסמי יצר כוח חישוב כל כך משמעותי שהוא למעשה השתלט על רשת המטבע ולכן בתרחיש מעין זה ביכולתו לאשר עסקאות גם אם לא מולאו התנאים הנדרשים וזו כמובן הונאה שאם תצליח תהפוך כל מטבע לחסר ערך מכיוון שזה ישנה את עקרון הביזור עליו בנויים המטבעות הדיגיטליים לעקרון הריכוזיות ולסמי יהיה הכוח להטות את רשת המטבע לטובתו ולעשות בה כל שימוש שיחפוץ. בנקודה זו (בין היתר) כשלו כל הניסיונות לפני ביטקוין. ובכן האם ביטקוין באמת פתר את הכשל הזה? הבא נבחן זאת, הנמענים בדוגמה שלנו הם משתמשים ישרים שנפלו קורבן לסמי העושה שימוש חוזר באותו הסכום ואין מי שיעצור אותו…בכדי למנוע מסמי שליטה על הרשת ו/או יכולת לבצע הונאת בזבוז כפול ו/או למנוע ממנו ומכורים אחרים לנסות ולעבד רק את הבלוק הנוכחי (בלי קשר מי יצר אותו) בכדי לזכות בתמורה שלו ביטקוין משלב שני רעיונות/רכיבים ההופכים את הניסיונות והיכולות הנ"ל ללא רלוונטיות.

  1. הפיכת תהליך עיבוד העסקאות ליקר ע"י צריכת משאבים יקרים (חומרה, חשמל, תחזוקה וכו') לאורך זמן (זמן ממוצע קבוע לעיבוד).
  2. עידוד ע"י תגמול לכל מי שחפץ לעבד עסקאות (להשתתף בתהליך הכרייה).

בהטמעת רכיבים אלו כבר אין זה משתלם כלכלית לישות אחת לנסות ולחטוף את הרשת ע"י תחרות בכוח החישוב עם הרשת כולה, זה פשוט לא משתלם כלכלית שכן יש צורך להשתמש בכמות אדירה של משאבים לאורך זמן שגם אם ההונאה תצליח היא כנראה לא תכסה את ההוצאות ואם מסיבה מוזרה כלשהיא היא כן תצליח לכסות יהיה עליה להשתדרג באופן שוטף (משמע ייקור התהליך) בכדי להישאר חזקה משאר הרשת אשר כל הזמן מתחזקת בעקבות הצטרפות משתמשים חדשים, בנוסף התהליך תלוי בזמן בכדי להתבצע, משמע עלויות נוספות לניסיון ההונאה יכולת גדולה יותר למשתמשים אחרים לנתר אחר בעיות והונאות. כיום יחס עלות תועלת להונאת 'בזבוז כפול' מעין זו לא משתלם במטבעות מבוססים וותיקים אבל כן במטבעות בתחילת דרכם וחשוב לזכור זאת. אבל מה אם גוף כלשהו כגון מדינה שיחס עלות תועלת לא מטריד אותו בכל זאת ינסה לעשות זאת? ובכן הוא יצטרך לבנות מחשב או מערכת מחשבים (נכון לכתיבת שורות אלו) בעלות דמיונית המוערכת באזור המיליארד דולר (ללא תחזוקה וחשמל) האמורים לייצר כוח חישוב גדול יותר מכלל משתמשי הרשת (כוח החישוב של ביטקוין כיום הוא פי 256 מהיר יותר מכל 500 המחשבים החזקים ביותר בעולם ביחד!), בנוסף דבר ההונאה יתגלה מהר מאוד (לאחר הבלוק השני או לאחר 20 דקות בממוצע[1]). מצד שני משתלם למשתמשים שונים לעסוק באשרור עסקאות למרות ייקור התהליך מפני שהמאמץ המשותף אפקטיבי מבחינת שימוש במשאבים (חומרה, חשמל תחזוקה ולאורך זמן) וביחס משתלם של עלות תועלת, בנוסף ישנם רכיבים שנגיע אליהם בהמשך שמערימים קשיים נוספים והופכים כל ניסיון לרמות בדרך הנ"ל לעוד יותר לא פרקטית (אך נכון לזמן כתיבת שורות אלו תאורטית היא אפשרית).

כשהרקע לרעיון הוכחת העבודה (Proof of Work) והצורך בו פרוס לפנינו ניתן לצלול פנימה ולהרחיב על הפרטים הגורמים לו לעבוד. לצורך כך נחזור לדוגמה שלנו ונוסיף תרחיש שכיח ומציאותי, יותר מעסקה אחת מחכה לאשרור רשת המטבע, למשל:

סמי:הודעה מספר 679TCpsEznzgvRz – להחסיר ממני 3 מטבעות ולהוסיף אותם לאבי.

צחי:הודעה מספר 874TCpsAsnyhvbG – להחסיר ממני 7 מטבעות ולהוסיף אותם לרפי.

נתי:הודעה מספר 25b72af1eyh08fa33 – להחסיר ממני 3 מטבעות ולהוסיף אותם לקטי.

הצמתים (Nodes) והמשתמשים שבניהם נעשית העסקה רואים את ההודעות הנ"ל. כל צומת/כורה מוסיף את ההודעות הללו להודעות אחרות נוספות המחכות (מאגר זיכרון) גם הם לכניסה לתהליך אשרור. למשל, לכורה מסוים יש את שלושת ההודעות הנ"ל בהמתנה לאשרור ואותם הוא בודק בדיקה ראשונית בכדי לוודא שכל הפרוטוקולים לפני כניסה לבלוק מולאו כנדרש, אם ומצא שכל שהכול חוקי הוא מתחיל את תהליך יצירת הבלוק שאותו הוא והכורים האחרים ירצו לפצח (פיצוח משמעו לפתור חידה חישובית-למעשה להפוך את המידע המתומצת לקריא) ולשתף את תוצאת הפיצוח עם שאר משתמשי רשת המטבע (רישום ותיעוד בשרשרת הבלוקים). כאמור, לאחר בניית הבלוק יהיה עליו לפתור חידה חישובית מורכבת, פתרון החידה הוא למעשה פיצוח הבלוק והפיכת המידע המאוחסן בו לשמיש, החידה או יותר נכון פיצוח החידה היא למעשה הוכחת העבודה (Proof of Work) ובלי ביצוע התהליך לא ניתן יהיה לשתף את התוצאה עם שאר משתמשי הרשת ולא יהיה ניתן לקרא את תכולת הבלוק שבנוסף לעסקאות המחכות לעיבוד מכיל גם מטבעות חדשים ועמלות (אם צורפו).

החידה החישובית נעשית בעזרת פונקציית תמצות (SHA-256) על בסיס קבוע (לצורך הדוגמה בלבד) הידוע לכל משתמשי רשת המטבע, לצורך הדוגמה בלבד נניח שההודעה הקבועה היא: !Hello, world נוסיף לה מונה שנקרא לו num. ההודעה כולה תראה כך:

  • בסיס קבוע, ידוע וחלק ממבנה הבלוק: !Hello, world.
  • פונקציית: SHA-256 שלמעשה יוצרת פלט אחד מכל העסקאות (=בלוק) עם קושי מובנה (מספר האפסים בתחילת הפלט).
  • מספר משתנה של הודעות/בדיקות: num (בבלוק רכיב זה הוא Nonce).

הסכמה המתוארת מעל יוצרת תוצאת תמצות (SHA-256) המתחילה במספר מסוים של אפסים (ככל שישנם יותר אפסים בתחילת ההודעה כך יותר קשה לפתור אותה). נוסחה לצורך הדוגמה בלבד:

SHA-256(Hello, world! num) = computational puzzle

סכמה לחידה חישובית לפי 0 הודעות/בדיקות.

SHA-256(Hello, world!0) = 1312af178c253f84028d480a6adc1e25e81caa44c749ec81976192e2ec934c64

סכמה לחידה חישובית לפי 1 הודעות/בדיקות-שימו לב הפלט שונה לגמרי בכל בדיקה.

SHA-256(Hello, world!1) = e9afc424b79e4f6ab42d99c81156d3a17228d6e1eef4139be78e948a9332a7d8

סכמה לחידה חישובית לפי 2 הודעות/בדיקות.

SHA-256(Hello, world!2) = ae37343a357a8297591625e7134cbea22f5928be8ca2a32aa475cf05fd4266b7

הבדיקה שהתחילה מאפס כבר הגיע ל 4248 ועדיין התוצאה המבוקשת לא בנמצא ולכן הפונקציה ממשיכה לרוץ ולחפש את התוצאה שתתחיל במספר גדול של אפסים:

SHA-256(Hello, world!4248) = 6e110d98b388e77e9c6f042ac6b497cec46660deef75a55ebc7cfdf65cc0b965

סכמה לחידה חישובית לפי 4249 הודעות.

SHA-256(Hello, world!4249) = c004190b822f1669cac8dc37e761cb73652e7832fb14565702245cf26ebb9e6

סכמה לחידה חישובית בהרצה מספר 4250 מחזירה את התוצאה הרצויה, מספר המתחיל בכמה אפסים (במקרה זה בארבע אפסים) ותואם את פלט הבלוק וזה יספיק בכדי לפתור חידה חישובית פשוטה, הקושי עולה ככל שישנם יותר אפסים בתחילת המספר/הפלט.

SHA-256(Hello, world!4250) = 0000c3af42fc31103f1fdc0151fa747ff87349a4714df7cc52ea464e12dcd4e9

קושי החידה נוצר ע"י פונקציית SHA-256, קושי זה ניתן להתאמה ביחס לכוח החישוב הזמין ברשת המטבע בכדי לשמור על זמן פיצוח ממוצע אותו קבעו מפתחי המטבע. נניח ונרצה מספר בעל קושי המתחיל ב 10 אפסיםף בכדי לפתור זאת כך נצטרך 1.1 טריליון ניסיונות בקרוב![2] המצריכים כוח חישוב אדיר. כאמור ניתן להתאים את הקושי לפי כוח החישוב הזמין של רשת המטבע, ככל שיש יותר כוח חישוב זמין (כלומר ככל שישנם יותר כורים) החידה תהפוך לקשה יותר ולהפך, שינוי בפועל נעשה באופן אוטומטי בכל 2016 בלוקים שעברו אישור, המטרה היא לשמור על יכולת פיצוח החידה בזמן של 10 דקות בממוצע ברשת ביטקוין.

נחזור לדוגמה, כורה פיצח את החידה והוא מודיע על כך לרשת המטבע (הוא למעשה משדר את הבלוק ותכולתו) ועכשיו על שאר משתמשי המטבע לבדוק את התוצאה ולאשר את נכונותה, שלב זה הוא מהיר מאוד יחסית לתהליך הפיצוח שכן כבר ישנה תשובה ויש "רק" לוודא שהיא נכונה. כאשר תהליך זה מסתיים נעשה עדכון לשרשרת הבלוקים וכל העסקאות שהיו בבלוק שאושר יהיו לעד חלק משרשרת הבלוקים, בלוקים עתידיים יסתמכו על הרישום הזה. התהליך עד כה מאופיין בקושי דינאמי לפיצוח חידה חישובית וכזה המצריך משאבים יקרים בכדי להשיג אבל לאחר מכן לשאר משתמשי הרשת קל לוודא שהפתרון נכון. ניתן להשוואת זאת למשחק סודוקו שאותו קשה לפצח אבל לאחר הפיצוח קל לבדוק שהכול נעשה נכון.

בכדי שרעיון הוכחת העבודה (Proof of Work) יצליח ויהיה חסין מניפולציות חובה ליישם את אופי הביזור ולשמר כוח חישוב כזה שלא יהיה מעשי לנסות ולהאפיל עליו ולכן יש צורך בתמריץ לאותם המשתמשים הלוקחים על עצמם לפתור את החידות ובכך להשקיע משאבים יקרים, חומרה, חשמל, תחזוקה וכו' אחרת לא יהיה להם משתלם לעשות כן. הדרך של מטבע ביטקוין ומטבעות דיגיטליים אחרים להשיג זאת היא ע"י יצירת/הוספת מטבעות חדשים (בכל בלוק) ועמלות העברה הנקבעות ע"י המשתמשים, סה"כ התמורה לפיצוח חידה (למעשה לאשרר עסקאות) חייבת להיות ביחס משתלם של עלות תועלת לעוסקים באשרורם.

עד כאן פרוטוקול ביטקוין חלק שני, בחלק הבא נמשיך לבחון את המערכת ולתאר אותה בפרוטרוט, הקלק כאן בכדי לעבור פרוטוקול ביטקוין חלק שלישי.

הערות

[1] כבר לאחר הבלוק השני שאר הכורים יראו שהבלוקים שלהם לא נכנסים לעיבוד ולאחר עוד כמה בלוקים כבר יהיה ברור שמישהו "חטף את הרשת" כלומר לאחר כשעה לערך הודעה על כך תצא לכלל הרשת.

[2] קושי החידה נקבע על ידי מספר האפסים בתחילת הפלט המונפק מ: SHA-256.

  • בפורמט בינארי לכל ביט ישנו סיכוי של 50% להיות 0, כאשר יש צורך במספר (משתנה N) של ביטים שיהיו אפס הסיכוי לכך הוא: 1/2 בחזקת N או במילים אחרות 2 בחזקת N ניסיונות בממוצע.
  • בכדי לקבל אפס (Hexadecimal) בתחילת הפלט: כל תו ב Hexadecimal הוא למעשה 4 ביטים. בכדי לקבל M ספרות (מספר האפסים שנרצה בתחילת הפלט) : 2 בחזקת (M כפול 4).

אז בכדי לבדוק כמה ניסיונות צריך לעשות בכדי לקבל פלט עם 10 אפסים בתחילתו: 2 בחזקת (10 כפול 4) =  1099511627776 (יותר מטריליון ניסיונות).

2017-12-14T09:50:55+00:00

Leave A Comment

This Is A Custom Widget

This Sliding Bar can be switched on or off in theme options, and can take any widget you throw at it or even fill it with your custom HTML Code. Its perfect for grabbing the attention of your viewers. Choose between 1, 2, 3 or 4 columns, set the background color, widget divider color, activate transparency, a top border or fully disable it on desktop and mobile.

This Is A Custom Widget

This Sliding Bar can be switched on or off in theme options, and can take any widget you throw at it or even fill it with your custom HTML Code. Its perfect for grabbing the attention of your viewers. Choose between 1, 2, 3 or 4 columns, set the background color, widget divider color, activate transparency, a top border or fully disable it on desktop and mobile.