איך בונים מטבע? אתריום וסולידיטי למתכנת המתחיל – כל מה שרציתם לדעת

 


מה זה Solidity ? 

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

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

השפה דומה מאוד לJavaScript, רק עם Types (טיפוסי משתנים לאוביקטים).

בדומה לV8 של JavaScript ולJVM של Java, לאיטריום ישנו הEVM, מכונה וירטואלית אשר ממירה את קוד הסולידיטי לקוד בינארי של 0,1.


הקומפיילר EVM – Ethereum Virtual Machine

זוהי מכונה וירטואלית אשר מקבל כקלט את קוד הSolidity, מקמפלת אותו ומפיצה ל  Ethereum Network.

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

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

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


דוגמא ל"חוזה"

Contract זו מחלקה אשר מייצגת חוזה פשוט, וסביב מחלקה זו הכל סובב.

לדוגמא חוזה שנקרא Math ויש לו מתודת כפל.

 

 


אבטחת מידע – "לכתוב חוזים חכמים זהו דבר פשוט, לשמור אותם מאובטחים זהו דבר מאוד קשה", מפתח ראשי באיטריום.

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

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

בדוגמא זו יש פירצת אבטחה חמורה בגלל השורה msg.header.send אשר מעבירה משתנה ששמו amount.

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

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

והרי, כל העברה באיטריום עולה "עמלה" ושמה Gas Price ובצורה כזו ניתן לרוקן את כל הארנק.

 

 

 

 

 

 


פונקציות פומביות ופרטיות – EXPOSED API

בתמונה למטה ניתן לראות 2 סוגי פונקציות.

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

הפונקציה השניה transferBalance היא internal כלומר פרטית, וניתנת לשימוש רק מתוך החוזה עצמו.

 

 

 

 

 

 

 

 

 


סטדנרט כתיבת ERC20 – API

הממשק למטה ממומש על ידי רוב המטבעות=tokens אשר חיים ברשת האיטריום.

ניתן לחשוב עליו כעל פרוטוקול הWeb HTTP.

דוגמא שממחישה היטב את השימוש בממשק היא באתר https://ethplorer.io/

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

דוגמא נוספת לכך שהסטנדרט ERC20 בא לידי ביטוי היא בEthereEx – בורסה מבוזרת לכל סוגי המטבעות ברשת האיטריום.

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

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

כאן הסיכוי הוא אפסי.

 

 

 

 

 


קישורים שימושיים:


 

 

Related Post