فید قیمتی Chainlink در سالیدیتی

فید قیمتی Chainlink در سالیدیتی در اصل یک نوع اوراکل قیمتی است که در قالب قرارداد هوشمند پیاده سازی می شود. این قراردادها توابع عمومی (public view) ارائه می دهند و قیمت یک دارایی خاص را به دلار آمریکا (USD) باز می گردانند.

نودهای خارج از زنجیره (off-chain nodes) قیمت ها را از منابع مختلف، مانند صرافی ها، جمع آوری می کنند. نودها این داده ها را مستقیما در قرارداد هوشمند وارد می کنند.

به عنوان نمونه، می توانید از قرارداد زیر برای دریافت قیمت ETH/USD استفاده کنید:
https://etherscan.io/address/0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419/advanced#readContract

زمانی که تابع latestAnswer() را فراخوانی می کنید، قیمت فعلی اتر (Ether) را دریافت می کنید. همچنین با استفاده از تابع decimals() می توانید تعداد اعشار مورد نیاز برای تفسیر نتیجه را مشخص کنید.

خروجی تابع latestAnswer() در Chainlink

برای نمونه، این اوراکل در زمان نگارش این مطلب، قیمت فعلی اتر را 2053.05552675 دلار گزارش می دهد.

اگر فقط می خواهید با نحوه کار اوراکل های Chainlink آشنا شوید، همین توضیح کافی است. اوراکل قیمتی دقیقا همین نقش را ایفا می کند!

اما اگر قصد دارید در یک پروژه از آن استفاده کنید، باید به جزئیات پیاده سازی توجه کنید. این نکات را در ادامه توضیح می دهیم.

در این مثال از ETH/USD استفاده کردیم. با این حال، Chainlink از قیمت بسیاری دیگر از دارایی ها نیز پشتیبانی می کند.

استفاده از latestAnswer() توصیه نمی شود — به جای آن از latestRoundData() استفاده کنید

تابع latestAnswer() زمان آخرین به روزرسانی قیمت را نمایش نمی دهد. اگر به روزرسانی قیمت با تاخیر انجام شود، ممکن است قرارداد هوشمند تصمیمات خود را بر اساس قیمت های قدیمی اتخاذ کند.

در کادر سبز زیر، همان قیمتی را می بینید که تابع latestAnswer() باز می گرداند. در کادر آبی، سیستم زمان آخرین به روزرسانی قیمت را به صورت یک timestamp یونیکس نمایش می دهد.

خروجی تابع latestRoundData() در Etherscan

قراردادهای هوشمند معمولا یک آستانه (threshold) تعیین می کنند. در صورتی که مقدار فیلد updatedAt به اندازه کافی جدید نباشد، این قراردادها از یک اوراکل جایگزین استفاده می کنند یا انجام تصمیمات حساس را به تعویق می اندازند.

تجمیع قیمت ها (Price Aggregation)

اتکا به یک نود یا منبع داده واحد برای دریافت قیمت ها ریسک بالایی ایجاد می کند. به همین دلیل، فیدهای قیمتی Chainlink از چندین نود تایید شده (whitelisted nodes) برای تامین قیمت ها استفاده می کنند.

در تصویر زیر، تامین کنندگان قیمت فید ETH/USD را مشاهده می کنید.

در یک بازه زمانی مشخص، نودها قیمت هایی با تفاوت جزئی ارائه می دهند. برای مثال، بخش اعشار قیمت بین 26 سنت (ردیف بالا) تا 73 سنت (ردیف پایین) تغییر می کند.

لیست تامین کنندگان فید قیمتی Chainlink

تابع transmit()

نودها قیمت های خارج از زنجیره را از طریق تابع transmit وارد اکوسیستم قرارداد هوشمند می کنند. تابع transmit() یک لیست مرتب شده از قیمت ها و یک لیست از امضاهای نودها دریافت می کند. اوراکل، میانه (median) این قیمت ها را محاسبه می کند و به عنوان قیمت نهایی گزارش می دهد. در ادامه، خط کد مربوط به این محاسبه را در Etherscan مشاهده می کنید.

محاسبه میانه در تابع transmit()

معماری قرارداد هوشمند

ممکن است متوجه شده باشید که تابع latestRoundData() در همان قراردادی که transmit() در آن قرار دارد، تعریف نشده است. در این فرآیند، سه قرارداد هوشمند نقش دارند:

  1. قرارداد فید قیمت (Price Feed Contract)

  2. قرارداد تجمیع کننده (Aggregator Contract)

  3. قرارداد اعتبارسنج (Validator Contract)

تراکنش به روزرسانی قیمت

در زمان به روزرسانی قیمت، امضاها و قیمت های ارائه شده توسط نودها در قالب یک دسته (batch) به تابع transmit() در قرارداد aggregator ارسال می شوند. سپس قرارداد aggregator تابع validate را در قرارداد validator فراخوانی می کند. قرارداد validator قوانین مشخصی برای پذیرش یا رد به روزرسانی قیمت اعمال می کند. اگر این قوانین رعایت نشوند، سیستم به روزرسانی را رد می کند. تصویر زیر ردیابی این نوع تراکنش را در Tenderly نمایش می دهد. کدهای بنفش نشان دهنده فراخوانی های بین قراردادها هستند.

ردیابی Tenderly از تراکنش به روزرسانی قیمت

مشاهده قیمت

آدرس قرارداد aggregator

بهبود کارایی مصرف گس در خواندن اوراکل های قیمتی

مشاهده قیمت نیاز به یک فراخوانی بین قراردادها دارد. برای بهینه سازی مصرف گس، پیشنهاد می شود با استفاده از تراکنش دارای access list، فراخوانی aggregator را از قبل آماده (pre-warm) کنید. این روش می تواند حدود 200 گس صرفه جویی کند. نمونه ای از استفاده از access list همراه با یک اوراکل قیمتی Chainlink در این مخزن (repo) قابل مشاهده است.

فرکانس به روزرسانی قیمت

در پروژه های برنامه نویسی بلاکچین، ارسال مداوم تراکنش های به روزرسانی در هر دقیقه به صرفه نیست. به همین دلیل، Chainlink در دو حالت قیمت را به روز می کند:

  1. زمانی که بازه زمانی “heartbeat” به پایان برسد (برای ETH/USD این بازه یک ساعت است)

  2. اگر قیمت بیش از 0.5 درصد تغییر کند

تصویر زیر این پارامترها را در داشبورد Chainlink برای ETH/USD نشان می دهد.

پارامترهای محرک به روزرسانی قیمت برای ETH/USD

ملاحظات امنیتی

بسیاری از مقالات، مشکلات امنیتی قراردادهای هوشمند را در هنگام استفاده نادرست از اوراکل های Chainlink بررسی کرده اند. به همین دلیل، این موارد را در اینجا تکرار نمی کنیم. برای مطالعه کامل این مسائل، پیشنهاد می کنیم مقاله Dacian را بخوانید که این نکات را به طور دقیق فهرست کرده است.

5/5 - (1 امتیاز)

راستی! برای دریافت مطالب جدید در کانال تلگرام یا پیج اینستاگرام سورس باران عضو شوید.

دوره صفر تا صد آموزش بین المللی لینوکس
  • انتشار: ۱۲ خرداد ۱۴۰۴

دسته بندی موضوعات

آخرین محصولات فروشگاه

مشاهده همه

نظرات

بازخوردهای خود را برای ما ارسال کنید