מדריך לאירועים ויומנים בחוזים חכמים של Ethereum

בלוג 1חדשות מפתחיםיזם הסבר על בלוקצ’יין אירועים וכנסים לחץעלונים

הירשם לניוזלטר שלנו.

כתובת דוא”ל

אנו מכבדים את פרטיותך

HomeBlog פיתוח בלוקצ’יין

מדריך לאירועים ויומנים בחוזים חכמים של Ethereum

מבוא טכני לשימוש במקרים לאירועים וביומנים בבלוקצ’יין את’ריום עם קוד לדוגמא מאת ג’וזף צ’או 6 ביוני 2016 הועלה ב -6 ביוני 2016

ConsenSys Signal מדריך לאירועים ויומנים בגיבור חוזים חכמים אתרים

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

אירועים יכולים לבלבל מכיוון שניתן להשתמש בהם בדרכים שונות. אירוע לאחד לא יכול להיראות כמו אירוע עבור אחר. ישנם 3 מקרי שימוש עיקריים לאירועים ויומנים:

  1. ערכי החזרת חוזה חכם עבור ממשק המשתמש
  2. טריגרים אסינכרוניים עם נתונים
  3. צורת אחסון זולה יותר

המינוח בין אירועים ליומנים מהווה מקור נוסף לבלבול וזה יוסבר במקרה השימוש השלישי.

1) ערכי החזרת חוזה חכם עבור ממשק המשתמש

השימוש הפשוט ביותר באירוע הוא העברת ערכי החזרה מחוזים לפרינטה של ​​אפליקציה. לשם המחשה, הנה הבעיה:

