فید قیمتی Chainlink در سالیدیتی در اصل یک نوع اوراکل قیمتی است که در قالب قرارداد هوشمند پیاده سازی می شود. این قراردادها توابع عمومی (public view) ارائه می دهند و قیمت یک دارایی خاص را به دلار آمریکا (USD) باز می گردانند.
نودهای خارج از زنجیره (off-chain nodes) قیمت ها را از منابع مختلف، مانند صرافی ها، جمع آوری می کنند. نودها این داده ها را مستقیما در قرارداد هوشمند وارد می کنند.
به عنوان نمونه، می توانید از قرارداد زیر برای دریافت قیمت ETH/USD استفاده کنید:
https://etherscan.io/address/0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419/advanced#readContract
زمانی که تابع latestAnswer()
را فراخوانی می کنید، قیمت فعلی اتر (Ether) را دریافت می کنید. همچنین با استفاده از تابع decimals()
می توانید تعداد اعشار مورد نیاز برای تفسیر نتیجه را مشخص کنید.
برای نمونه، این اوراکل در زمان نگارش این مطلب، قیمت فعلی اتر را 2053.05552675 دلار گزارش می دهد.
اگر فقط می خواهید با نحوه کار اوراکل های Chainlink آشنا شوید، همین توضیح کافی است. اوراکل قیمتی دقیقا همین نقش را ایفا می کند!
اما اگر قصد دارید در یک پروژه از آن استفاده کنید، باید به جزئیات پیاده سازی توجه کنید. این نکات را در ادامه توضیح می دهیم.
در این مثال از ETH/USD استفاده کردیم. با این حال، Chainlink از قیمت بسیاری دیگر از دارایی ها نیز پشتیبانی می کند.
استفاده از latestAnswer() توصیه نمی شود — به جای آن از latestRoundData() استفاده کنید
تابع latestAnswer()
زمان آخرین به روزرسانی قیمت را نمایش نمی دهد. اگر به روزرسانی قیمت با تاخیر انجام شود، ممکن است قرارداد هوشمند تصمیمات خود را بر اساس قیمت های قدیمی اتخاذ کند.
در کادر سبز زیر، همان قیمتی را می بینید که تابع latestAnswer()
باز می گرداند. در کادر آبی، سیستم زمان آخرین به روزرسانی قیمت را به صورت یک timestamp یونیکس نمایش می دهد.
قراردادهای هوشمند معمولا یک آستانه (threshold) تعیین می کنند. در صورتی که مقدار فیلد updatedAt
به اندازه کافی جدید نباشد، این قراردادها از یک اوراکل جایگزین استفاده می کنند یا انجام تصمیمات حساس را به تعویق می اندازند.
تجمیع قیمت ها (Price Aggregation)
اتکا به یک نود یا منبع داده واحد برای دریافت قیمت ها ریسک بالایی ایجاد می کند. به همین دلیل، فیدهای قیمتی Chainlink از چندین نود تایید شده (whitelisted nodes) برای تامین قیمت ها استفاده می کنند.
در تصویر زیر، تامین کنندگان قیمت فید ETH/USD را مشاهده می کنید.
در یک بازه زمانی مشخص، نودها قیمت هایی با تفاوت جزئی ارائه می دهند. برای مثال، بخش اعشار قیمت بین 26 سنت (ردیف بالا) تا 73 سنت (ردیف پایین) تغییر می کند.
تابع transmit()
نودها قیمت های خارج از زنجیره را از طریق تابع transmit
وارد اکوسیستم قرارداد هوشمند می کنند. تابع transmit() یک لیست مرتب شده از قیمت ها و یک لیست از امضاهای نودها دریافت می کند. اوراکل، میانه (median) این قیمت ها را محاسبه می کند و به عنوان قیمت نهایی گزارش می دهد. در ادامه، خط کد مربوط به این محاسبه را در Etherscan مشاهده می کنید.
معماری قرارداد هوشمند
ممکن است متوجه شده باشید که تابع latestRoundData()
در همان قراردادی که transmit()
در آن قرار دارد، تعریف نشده است. در این فرآیند، سه قرارداد هوشمند نقش دارند:
-
قرارداد فید قیمت (Price Feed Contract)
-
قرارداد تجمیع کننده (Aggregator Contract)
-
قرارداد اعتبارسنج (Validator Contract)
تراکنش به روزرسانی قیمت
در زمان به روزرسانی قیمت، امضاها و قیمت های ارائه شده توسط نودها در قالب یک دسته (batch) به تابع transmit()
در قرارداد aggregator ارسال می شوند. سپس قرارداد aggregator تابع validate
را در قرارداد validator فراخوانی می کند. قرارداد validator قوانین مشخصی برای پذیرش یا رد به روزرسانی قیمت اعمال می کند. اگر این قوانین رعایت نشوند، سیستم به روزرسانی را رد می کند. تصویر زیر ردیابی این نوع تراکنش را در Tenderly نمایش می دهد. کدهای بنفش نشان دهنده فراخوانی های بین قراردادها هستند.
مشاهده قیمت
بهبود کارایی مصرف گس در خواندن اوراکل های قیمتی
مشاهده قیمت نیاز به یک فراخوانی بین قراردادها دارد. برای بهینه سازی مصرف گس، پیشنهاد می شود با استفاده از تراکنش دارای access list، فراخوانی aggregator را از قبل آماده (pre-warm) کنید. این روش می تواند حدود 200 گس صرفه جویی کند. نمونه ای از استفاده از access list همراه با یک اوراکل قیمتی Chainlink در این مخزن (repo) قابل مشاهده است.
فرکانس به روزرسانی قیمت
در پروژه های برنامه نویسی بلاکچین، ارسال مداوم تراکنش های به روزرسانی در هر دقیقه به صرفه نیست. به همین دلیل، Chainlink در دو حالت قیمت را به روز می کند:
-
زمانی که بازه زمانی “heartbeat” به پایان برسد (برای ETH/USD این بازه یک ساعت است)
-
اگر قیمت بیش از 0.5 درصد تغییر کند
تصویر زیر این پارامترها را در داشبورد Chainlink برای ETH/USD نشان می دهد.
ملاحظات امنیتی
بسیاری از مقالات، مشکلات امنیتی قراردادهای هوشمند را در هنگام استفاده نادرست از اوراکل های Chainlink بررسی کرده اند. به همین دلیل، این موارد را در اینجا تکرار نمی کنیم. برای مطالعه کامل این مسائل، پیشنهاد می کنیم مقاله Dacian را بخوانید که این نکات را به طور دقیق فهرست کرده است.
راستی! برای دریافت مطالب جدید در کانال تلگرام یا پیج اینستاگرام سورس باران عضو شوید.
- انتشار: ۱۲ خرداد ۱۴۰۴
دسته بندی موضوعات
- آموزش ارز دیجیتال
- آموزش برنامه نویسی
- آموزش متنی برنامه نویسی
- اطلاعیه و سایر مطالب
- پروژه برنامه نویسی
- دوره های تخصصی برنامه نویسی
- رپورتاژ
- فیلم های آموزشی
- ++C
- ADO.NET
- Adobe Flash
- Ajax
- AngularJS
- apache
- ARM
- Asp.Net
- ASP.NET MVC
- AVR
- Bootstrap
- CCNA
- CCNP
- CMD
- CSS
- Dreameaver
- EntityFramework
- HTML
- IOS
- jquery
- Linq
- Mysql
- Oracle
- PHP
- PHPMyAdmin
- Rational Rose
- silver light
- SQL Server
- Stimulsoft Reports
- Telerik
- UML
- VB.NET&VB6
- WPF
- Xml
- آموزش های پروژه محور
- اتوکد
- الگوریتم تقریبی
- امنیت
- اندروید
- اندروید استودیو
- بک ترک
- بیسیک فور اندروید
- پایتون
- جاوا
- جاوا اسکریپت
- جوملا
- دلفی
- دوره آموزش Go
- دوره های رایگان پیشنهادی
- زامارین
- سئو
- ساخت CMS
- سی شارپ
- شبکه و مجازی سازی
- طراحی الگوریتم
- طراحی بازی
- طراحی وب
- فتوشاپ
- فریم ورک codeigniter
- فلاتر
- کانستراکت
- کریستال ریپورت
- لاراول
- معماری کامپیوتر
- مهندسی اینترنت
- هوش مصنوعی
- یونیتی
- کتاب های آموزشی
- Android
- ASP.NET
- AVR
- LINQ
- php
- Workflow
- اچ تی ام ال
- بانک اطلاعاتی
- برنامه نویسی سوکت
- برنامه نویسی موبایل
- پاسکال
- پایان نامه
- پایتون
- جاوا
- جاوا اسکریپت
- جی کوئری
- داده کاوی
- دلفی
- رباتیک
- سئو
- سایر کتاب ها
- سخت افزار
- سی اس اس
- سی پلاس پلاس
- سی شارپ
- طراحی الگوریتم
- فتوشاپ
- مقاله
- مهندسی نرم افزار
- هک و امنیت
- هوش مصنوعی
- ویژوال بیسیک
- نرم افزار و ابزار برنامه نویسی
- وردپرس