הגענו שיעור האחרון בחלק הראשון של קורס סולידיטי , בו תלמדו כיצד להיות מתכנתי בלוקציין כך שתוכלו לכתוב חוזים חכמים מבוססי סולידיטי.
בחלק זה נלמד על שתי פונקציות קצה שיש להם חשיבות לא קטנה והן receive & fallback. במשך הפוסט אציג את ההבדלים בין שתי פונקציות אלו וכיצד יש להשתמש בהן.
פונקציית fallback
נניח ומישהו , מסיבה כלשהיא, בחר להעביר איתר ישירות לחוזה, כלומר השתמש בכתובת של החוזה והתכוון להעביר איתר תוכלו לממש את הטרנזקציה הזו באמצעות fallback. למשל דוגמה כזו: שימו לב שפונקציות receive & fallback לא מקבלות את המילה function בהתחלה
// SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.9; contract FallbackAndRecieve { constructor() {} event Log(string func, address sender, uint value, bytes data); fallback() external payable { emit Log("fallback", msg.sender, msg.value, msg.data); } }
אפשר לראות פה שבחרנו להגדיר את הפונקציה כpayable ללא הגדרה זו החוזה לא יוכל לקבל תשלום ולכן זה מאד מומלץ לשים הגדרה זו, אלא אם יש לכם רצונות אחרים.
עכשיו ניגש לרמיקס ונשלח טרנזקציה לחוזה עצמו באמצעות כפתור transact המופיע בתוך החוזה בחלק התחתון (צד שמאל בDeployed Contracts):

לאחר שתלחצו על זה הטרנזקצייה תתבצע כל עוד שמתם ערך מספרי בvalue למשל 2 ether:

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

נמשיך להסבר קצר יותר של פונקציית הreceive מכוון שהינן דומות מאד אציג את השוני בין שניהן בהסבר של receive.
פונקציית receive
פונקציית receive דומה מאד לfallback ולמעשה גם אם יהיה לכם פונקציית receive יכול להיות שעדיין תצטרכו את ל fallback מכוון ש receive תרוץ רק כאשר calldata יהיה ריק. אבל במידה ואין פונקציית receive אז עדיין תשלח פונקציית fallback . לכן גם בדוגמה שלנו הראשונה נשלחה fallback כי לא הייתה receive אבל אם הייתה למשל בדוגמה הזו ולא נשלח דטה receive כן תרוץ ו fallback לא.
// SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.9; contract FallbackAndRecieve { constructor() {} event Log(string func, address sender, uint value, bytes data); fallback() external payable { emit Log("fallback", msg.sender, msg.value, msg.data); } receive() external payable { emit Log("fallback", msg.sender, msg.value, ""); } }
סיכום שיעור אחרון בחלק הראשון של קורס סולידיטי
אז למדנו עוד משו אלמנטרי והן פונקציות receive & fallback שמגנות יכולות להגן ולהפעיל קוד אם מישהו שלח לחוזה ישירות בקשה עם מידע או ללא מידע וכן לקבל כסף לחוזה במידה ונרצה או אפילו אם בטעות מישו ישלח תשלום דרך החוזה תוכלו לקבלו.
ברכותיי לכל מסיימי חלק ראשון בקורס סולידיטי! עכשיו שיש לנו בסיס והבנה נוכל לגשת לפרויקט ולרשום חוזה אמיתי של חוזה חכם כך שנרוויח פרקטיקה וגם על הדרך נלמד עוד דברים חדשים חלקם בסיסיים וחלקם למתקדמים. (לאורך קורס זה, החוזים שנרשום יהיו בסיסיים ביותר – בקורס ההמשך יהיו פרויקטים מורכבים יותר). בהצלחה 🐊😊