ביטקוין למתכנתים בפוסט אחד

Published on 11 December 2019 12:00 AM
This post thumbnail

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

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

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

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

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

טוב, תכל'ס, בביטקוין יש מחשבים שמחוברים אחד לשני באינטרנט בצורה שוויונית, אחד לשני. לא כמו אתרים ודפדפנים שם יש היררכיה והשיטה נקראת שרת-לקוח. במקור, לפני שהתחילו לשכלל ולסבך את המערכת, כל מי שהיה רוצה להשתתף היה צריך להוריד את אותה תכנת מחשב ואז היה צריך לחכות הרבה זמן עד שהמחשב שלו היה מסונכרן עם הרשת של ביטקוין. המחשב היה מתחבר למחשבים אחרים ברשת של ביטקוין ומבקש מהם שישלחו לו חלקים מהטבלה הגדולה היחידה. כל מחשב היה מחליט אם יש לו זמן פנוי לעשות 'טובה' למחשב החדש הזה, ושולח לו חלק מהקובץ הכללי.

אני מחליף בחופשיות בין המילה טבלה למילה קובץ, ככה זה, אני לא ממש מדייק בטרמינולוגיה. בכל מקרה, בטח כבר שמעתם שזה לא בדיוק טבלה אחת שמכילה המון רשומות, אלא שרשרת בלוקים, נכון? טוב, אז אפשר לחשוב על זה כעל קבצים קטנים - בלוקים. כל קובץ או בלוק כזה מוגבל בגודלו למגה בייט שזה מיליון תווים בערך. לא גדול במיוחד, קובץ וורד מגיע מהר מאוד לגדלים כאלה. וסרט ממוצע שמורידים בטורנט מתחיל ב 600 מגה-בייט ובקלות עובר את הג'יגה בייט.

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

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

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

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

אז ככה, נניח שלאבי יש 0.5 ביטקוין בחשבון שכתובתו היא "אלף" והוא רוצה להעביר לבני 0.1 ביטקוין כתובת החשבון של בני היא "בית".

נניח גם שהבלוק הוא קובץ טקסט בעברית וזה מה שיש בו:

חתימה של הבלוק הקודם: "דש2לח3עה2ח"
כתובת המחשב החותם: "קוף"
העברה מ: "אלף", ל: "בית", כמות: 0.1
העברה מ: "יוד", ל: "למד", כמות: 0.234
העברה מ: "עין" ל:...
שטות: "23לח4י23לחרכגט98"

החתימה שיוצאת היא נניח: "82חל23ר9שד9" ובתרגום למספר אנושי: 1,236,891 בפועל אם ניקח חתימה אמיתית בביטקוין ונתרגם אותה באמת למספר עשרוני, נקבל מספר בן 77 ספרות. נניח בדוגמה שלנו שזה מספר בן 7 ספרות. החתימה תלויה באופן מוחלט בתוכן של הקובץ ולא ניתן לצפות מראש מה תהיה החתימה אך לא לוקח הרבה זמן לחשב אותה.

החתימה תהיה מספר בין 0 לבין 9,999,999 אבל בתור חנון מחשבים, תרשו לי לכתוב את זה קצת אחרת. המספר יהיה בין 0,000,000 לבין 9,999,999. זה אותו דבר, אפס שווה לאפס מיליון ואפס מאות אלפים ואפס עשרות אלפים ואפס אלפים ואפס מאות ואפס עשרות ואפס. אני סתם מבלבל את המוח. ברור שזה אותו דבר. המחשבים מנסים כל אחד לקבל מספר שספרת המיליונים שבו היא אפס וגם ספרת המאות אלפים היא אפס. כי ככה זה בדוגמה הדמיונית שלנו. אבל כשמפעילים את פונקציית החתימה, לא יודעים מה יתקבל. זה מספר מקרי אבל ממקור וודאי. הסיכוי שיתקבל אפס בספרה הראשונה הוא אחד לעשר, והסיכוי לקבל שני אפסים מובילים הוא אחד למאה. מזל שיש לנו חלק קטן חופשי בקובץ הבלוק שלנו, ה-"שטות". אפשר לשנות אותה קצת ולנסות שוב. זה כמו הטלת קוביות, אם לומדים מספיק פיסיקה, אפשר להגיד שהתוצאה של הטלת הקוביות ידועה מראש אם יודעים בדיוק את תנאי ההתחלה, אבל יותר קל פשוט להטיל את הקוביות עוד פעם ועוד פעם עד שמקבלים שש-שש. אף אדם שפוי לא באמת בנה מכונה בעלת זרוע רובוטית שיודעת להטיל קוביות כך שיתגלגלו על השולחן והתוצאה תמיד תהיה שש-שש.

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

מכיוון שכתובת המחשב החותם היא חלק מהבלוק, לא ניתן להפריד את הנתון הזה משאר הנתונים בבלוק. לכתובת הזו מגיע הפרס על העבודה הקשה, בהתחלה היה זה 50 ביטקוין בתוספת עמלות - סוג של טיפ שהמשתמשים נותנים בפקודות ההעברה שלהם כדי לעקוף בתור בתקופות של עומס, הרי גודל הבלוק מוגבל ולפעמים יש יותר בקשות לרישום פעולות העברת ביטקוין ממה שיכול להיכנס לבלוק אחד. כל 4 שנים בערך, הסכום בביטקוין שמשולם לחשבון של חותם הבלוק נחצה, כל הפך מ 50 ביטקוין לבלוק ל 25 ביטקוין לבלוק וכיום 12.5 ביטקוין לבלוק, ובעוד פחות משנה 6.25 ביטקוין לבלוק.

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

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

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

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

ביטקוין הוא לא שרשרת הבלוקים היחידה, היא הראשונה. יש עוד כאלף עד אלפיים חיקויים מוכרים, הרי הקוד גלוי וזה בסך הכל קבצי טקסט פשוטים. לא צריך להיות מומחה ב שפת C כדי לעשות חיפוש בכל הקבצים ולהחליף את הסימולים של ביטקוין במשהו אחר, להחליף עוד כמה פרטי מפתח, כמו מספר הפורט לתקשורת ויש לכם שרשרת בלוקים מבוססת על האלגוריתם של ביטקוין! הבעיה היא שזה לא יהיה שווה הרבה אם לא יהיה פופולרי ואין לזה שימושים נוספים חוץ מרישום העברת כמויות של ביטקוין מחשבון לחשבון. ככה זה כשכח הרשת והפופולריות של הראשון והותיק ביותר מצליחים.

שרשראות בלוקים חדשות צריכות להציע משהו נוסף על טבלה בודדת שבה מעבירים בעלות על מספרים דימיוניים מחשבון לחשבון. אבל זה כבר נושא לפוסט אחר.