חוזה ExampleContract {// כמה משתני מצב … פונקציה foo (int256 _value) מחזירה (int256) {// manipulation state … return _value; }} שפת קוד: JavaScript (javascript)

בהנחה ש- exampleContract הוא מופע של ExampleContract, חזית באמצעות web3.js, יכול להשיג ערך החזר על ידי הדמיה של ביצוע החוזה:

var returnValue = exampleContract.foo.call (2); console.log (returnValue) // 2 שפת קוד: JavaScript (javascript)

עם זאת, כאשר web3.js מגיש את קריאת החוזה כעסקה, היא אינה יכולה להשיג את ערך ההחזר [1]:


var returnValue = exampleContract.foo.sendTransaction (2, {from: web3.eth.coinbase}); console.log (returnValue) // hash עסקאות שפת קוד: JavaScript (javascript)

ערך ההחזרה של שיטת sendTransaction הוא תמיד החשיש של העסקה שנוצרה. עסקאות אינן מחזירות ערך חוזה לממשק היות שעסקאות אינן ממוקשות באופן מיידי ונכללות בבלוקצ’יין.

הפיתרון המומלץ הוא שימוש באירוע, וזו אחת המטרות המיועדות לאירועים.

חוזה ExampleContract {event ReturnValue (כתובת באינדקס _from, int256 _value); פונקציה foo (int256 _value) מחזירה (int256) {ReturnValue (msg.sender, _value); ערך החזרה; }} חזית יכולה אז להשיג את ערך ההחזר: var exampleEvent = exampleContract.ReturnValue ({_ from: web3.eth.coinbase}); exampleEvent.watch (function (err, result) {if (err) {console.log (err) return;} console.log (result.args._value) // בדוק שהתוצאה.args._from היא web3.eth.coinbase ואז // הצג result.args._value בממשק המשתמש והתקשר // exampleEvent.stopWatching ()}) exampleContract.foo.sendTransaction (2, {from: web3.eth.coinbase}) שפת קוד: JavaScript (javascript)

כאשר ממוקש העסקה שמפעילה את foo, יופעל החזרה בתוך השעון. זה מאפשר למעשה לקו הקדמי להשיג ערכי החזר מ foo.

2) טריגר אסינכרוני עם נתונים

ערכי החזרה הם מקרה שימוש מינימלי לאירועים, ואירועים יכולים להיחשב בדרך כלל כמפעילים אסינכרוניים עם נתונים. כאשר חוזה רוצה להפעיל את הקצה הקדמי, החוזה משדר אירוע. מכיוון שה- frontend צופה באירועים, הוא יכול לבצע פעולות, להציג הודעה וכו ‘. דוגמה לכך ניתנת בסעיף הבא (ניתן לעדכן ממשק משתמש כאשר משתמש מבצע הפקדה).

3) צורת אחסון זולה יותר

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

בולי עץ תוכננו להיות סוג של אחסון שעולה פחות גז משמעותית מאחסון חוזים. בולי עץ בעיקרון [2] עולים 8 גז לבייט, ואילו אחסון חוזים עולה 20,000 גז ל -32 בתים. אף כי בולי עץ מציעים חיסכון אדיר בגז, לא ניתן להגיע ליומנים מכל חוזה [3].

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

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

חוזה CryptoExchange {הפקדת אירוע (uint256 באינדקס _שוק, כתובת באינדקס _סנדר, uint256 _amount, uint256 _time); הפקדת פונקציה (uint256 _amount, uint256 _market) מחזירה (int256) {// בצע הפקדה, עדכן את יתרת המשתמש וכו ‘הפקדה (_market, msg.sender, _amount, now); } שפת קוד: JavaScript (javascript)

נניח ואנחנו רוצים לעדכן ממשק משתמש כאשר המשתמש מבצע הפקדות. הנה דוגמה לשימוש באירוע (הפקדה) כטריגר אסינכרוני עם נתונים (_market, msg.sender, _amount, now). נניח כי cryptoExContract הוא מופע של CryptoExchange:

var depositEvent = cryptoExContract.Deposit ({_ שולח: userAddress}); depositEvent.watch (function (err, result) {if (err) {console.log (err) return;} // צרף פרטים של result.args ל- UI}) שפת קוד: JavaScript (javascript)

שיפור היעילות של השגת כל האירועים עבור משתמש היא הסיבה לכך שהפרמטר _סנדר לאירוע באינדקס: הפקדת אירוע (uint256 באינדקס _ שוק, כתובת באינדקס _סנדר, uint256 _ כמות, uint256 _time).

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

var depositEventAll = cryptoExContract.Deposit ({_ שולח: userAddress}, {fromBlock: 0, toBlock: ‘אחרון’}); depositEventAll.watch (function (err, result) {if (err) {console.log (err) return;} // צרף פרטים של result.args ל- UI}) שפת קוד: JavaScript (javascript)

כאשר ממשק המשתמש מוצג יש לקרוא depositEventAll.stopWatching ().

חוץ – פרמטרים באינדקס

ניתן להוסיף לאינדקס עד 3 פרמטרים. לדוגמא, לתקן אסימון מוצע יש: העברת אירוע (כתובת באינדקס _מאז, כתובת באינדקס _ אל, uint256 _value). פירוש הדבר כי ממשק חזית יכול לצפות ביעילות רק בהעברות אסימונים שהם:

  • נשלח על ידי כתובת tokenContract.Transfer ({_ מאת: senderAddress})
  • או התקבל על ידי כתובת tokenContract.Transfer ({_ to: receiverAddress})
  • או נשלח על ידי כתובת לכתובת ספציפית tokenContract.Transfer ({_ מ: senderAddress, _ אל: receiverAddress})

סיכום

שלושה מקרי שימוש הוצגו לאירועים. ראשית, שימוש באירוע כדי פשוט לקבל ערך החזר מפונקציה חוזה המופעלת באמצעות sendTransaction (). שנית, שימוש באירוע כטריגר אסינכרוני עם נתונים, שיכול להודיע ​​לצופה כמו ממשק משתמש. שלישית, שימוש באירוע כדי לכתוב יומנים בבלוקצ’יין כצורת אחסון זולה יותר. מבוא זה הראה כמה מה- ממשקי API לעבודה עם אירועים. יש גישות אחרות לעבודה עם אירועים, יומנים וקבלות ונושאים אלה יכולים להיות מכוסים במאמרים עתידיים.

תודה לאהרון דייויס, וינסנט גריפי ויוסף לובין על המשוב על מאמר זה.

הפניות

[1] web3.js יכול היה לצפות בביצוע העסקה כדי לכלול את הבלוקצ’יין, ואז להשמיע את העסקה מחדש במופע של ה- EVM, כדי לקבל את ערך ההחזר, אך זוהי כמות לוגיקה משמעותית להוסיף ל- web3.js [2] יש עלויות דלק של 375 עבור פעולת LOG, ו -375 גז לנושא, אך כאשר בתים רבים מאוחסנים, עלויות אלה מייצגות חלק לא קטן מהעלות הכוללת של האחסון. [3] הוכחות מרקל ליומנים אפשריות, כך שאם גורם חיצוני מספק חוזה עם הוכחה כזו, חוזה יכול לוודא שהיומן אכן קיים בתוך הבלוקצ’יין.

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

הירשם לניוזלטר למפתחים של ConsenSys

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

כיצד לבנות מוצר מצליח של בלוקצ’יין

כיצד להגדיר ולהפעיל צומת אתריוםוובינר

כיצד להגדיר ולהפעיל צומת אתריום

כיצד לבנות ממשק API משלך של Ethereumוובינר

כיצד לבנות ממשק API משלך של Ethereum

כיצד ליצור אסימון חברתיוובינר

כיצד ליצור אסימון חברתי

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

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

העתיד של נכסים דיגיטליים של פיננסים ו- DeFiוובינר

עתיד האוצר: נכסים דיגיטליים ו- DeFi

Mike Owergreen Administrator
Sorry! The Author has not filled his profile.
follow me
Like this post? Please share to your friends:
Adblock
detector
map