קודקודייל
  • קודקודייל
  • מי אתם קודקודייל?
  • קורסים בחינם
  • צרו קשר
  • בניית אתרים
    • וורדפרס
  • נגישות אתרים
  • כל הקטגוריות
    • אנגולר
    • HTML
    • CSS
    • Javascript
    • Typescript
    • NodeJs
    • בלוקציין
  • קודקודייל
  • מי אתם קודקודייל?
  • קורסים בחינם
  • צרו קשר
  • בניית אתרים
    • וורדפרס
  • נגישות אתרים
  • כל הקטגוריות
    • אנגולר
    • HTML
    • CSS
    • Javascript
    • Typescript
    • NodeJs
    • בלוקציין
קודקודייל
  • קודקודייל
  • מי אתם קודקודייל?
  • קורסים בחינם
  • צרו קשר
  • בניית אתרים
    • וורדפרס
  • נגישות אתרים
  • כל הקטגוריות
    • אנגולר
    • HTML
    • CSS
    • Javascript
    • Typescript
    • NodeJs
    • בלוקציין
  • קודקודייל
  • מי אתם קודקודייל?
  • קורסים בחינם
  • צרו קשר
  • בניית אתרים
    • וורדפרס
  • נגישות אתרים
  • כל הקטגוריות
    • אנגולר
    • HTML
    • CSS
    • Javascript
    • Typescript
    • NodeJs
    • בלוקציין
ראשי ♦ בלוקציין ♦ קורס סולידיטי – חלק שני – כתיבת חוזה חכם

קורס סולידיטי – חלק שני – כתיבת חוזה חכם

וינר יאיר 25 במרץ 2023 אין תגובות

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

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

מה יכלול החוזה החכם שכתוב

החוזה יכיל כמה פונקציות בסיסיות:

  1. יוזר יוכל לתרום כסף לחוזה, לשם כך נצטרך פונקציה fund שככל הנראה תהיה payable
  2. אפשרות משיכה של הכסף הצבור בחוזה (על ידי owner בלבד)

נתחיל עם הפונקציה ראשונה והמרכזית:

// SPDX-License-Identifier: UNLICENSED

pragma solidity ^0.8.9;


contract FundMe {
  
    function fund() public payable {
        require(msg.value >= 1e18, "the minimum to fund is 1 eth");
    }
}

בואו נעצור פה ונלמד משהו חדש ומעניין: require

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

// SPDX-License-Identifier: UNLICENSED

pragma solidity ^0.8.9;


contract FundMe {

    mapping(address => uint256) public funders;
    function fund() public payable {
        funders[msg.sender] += msg.value; 
        require(msg.value >= 1e18, "the minimum to fund is 1 eth");
    }
}

עוד משהו חדש הוא ההגדרה של mapping(address => uint256) למעשה mapping הוא בדומה לjavascript. וכמו שאנחנו יודעים סולידיטי היא שפה שמוגדרת כ static type אז חשוב להגדיר מה יהיה ה key \ value ובשביל לשמור כתובות של תורמים ואת הסכום שתרמו , נגדיר map כך שכתובת תקבל ערך מספרי. וכפי שאפשר לראות אנו שומרים זאת בפונקציה של fund, וכפי שאנחנו למדנו, require עושה ריברט ולכן המידע לא ישמר במערך מסוג map. השאלה שלרוב שואלים, "מה אם הגז ששולם על פעולות אלו שחזרו, האם הגז חוזר גם כן? בגדול התשובה היא כן, הגז חוזר, אבל נעבור על זה בצורה יותר מפורטת בהמשך (כרגע לא נתרכז בנושא של גז ואופטימזציה שלו).

נמשיך ונסיים את החוזה שלנו עם פונקציה נוספת, פונקציה שתאפשר לנו למשוך את הכסף הצבור בחוזה לארנק שנבחר\ או לארנק של בעל החוזה – לכל חוזה יש owner.

// SPDX-License-Identifier: UNLICENSED

pragma solidity ^0.8.9;


contract FundMe {

    mapping(address => uint256) public funders;
    function fund() public payable {
        funders[msg.sender] += msg.value; 
        require(msg.value >= 1e18, "the minimum to fund is 1 eth");
    }
  
  function withdraw() public {
        payable(msg.sender).transfer(address(this).balance);
    }
}

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

הנה מהלך זריז ופשוט להגדיר כתובת owner של החוזה, נשתמש בconstructor:

// SPDX-License-Identifier: UNLICENSED

pragma solidity ^0.8.9;


contract FundMe {

    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");
        payable(msg.sender).transfer(address(this).balance);
    }
}

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

לסיכום – קורס סולידיטי – כתיבת חוזה חכם

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

פוסטים קשורים:

solidiitiy couse-codcodile Payableקורס סולידיטי – חלק ראשון -Payable functions קורס בלוקציין - חוזה חכם עבור NFTקורס בלוקציין – חוזה חכם עבור NFT receive & fallback קורס סולידיטיקורס סולידיטי – חלק ראשון – receive & fallback קורס בלוקציין סולידיטי modifiersקורס סולידיטי – חלק ראשון – modifiers
blockchain smart contract חוזה חכם מתכנת בלוקציין קורס בלוקציין קורס בלוקציין בחינם קורס סולידיטי

אודות המחבר

יאיר וינר להציג את כל הפוסטים של וינר יאיר


« פוסט קודם
פוסט הבא »

השארת תגובה

ביטול

חיפוש באתר
בחירת העורכים
29 בדצמבר 2023 עידן יצחקי

שדה טקסט עשיר עם תמונות

אתם הולכים להיות מופתעים עד כמה HTML יכול להיות חכם ולבצע משהו כל כך מורכב, שאם אנחנו היינו רוצים ליצור

1 באוקטובר 2021 עידן יצחקי

איך למשוך דינמית favicon של אתרים אחרים ב-JS

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

פופולרי
Javascript functions – היכרות עם סוגי פונקציות
Javascript
21 בדצמבר 2024 אין תגובות
Nested routing in angular standalone component
Typescript
15 בנובמבר 2024 תגובה אחת
בחרו לפי תגיות
angular blockchain css ethers express front-end fullstack GQL html javascript next js nextjs nodejs react hooks reactjs solidity webgl אנגולר בלוקציין וורדפרס לימודי אנגולר לימודי וורדפרס לימוד ריאקט מדריך front-end מדריך GQL מדריך אנגולר מדריך וורדפרס מדריך חינם react מדריך ריאקט מפתח בלוק מפתח בלוקציין מתכנת front-end מתכנת בלוקציין מתכנת פרונט סולידיטי קורס front end קורס fullstack קורס nextjs קורס אנגולר קורס בלוקציין קורס בלוקציין בחינם קורס סולידיטי קורס ריאקט קורס תכנות קורס תכנות בחינם
סינון על פי קטגוריות
CSS fullstack HTML IIS Javascript nodeJs SEO Typescript אנגולר בלוקציין בניית אתרים וורדפרס חיפוש עבודה כלים נוספים כללי נגישות קורסים ריאקט תלת מימד תקלות ופתרונות
צור קשר
כל הזכויות שמורות לקודקודייל
ליצירת קשר: @ קודקודייל
גלילה לראש העמוד