قرارداد اسپات
مقدمه
قرارداد اسپات 1 نقطه ارتباط بین اوراکل و قراردادهای اصلی زرگری برای تعیین قیمت دارایی های دیجیتال در زربان است. قرارداد اسپات قیمت دارایی های دیجیتال شامل ارز وثیقه را به صورت مرتب از منابع قیمتی بلاکچین می گیرد و در بخش ترازنامه مالی به روزرسانی می کند. تا ارزش وثیقه و سایر پارامترهای وابسته محاسبه شوند.
جزئیات فنی
در این قرارداد از دو رابط کاربری
pip
برای محاسبه قیمت و
vat
برای دسترسی به ثبت آن در ترازنامه مالی استفاده می شود.
عمل میکند و تنها متغیر اصلی این قرارداد یک داده از نوع
struct
بنام
Ilk
به صورت
struct Ilk {
   PipLike pip; // Price Feed
   uint256 mat; // Liquidation ratio [ray]
}
است که در آن مقدار
pip
از قرارداد
pip
فراخوانی می شود و مقدار
mat
نسبتی است که در محاسبه قیمت به صورت ذیل استفاده می شود.
مکانیسم و مفاهیم کلیدی
مکانیسم محاسبه قیمت در اسپات به این صورت است که یک کاربر یا پروتکل، تابع poke از قراردادspotter را فراخوانی میکند. این قرارداد تابع  peek از قرارداد pip را فراخوانی میکند تا از مراجع مناسب بلاکچینی قیمت به روز شده را تهیه کند.  پس از محاسبه قیمت، این مقدار را با تابع file به قرارداد vat میفرستد تا قیمت آن دارایی در ترازنامه مالی ثبت شود.  مقدار قیمت دارایی برابر مقدار  val/mat است که در آن val قیمت فراخوانی شده از pip است. 
در این تعاملات از دو رابط کاربری  pip و vat استفاده میشود. برای مدیریت دادهها نیز یک ساختار داده ilk در قرارداد spot وجود دارد که در آن قیمت و نرخ نقدشوندگی وثیقه به ترتیب در مقادیر pip و matمدیریت میشود. 
متغیرهای کلیدی
| متغیر | نوع داده | توضیح | 
|---|---|---|
| vat | Vat | یک ردیف در ترازنامه مالی سیستم | 
| pip | Pip | داده خام قیمت | 
| par | uint256 | واحد عددی برای محاسبه قیمت، معادل یک ray | 
| ilk.mat | uint256 | نسبت لیکویدیشن برای این ilk | 
توابع اصلی و عملکرد
دو تابع اصلی عملکردی این قرارداد سازنده آن و تابع poke هستند که در ادامه توضیح داده میشوند. 
- تابع سازنده
این قرارداد، آدرس قرارداد ترازنامه مالی را می گیرد، مقدار ثابت
parرا مقداردهی کرده و در نهایت مجوز دسترسیliveرا برای اجرای توابع قرارداد اسئات صادر می کند.
توابع اصلی و عملکرد
تابع ()poke
- ورودیها: شناسه طرح صندوق  bytes32 ilk
- عملکرد: این تابع از نوع externalاست و به صورت زیر عمل میکند:
- ابتدا تابع peekبرای طرح با شناسهilkفراخوانی میشود و خروجیهایvalوhasرا مقداردهی میکند که در آنhasیک داده باینری است که اگر در ماژول امنیتی اوراکل خطا وجود داشته باشد مقدار آنfalseاست. فراخوانی تابع بعدی تنها در صورتی اتفاق میافتد که این مقدارtrueباشد.
- مقدارparدر اجرای دستور بعدی رابطه بین زر و یک واحد ارزش در قیمت را تعریف میکند. در این خط کد برای محاسبه قیمت داراییilkمقدارvalبرparتقسیم شده و نتیجه برilk.matتقسیم میشود. و در نتیجه این مقدار در متغیرspotمقداردهی میشود.
- پس از محاسبه spotتابعfileازvatفراخوانی میشود تا قیمت دارایی در ترازنامه مالی به روزرسانی شود.
نکات فنی
- محاسبات در تمام عملیات محاسبات ریاضی توابع این قرارداد سرریز و زیرریزشدنها کنترل می شود.
- پیچیدگی اجرای متدها تمام متدها در زمان ثابت اجرا میشوند.
- امنیت وثیقه تنها کاربران مجاز میتوانند هر متغیری را در این قرارداد بهروز کنند.
ریسکها و خطاهای احتمالی
توسعهدهندگانی که تصمیمی مبنی بر استفاده از قراردادهای پروتکل زرگری دارند، برای استفاده از قرارداد spotter  در توسعه خود به نکات زیر باید توچه داشته باشند. 
خطاهای برنامه نویسی
❌ وجود هرگونه خطا در اسپات منجر به بهروزرسانی نشدن قیمت وثیقهها خواهد شد. در این صورت، سیستم باید یک اسپات جدید را تأیید کند که در این صورت قادر خواهد بود قیمتها را بهروز کند. این مساله موجب اختلال در به روزرسانی قیمتها خواهد شد اما فاجعهبار نیست. زیرا فقط باعث متوقف شدن تمام نوسانات قیمت برای مدت کوتاهی خواهد شد.
❌ هنگامی که
poke
در زمانهای مناسبی فراخوانی نشود، قیمت اسپات  در قرارداد مدیریت صندوقها به روز نخواهد شد. این اتفاق ممکن است به دلایل مختلفی از جمله همکاری مشترک یا توطئه ماینرها اتفاق بیفتد و منجر به نتایج منفی مانند تسویههای نامناسب یا عدم دسترسی به تسویههایی شود که باید امکانپذیر باشند.
1 Spot