איך אורקלי מחיר ב-DeFi מאגדים ומפרסמים מחירים
כך נאספות תצפיות מחיר, מתי heartbeat וסטיית מחיר מפעילים עדכון, איך בודקים יחידות ונתונים ישנים ומה מגבלות בדיקת רצף ב-L2.
במדריך הזההאורקל מפרסם ערך ייחוס ולא מחיר שניתן לבצע בו עסקה
תקציר קצר
אורקל מחיר מעביר ערך ייחוס חיצוני לחוזה חכם. במודל push נפוץ, כמה תצפיות מחוץ לשרשרת נאספות לדוח חתום, הדוח מתפרסם בשרשרת והפרוטוקול קורא את התשובה האחרונה. סף סטייה ו-heartbeat משפיעים על מועד הפרסום; הצרכן צריך לבדוק גם decimals, יחידות ציטוט, `updatedAt` ובחלק מרשתות L2 את מצב ה-sequencer. הבקרות מפחיתות סיכונים מסוימים, אך אינן מוכיחות שהמחיר נכון, עדכני דיו לכל שימוש או בטוח לכל עסקה.
האורקל מפרסם ערך ייחוס ולא מחיר שניתן לבצע בו עסקה
אורקל מחבר מידע שמחוץ לבלוקצ׳יין לקוד שפועל עליו. פרוטוקול הלוואות עשוי לקרוא פיד כדי להעריך בטוחה, וחוזה נגזרים עשוי להשתמש בייחוס לסליקה או לגבול סיכון. החוזה קורא את הערך שנרשם במצב השרשרת, אך אינו סורק בעצמו כל ספר פקודות חיצוני כדי לקבוע מחיר הוגן.
״מחיר״ יכול לציין צמד נכס ומטבע ציטוט, שער פדיון של פרוטוקול או מדד אחר. אין פירושו אוטומטית שזה המחיר שבו אפשר למכור פוזיציה גדולה. המדריך להשפעת מחיר והחלקה ב-DEX ו-השוואת mark price לעסקה האחרונה עוסקים בהבדלים נוספים. המדריך מתמקד בפידי push מקובלים ב-EVM, ולא בכלל אחיד לכל DeFi.
כך תצפיות הופכות לתשובה על השרשרת
ב-Offchain Reporting של Chainlink, צומתי oracle מחליפים תצפיות מחוץ לשרשרת ומסכימים על דוח. קוורום חותם עליו, משדר מגיש אותו בעסקה, וה-aggregator מאמת את החתימות ומציג תשובה, מזהה סבב וחותמת זמן. תיעוד Offchain Reporting מתאר הצגת חציון התצפיות במבנה המתועד.
החוזה הצרכני בדרך כלל אינו מבצע מחדש את כל האיגוד, אלא קורא latestRoundData() מכתובת ה-proxy של הפיד. ה-aggregator שמאחוריה עשוי להשתנות. בדקו את הרשת והפיד המדויקים ב-מדריך EVM וב-תיעוד ה-API. כמה צמתים אינם מבטיחים מקורות עצמאיים: ייתכן שכולם נשענים על אותן בורסות או ספקים.

