פריסת חוזה ניתן לתכנות

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

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

לפני שמתחילים

כדי להשלים את המדריך הזה, תצטרכו:

  • במסוף Google Cloud , מפעילים את Cloud Shell.

    הפעלת Cloud Shell

  • חשבון משתמש ב-Universal Ledger עם ROLE_CONTRACT_CREATOR. החשבון הזה יהיה הבעלים של החוזה.

  • חשבון משתמש אחד או יותר ב-Universal Ledger עם ההרשאה ROLE_CONTRACT_PARTICIPANT. יכול להיות שזה יהיה אותו חשבון כמו של בעל החוזה.

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

אפשר להקצות תפקידים ב-Universal Ledger לחשבון משתמש כשמנהל החשבון יוצר אותו, בזמן שליחת טרנזקציית CreateAccount, או מאוחר יותר באמצעות טרנזקציית AddRoles אם החשבון כבר קיים. למטרות ניסוי, אפשר גם להשתמש ב-CLI של Universal Ledger כדי לנהל חשבונות.

מגדירים את הסביבה

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

המהדר gculpyc לוקח קוד מקור שנכתב בשפת GCULpy ומפיק קוד בייט עבור Universal Ledger.

מריצים כל אחת מהפקודות הבאות כדי למשוך את תמונת gculpyc Docker, להגדיר כינוי להרצת הקובץ הבינארי ולוודא שהקובץ הבינארי פועל.

docker pull us-docker.pkg.dev/gcul-artifacts/images/client/gculpyc:preview
alias gculpyc="docker run --rm -i --user $(id -u):$(id -g) \
    --volume .:/workspace --workdir /workspace \
    us-docker.pkg.dev/gcul-artifacts/images/client/gculpyc:preview"
gculpyc --help

כתיבת החוזה

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

‫GCULpy הוא קבוצת משנה של Python, ולכן אפשר להמשיך להשתמש בסביבות הפיתוח המשולבות (IDE) המועדפות, יחד עם תהליכי העבודה ושיטות הפיתוח הקיימים.

לדוגמה, הקוד יכול להיראות כך:

import gcul

class Counter(gcul.Contract):
    """Example contract implementing a counter."""

    value: int

    def increment(self) -> None:
        """Increments the counter value by 1."""
        self.value += 1

מעתיקים את קוד הדוגמה הזה ושומרים אותו בקובץ בשם counter.py.

בדיקה מקומית

בעתיד הקרוב, למפתחים תהיה גישה לסביבת סימולציה מקומית. הספרייה מסופקת כחלק ממודול Python‏ gcul, והיא נועדה לספק את הפונקציות הנדרשות כדי לדמות באופן מקורי רשת Universal Ledger בסביבת Python. לכן, תוכלו להריץ חוזים באופן מקומי ולכתוב בדיקות יחידה באמצעות מסגרות הבדיקה המועדפות עליכם, כדי לוודא שהחוזים אמינים ונכונים לפני הפריסה.

לקמפל את החוזה

מבצעים קומפילציה של קוד המקור של החוזה הקודם לתוך קוד בייט באמצעות הפקודה gculpyc הבאה:

gculpyc --source_file counter.py --output_file counter.bin

פריסת החוזה

מפרסים את החוזה ברשת Universal Ledger על ידי שליחת טרנזקציית CreateContract שחתום על ידי חשבון משתמש שמחזיק ב-ROLE_CONTRACT_CREATOR.

אם משתמשים ב-CLI של Universal Ledger, אפשר לעשות זאת על ידי הרצת הפקודה:

ul-cli contracts create \
    --alias counter-contract \
    --sender OWNER_ALIAS \
    counter.bin

מחליפים את מה שכתוב בשדות הבאים:

  • OWNER_ALIAS: הכינוי של חשבון משתמש עם ROLE_CONTRACT_CREATOR.

כשהעסקה תושלם, הפלט של הפקודה הזו יכלול את המזהה של החוזה החדש שפריסתו הושלמה. לדוגמה:

Contract created: 1:CTR:005XvYfiSm3913Jwv4y8HVQucStJ2Ev15Sar6A1kNNX10

הפעלת פונקציה בחוזה

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

אם משתמשים ב-CLI של Universal Ledger, אפשר לעשות זאת על ידי הרצת הפקודה:

ul-cli contracts invoke \
    --alias counter-contract \
    --method-name increment \
    --sender PARTICIPANT_ALIAS

מחליפים את מה שכתוב בשדות הבאים:

  • PARTICIPANT_ALIAS: הכינוי של חשבון משתמש עם ROLE_CONTRACT_PARTICIPANT.

קריאת סטטוס החוזה

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

באמצעות Universal Ledger CLI, אפשר להריץ את הפקודות הבאות:

ul-cli accounts describe --alias counter-contract

הפלט צריך לאשר שערך המונה מוגדר עכשיו כ-1, למשל:

Account: 1:CTR:005XvYfiSm3913Jwv4y8HVQucStJ2Ev15Sar6A1kNNX10
Contract account details:
  Owner: 1:USR:XCL:022uF6cVkTJBaa6pViqTuYqP4455jnRbRc4bWannZGg0b
  Contract fields:
    value: int64_value:1

  Balances:
    None

המאמרים הבאים