פוסט אחרון לחלק השני של הקורס, כמו כן בהמשך החלקים של קורס זה נמשיך לכתוב בחוזה החכם שלנו וללמוד תוך כדאי כתיבה והעלאה של החוזה לרשת הטסט, בסופו של יום בשביל להיות מתכנת בלוקציין יש לתרגל כמה שיותר ובהתחלה עדיף על חוזים פשוטים, אז תדאגו לfauset בארנק הטסט שלכם ובואו נמשיך לעולמות של ירושות וoverride יכולות אלו מאפשרות לנו גמישות רבה ועבודה עם מספר חוזים, שכן כמעט כל פרויקט ראוי יהיה מורכב מכמה חוזים והשימוש בטכניקות אלו נפוצה וחשובה מאד , למשל אם רוצים לעבוד עם חוזים נוספים או לצייר כמה חוזים הנפרדים ואפילו לספק לאחרים גישה לחוזה שלנו.
ירושות בין חוזים אישיים
נעשה דוגמה פשוטה ולאחר מכן נממש אותה בחוזה שלנו מהשיעורים הקודמים של fundme. אז נניח ויש לנו 2 חוזים:
// SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.9; contract contractOne { function one() public pure returns (uint) { return 1; } } contract contractTwo is contractOne { function two() public pure returns (uint) { return 2; } }
אפשר לראות שבשביל לרשת מחוזה מסוים כל שעלינו לעשות זה להשתמש במילה IS בכדי לחבר בין שתי שמות החוזים. כך למעשה חוזה מספר 2 יורש את התוכן של חוזה מספר 1, במידה ותעשו deploy לחוזה contractTwo תראו שגם תקבלו את הפונקציה one ותוכלו לעשות בה שימוש כך שלמעשה חוזה זה ירש מחוזה האחר.
override
נמשיך עם הדוגמה הפשוטה ונציג את הנושא של override, בשביל זה נצטרך לעשות כמה שינויים בתוך פונקציות החוזה.
// SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.9; contract contractOne { function one() public virtual pure returns (uint) { return 0; } } contract contractTwo is contractOne { function one() public pure override returns (uint) { return 1; } function two() public pure returns (uint) { return 2; } }
בשביל לקבל בירושה וגם לשנות את הפונקציות יהיה עליכם להגדיר כמה הגדרות חדשות, יש להגדיר אילו מבין הפונקציות יועברו ביורשה ויהיו זמינות לשינוי, בעזרת הוספת הגדרה נוספת שהיא virtual. פונקציה שלא תקבל את ההגדרה virtual לא תהיה ברת שינוי בחוזה המקבל בירושה. כמו כן יש להגדיר בחוזה המקבל בירושה את ההגדרה override המתאימה לשם הפונקציה שקיבלה את ההגדרה של virtual. למשל כפי שניתן לראות בדוגמה, חוזה הראשון, פונקציית one בעלת ההגדרה virtual ובחוזה השני יש פונקציה באותה שם (one) עם ההגדרה override וכן למעשה בהרצת פונקציית one של חוזה 2 תקבלו בתשובה 1 ולא 0 כפי שהוגדר בפונקציה הראשונה.
המשך בפרויקט שלנו עם override וירושות
כעת נעשה שימוש בחוזה שלנו! אשתדל כמעט כל פוסט שנתרגל על החוזה הזה, על מנת לקבל קצת פרקטיקה, להיות מתכנת בלוקציין דורש תרגול רב וכן בקורס סולידיטי זה אשתדל לתרגל כמה שרק אפשר, אבל כמובן שמומלץ שתתרגלו בנוסף.
נייצר קובץ נוסף , חוזה נוסף ונקרא לו OnlyOwner.sol
// SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.9; import "./OnlyOwner.sol"; contract FundMe is OnlyOwner { mapping(address => uint256) public funders; // address public owner; // constructor() { // owner = msg.sender; // } function fund() public payable { funders[msg.sender] += msg.value; // require(msg.value >= 1e18, "the minimum to fund is 1 eth"); } function withdraw() public { // require(msg.sender == owner, "you are not the owner"); checkOwner(); payable(msg.sender).transfer(address(this).balance); } }
// SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.9; contract OnlyOwner { address public owner; constructor() { owner = msg.sender; } function checkOwner() internal view { require(owner == msg.sender, "not an owner"); } }
לא רציתי למחוק מהחוזה הקודם כלום רק שמתי ב comment כל מיני שורות לא לרלוונטיות . ואז יצרתי חוזה חדש שיכיל בתוכו כל מיני דברים שקשורים רק לבעלים של החוזה, והעברתי את הבדיקה של checkOwner לפונקציה, והשתמשתי בה בחוזה המקורי. שימו לב שבחוזה המקורי עשיתי import לחוזה על מנת לרשת אותו. וזהו אז השתמשתי בפונקציה הזו בחוזה שלנו והכל מנגן כמו צריך. חשוב לציין שניתן לרשת מחוזים רבים באמצעות פסיקים A is B,C. אפשר גם לרשת חוזה שירש חוזה ולייצר שרשרת של יורשות בין חוזים.
לסיכום קורס סולידיטי – חלק שני – ירושות ו override
אמנם לא השתמשנו בoverride בחוזה שלנו כי עדיין אין לנו פונקציות זהו בשם שנרצה לעשות override. אבל בהמשך הלימודים נתקל בזה ונשתמש בזה. וכן עשינו שימוש בירושות וראינו כמה זה נוח לפצל לתתי חוזים ולרשת מהם וכך ליצור סדר בכתיבה וגם לחסוך כתיבות כפולות במידת הצורך, אתם תראו שימושים רבים באפשרויות אלו.
כל הכבוד למי שהגיע עד כה! נמשיך לשיעור הבא בפרק חדש שיעסוק בכתיבת חוזה מחוץ לרמיקס , כתיבה הIDE שלנו שזה התקדמות משמעותית לעבר פיתוח אפליקציות WEB3.😍