Heartbeat וסטייה קובעים תנאים לפרסום עדכון
פידי push רבים משלבים סף סטייה עם heartbeat. שינוי באחוז מוגדר מהערך האחרון שפורסם עשוי להפעיל דוח חדש; heartbeat עשוי לבקש עדכון אחרי זמן מסוים גם בלי שינוי גדול. ב-ספריית Data Feeds העדכנית וב-דף כתובות הפידים מופיעים הפרמטרים לפי נכס, רשת ופיד.
אלה תנאים ייחודיים לפיד, לא הבטחה לעדכון בכל מספר שניות. שינוי קטן אולי לא יחצה את הסף, ודוח שהתבקש עדיין צריך להיאסף, להישלח ולהיכלל בבלוק. לכן heartbeat אינו מבטיח זמן הגעה מדויק או שהמחיר לעולם לא יתיישן. על הפרוטוקול להגדיר גיל מרבי משלו לפי מהירות הנכס והשימוש.
יש לפרש את answer, את ה-decimals ואת יחידת הציטוט
latestRoundData() מחזירה מזהה סבב, answer, את startedAt, את updatedAt ואת answeredInRound; בתיעוד ה-API השדה האחרון מסומן כמיושן. answer הוא מספר שלם בפורמט נקודה קבועה, ולא בהכרח סכום דולרי קריא. קראו את decimals() ואת תיאור הפיד המדויק. אם פיד BTC/USD היפותטי מחזיר 6,725,000,000,000 עם 8 decimals, המחיר הוא 67,250 דולר ל-BTC.
עשרוניות הפיד שונות מעשרוניות האסימון. כמות ERC-20 עשויה להשתמש ב-18 מקומות עשרוניים בעוד תשובת המחיר משתמשת ב-8; יש להתאים כל ערך ליחידותיו לפני כפל. BTC/USD פירושו דולרים לביטקוין ואילו USD/BTC הופך את היחידה. בצמד נגזר יש להתאים את שני הפידים ולחלק בסדר הנכון; דוגמת המרת היחידות מראה BTC/EUR מתוך BTC/USD ו-EUR/USD.
בדיקת נתון ישן היא כלל של היישום
updatedAt מציין מתי הסבב האחרון עודכן. הצרכן יכול להשוות אותו לחותמת הזמן של הבלוק הנוכחי ולדחות תשובה שגילה גדול מהמרבי שהיישום קבע. אפשר לבדוק גם זמן עדכון שאינו אפס, תשובה חיובית לפיד של נכס שמחירו אמור להיות חיובי וגבולות סבירים. גבול הדוק מדי עלול לדחות תנועת שוק תקינה.
נניח שוק הלוואות היפותטי שמקבל ארבע יחידות בטוחה ומשתמש במקדם 75%. התשובה האחרונה היא 200,000,000,000 עם 8 decimals, כלומר 2,000 דולר ליחידה; תקרת ההלוואה היא 4 × $2,000 × 75% = $6,000. אם השוק יורד ל-$1,820, מדובר בירידה של 9%. עם הנחות של סטייה 10% ו-heartbeat של 60 דקות, ייתכן שטרם נדרש דוח חדש; לפי המחיר הנמוך יותר התקרה היא $5,460.
אם היישום דוחה מחיר בן יותר מחמש דקות והסבב בן עשרים דקות, הוא יכול לחסום הלוואה חדשה במקום להשתמש בערך $2,000. הבדיקה אינה מעדכנת את הפיד; היא משנה אילו פעולות מותרות כשהנתון ישן. הלוואה, משיכה, חיסול ותשלום חזרה עשויים לקבל כללים שונים, כי עצירת הכול יכולה להזיק. המספרים והספים בדוגמה מומצאים ואינם הגדרות פיד נוכחיות או המלצה.
בדיקת sequencer ב-L2 מטפלת בסיכון השבתה אחר
ברשתות L2 רבות משתמשים שולחים עסקאות דרך sequencer. בזמן השבתה או חזרה לפעולה העסקאות עלולות להתעכב, פעולות רגילות עלולות להיפסק ופקודות ממתינות עלולות להתבצע אחרי ששוק השתנה. תשובת מחיר שנראית עדכנית אינה מוכיחה שנתיב הביצוע היה זמין או שכל המשתמשים יכלו לפעול יחד.
Chainlink מתעדת פיד נפרד למצב sequencer של L2: answer == 0 פירושו פעיל, ו-answer == 1 פירושו מושבת. startedAt מתעד את מועד שינוי המצב; דוגמת הצרכן בודקת אותו וממתינה לתקופת חסד שהיישום קובע לאחר ההתאוששות לפני קריאת המחיר. בדקו את הכתובת ואת התנהגות הרשת ב-מדריך L2 Sequencer Uptime Feeds. תקופת חסד אינה מבטיחה רענון מחיר או השלמת עסקאות ממתינות.
הבקרות אינן מבטיחות תוצאה נכונה או הוגנת
קוורום, חציון, סטייה, heartbeat, גיל מרבי ומצב sequencer עונים כל אחד על שאלה מוגבלת. הם אינם מבטיחים נזילות, זיהוי נכון של נכס, ספקים עצמאיים או מחיר ביצוע לגודל מסוים. חותמת זמן עדכנית יכולה להתלוות לערך שגוי או שעבר מניפולציה; ערך ישן עשוי להישאר קרוב לשוק שקט.
שום טריגר אינו מונע פער מחיר, עומס רשת או שגיאה בהתאמת יחידות, בחירת צמד, בדיקת גיל או חיסול. הנחיות לבחירת Data Feeds איכותיים ממליצות להעריך נזילות ותלות במקורות ולהיערך לנתונים ישנים, מעוכבים, חסרים או חריגים. נשארים סיכוני חוזה, ממשל, גשר, בטוחות וחיסול. מחיר oracle של stablecoin גם אינו מבטיח פדיון בערך נקוב; ראו מדריך depeg.
יש לעקוב אחר כל מסלול המחיר לפני שמסתמכים עליו
זהו את הרשת, כתובת ה-proxy, צמד הנכסים, מטבע הציטוט, decimals של answer וכתובת החוזה. ודאו שהתיאור תואם לנכס ואל תעתיקו כתובת מרשת אחרת. בדקו את מודל המקורות והיסטוריית עדכונים כשנדרשת השגחה הדוקה יותר. Chainlink מציינת ש-aggregators עשויים להיות שונים בין רשתות ולכן חשוב לבדוק קוד והגדרות.
לאחר מכן עקבו אחר השימוש בתשובה: המרת יחידות, בדיקת updatedAt, גיל מרבי והתגובה לערך לא תקין. ב-L2 בדקו את פיד הזמינות, מועד ההתאוששות, תקופת החסד ועסקאות שעוכבו. בדקו בחוזה האמיתי הן מחיר ישן והן השבתה והתאוששות. להשוואת שדות מחיר היעזרו ב-מדריך mark price מול העסקה האחרונה.
שאלות נפוצות
Q1האם heartbeat מבטיח שהמחיר תמיד צעיר מהמרווח הזה?
לא. זהו טריגר זמן בעיצוב הפיד, ולא הבטחה שהפרסום והכללה בבלוק יתרחשו ברגע מדויק או שהמחיר יתאים לשוק חי. בדקו updatedAt והגדירו מדיניות טריות מתאימה.
Q2האם פיד oracle המבוסס על חציון עדיין יכול לטעות?
כן. חציון יכול לצמצם השפעה של חריגים מסוימים, אך אינו מתקן מקור משותף בעייתי, שוק דל נזילות, צמד שגוי או באג בקוד הצרכן.
Q3האם פיד מצב sequencer של L2 זהה לבדיקת מחיר ישן?
לא. הראשון מדווח על מצב ה-sequencer ועל מועד השינוי; בדיקת הגיל משווה את updatedAt של המחיר לשעה הנוכחית. ייתכן שהיישום צריך את שניהם ואת תקופת החסד.
מקורות וקריאה נוספת
דיווח על בעיה
נכין אימייל עם קישור למאמר הזה. Mark יקבל את הדיווח רק לאחר שתשלחו אותו
בדיקה מהירה
סיימת לקרוא? בדוק את עצמך ב־3 שאלות
שאלה 01
פיד BTC/USD מחזיר `6,725,000,000,000` עם 8 decimals. מהו המחיר המותאם?
בחר תשובה כדי לראות את ההסבר