@پاتریکالفاسپاتریک کالینز
مدیر عامل و بنیانگذار Alpha Chain | Chainlink DevRel
تصویر اصلی توسط ipopba از Getty Images Pro
دستیابی به داده های خارجی با استحکام یا قرارداد هوشمند می تواند ترسناک باشد هنگامی که برای اولین بار این کار را می کنید. چگونه می توان داده های غیر قطعی را وارد سیستم قطعی کرد؟ و از همه مهمتر ، چگونه می توانید این کار را به روشی غیرمتمرکز ، ایمن و ایمن انجام دهید ، به طوری که dApp شما به قابلیت اعتماد منبع داده وابسته نباشد؟
اینها برخی از سالات مهمی است که مهندسان هنگام ساختن قراردادهای هوشمند از خود می پرسند. بیایید فقط به یک مثال بپردازیم.
دسترسی به داده های مواد غذایی و دارویی خارجی با صلابت
برای مثال ما ، بیایید اطلاعات مربوط به اجرای مواد غذایی (مانند یادآوری) در ایالات متحده را بدست آوریم. این ممکن است برای تأمین قدرت dApp در زمینه تجزیه و تحلیل سلامت ایالات متحده ، ایجاد یک سابقه تاریخی تغییرناپذیر یا حتی شاید شرط بندی استفاده شود. ما می توانیم همه این داده ها را با استفاده از API از وب سایت FDA دریافت کنیم. API راه هایی است که فناوری ها با یکدیگر ارتباط برقرار می کنند و در حال حاضر استانداردی برای واکشی و ارسال داده در وب است که امروزه می شناسید و آنها را دوست دارید.
با زدن پیوند زیر می توانیم یک نمونه تماس از این داده ها را اجرا کنیم. این تعداد فراخوان مواد غذایی برای سال 2015 را برمی گرداند.
https://api.fda.gov/food/enforcement.json؟search=report_date:[2015101+TO+20151231]& حد = 1
بازگشت نمونه ما به این شکل است:
{
"meta": {
"disclaimer": "Do not rely on openFDA to make decisions regarding medical care. While we make every effort to ensure that data is accurate, you should assume all results are unvalidated. We may limit or otherwise restrict your access to the API in line with our Terms of Service.",
"terms": "https://open.fda.gov/terms/",
"license": "https://open.fda.gov/license/",
"last_updated": "2020-11-01",
"results": {
"skip": 0,
"limit": 1,
"total": 9118
}
},
"results": [
{...
}
]
}
ما شی را در بخش “نتایج” تغییر دادیم تا فقط “{…}” باشد زیرا ما فقط به آن شی “کل” نگاه خواهیم کرد.
در اینجا می توانیم ببینیم که 9،118 فراخوان برای سال 2015 وجود دارد و ما می خواهیم این را در قرارداد هوشمند خود بدست آوریم. اگر می خواهید داده های سفارشی تری دریافت کنید ، می توانید با بررسی اسناد FDA نحوه تغییر URL درخواست را برای دریافت داده های مختلف بیاموزید.
متمرکز در مقابل غیر متمرکز
برای این مثال اول ، ما قصد داریم فقط از یک منبع داده (FDA API) و یک اوراکل بلاکچین استفاده کنیم (در یک دقیقه توضیح خواهیم داد که چه چیزی است). برای آن دسته از ما که با قراردادهای هوشمند آشنا هستیم ، می دانیم که همیشه آنها را غیرمتمرکز می خواهیم ، و باید از سخنرانی های غیرمتمرکز استفاده کنیم. برای توسعه قراردادهای هوشمند خود ، شروع متمرکز خوب است ، فقط به یاد داشته باشید که وقتی به سمت تولید می روید ، آن را غیرمتمرکز کنید! ما چگونگی انجام این کار را نیز در پایان این مقاله بررسی خواهیم کرد ، بنابراین نگران نباشید.
کد جامدات ما
عالی ، بیایید بررسی کنیم که قرارداد هوشمند سخت افزاری ساده ما چگونه است.
pragma solidity ^0.6.0;
import "https://raw.githubusercontent.com/smartcontractkit/chainlink/develop/evm-contracts/src/v0.6/ChainlinkClient.sol";
contract FDAConsumer is ChainlinkClient {
uint256 public enforcementActions;
address private oracle;
bytes32 private jobId;
uint256 private fee;
constructor() public {
setPublicChainlinkToken();
oracle = 0x2f90A6D021db21e1B2A077c5a37B3C7E75D15b7e;
jobId = "29fa9aa13bf1468788b7cc4a500a45b8";
fee = 0.1 * 10 ** 18; // 0.1 LINK
}
function requestEnforcementData() public returns (bytes32 requestId)
{
Chainlink.Request memory request = buildChainlinkRequest(jobId, address(this), this.fulfill.selector);
request.add("get", "https://api.fda.gov/food/enforcement.json?search=report_date:[2015101+TO+20151231]&limit=1");
request.add("path", "meta.results.total");
return sendChainlinkRequestTo(oracle, request, fee);
}
function fulfill(bytes32 _requestId, uint256 _enforcementActions) public recordChainlinkFulfillment(_requestId)
{
enforcementActions = _enforcementActions;
}
}
این در واقع کل قرارداد است و ما تعداد اقدامات اجرایی را که در متغیر ʻenforutionActions ذخیره می شود ، بدست خواهیم آورد.
اگر با ریمیکس و ارسال درخواست های Chainlink آشنا هستید ، می توانید همین حالا با کلیک روی این لینک این قرارداد را در Kovan مستقر کنید! اگر آشنایی ندارید ، نگران نباشید ، ما اینجا آن را بررسی خواهیم کرد.
راه اندازی
شروع این قرارداد هوشمند کاملاً اساسی است ، اما ما یک بسته زنجیره لینک وارد می کنیم و قرارداد ما با گفتن اینکه “FDAConsumer ChainlinkClient است” آن را به ارث می برد. این به ما امکان می دهد Chainlink API خود را برقرار کنیم. حالا بیایید مراحل را برای برقراری این تماس طی کنیم. اگر می خواهید یک راهپیمایی مبتدی داشته باشید ، می توانید اسناد Chainlink را بررسی کنید. این مورد نیز از طریق گذرگاه عبور خواهد کرد ، اما اگر گم شدید ، به راحتی به این گذرگاه مراجعه کنید.
1. نوع پاسخ خود را بشناسید
ما می خواهیم یک uint256 را بازگردانیم ، زیرا به دنبال تعداد اقدامات اجرایی شده در سال 2015 هستیم ، بنابراین این تعداد خواهد بود.
اکنون که نوع پاسخ خود را دانستیم ، می توانیم سخنرانی خود را انتخاب کنیم.
2. سخنرانی خود را انتخاب کنید
ما باید یک دستورالعمل Chainlink پیدا کنیم که بتواند یک uint256 را پس از درخواست httpget برگرداند. برای انجام این کار می توانیم به برخی از خدمات لیست گره مانند market.link نگاه کنیم. سپس می توانیم عبارت “get> uint256” را جستجو کنیم تا یک سخنرانی پیدا کنیم که بتواند این مورد را برای ما بسازد.
هر اوراکل لیستی از مشاغلی دارد که می توانند انجام دهند و ما باید این موارد را بدست آوریم:
- آدرس سخنرانی
- شناسه شغلی
- هزینه گره Chainlink
به منظور درخواست از طریق آن oracle. بعداً هنگامی که بخواهید این مرکز غیرمتمرکز را انجام دهید مهم خواهد بود ، زیرا می خواهید داده های بسیاری از خطاب های مستقل را تهیه کنید. در حال حاضر ، ما می توانیم از برخی از سخنرانی های Chainlink در شبکه Kovan استفاده کنیم. ما به سختی این دو مقدار را در مثال خود رمزگذاری کردیم ، آنها به شرح زیر است:
oracle = 0x2f90A6D021db21e1B2A077c5a37B3C7E75D15b7e;
jobId = "29fa9aa13bf1468788b7cc4a500a45b8";
fee = 0.1 * 10 ** 18; // 0.1 LINK
متوجه خواهید شد که متغیر oracle یک آدرس است و jobId یک bytes32 است. این هزینه برای هر گره Chainlink تعیین می شود و “گاز اوراکل” معامله است. این مشابه گاز معامله ای است که به آن عادت کرده اید ، اما برای Oracles ، و به جای پرداخت ETH ، LINK پرداخت می کنید. ما به شما نشان خواهیم داد که چگونه این کار را انجام دهید. همچنین می خواهید روش “setPublicChainlinkToken” را فراخوانی کنید مانند آنچه در مثال کامل انجام می دهیم.
3. درخواست را انجام دهید
همه تماس های Chainlink API از سبک Request و Recieve پیروی می کنند. این بدان معنی است که قرارداد هوشمند ما در 1 معامله درخواستی را ایجاد می کند و گره زنجیره پیوند سپس با داده ها درخواست بازگشت به قرارداد هوشمند ما را ارائه می دهد. این بدان معنی است که ما باید تعریف کنیم:
- یک عملکرد درخواست برای تماس با ما
- یک عملکرد کامل برای خطای زنجیره ای برای بازگشت به عقب
ما درخواست زنجیره اصلی خود را به همین ترتیب ایجاد می کنیم:
function requestEnforcementData() public returns (bytes32 requestId)
{
Chainlink.Request memory request = buildChainlinkRequest(jobId, address(this), this.fulfill.selector);
request.add("get", "https://api.fda.gov/food/enforcement.json?search=report_date:[2015101+TO+20151231]&limit=1");
request.add("path", "meta.results.total");
return sendChainlinkRequestTo(oracle, request, fee);
}
می توانید در اینجا مشاهده کنید که ما URL API را که از وب سایت FDA گرفتیم به پارامتر request.add اضافه می کنیم. ما همچنین فقط تعداد کل اعمال قانون را می خواهیم تا بتوانیم یک uint256 را برگردانیم ، بنابراین “مسیر json” “meta -> results -> total” را طی می کنیم تا نحو شماره وی را بدست آوریم. به یاد داشته باشید که ذخیره اطلاعات در جامدادی گران است ، بنابراین ما نمی خواهیم تعداد زیادی از داده های مورد نیاز را بیرون بیاوریم!
در
buildChainlinkRequest
در بخش ، ما همچنین عملکرد پاسخ Chainlink را با تعریف می کنیم
this.fulfill.selector
، این بدان معنی است که ما باید تابعی را به نام تعریف کنیم
fulfill
.
سپس سرانجام ، در پایین درخواست گره Chainlink را برای انجام ارسال می کنیم. عالی! بیایید اکنون عملکرد برگشت تماس را تعریف کنیم.
4. عملکرد برگشت تماس
عملکرد تماس ما بسیار ساده است:
function fulfill(bytes32 _requestId, uint256 _enforcementActions) public recordChainlinkFulfillment(_requestId)
{
enforcementActions = _enforcementActions;
}
تمام کاری که ما در اینجا انجام می دهیم تنظیم متغیر ʻenforcementActions است تا بتوانیم آن را در قرارداد هوشمند خود مشاهده کنیم. به یاد داشته باشید ، گره Chainlink که مشخص کردیم همان گره ای است که این عملکرد را فراخوانی می کند!
5. قرارداد هوشمند را پیاده کنید
اکنون که همه موارد را تنظیم کردیم ، می توانیم قرارداد هوشمند را به کار گیریم. اگر می خواهید فقط از لینک ریمیکس در اینجا استفاده کنید ، می توانید همه کدهای مورد نیاز ما را داشته باشد و از طریق رمیکس قابل استفاده است. اما برای شروع به 3 مورد نیاز داریم:
- metamask یا کیف پول
- Kovan ETH
- Kovan LINK
می توانید Kovan ETH را با استفاده از شیر ETH و Kovan LINK را با استفاده از شیر LINK تهیه کنید. سپس ، مطمئن شوید که کیف پول web3 یا metamask شما روی شبکه kovan تنظیم شده باشد.
اکنون ، قرارداد را وارد کرده و سپس در شبکه kovan مستقر شوید. اطمینان حاصل کنید که از “Web3 تزریق شده” استفاده کرده اید
پس از استقرار ، شما باید قرارداد را با LINK تأمین کنید. آدرس را با دکمه کوچک کپی کپی کرده و سپس آن را از طریق کیف پول web3 خود به صورت LINK ارسال کنید. 2 Kovan LINK باید بیش از حد خوب باشد!
پس از انجام معامله ، می توانید نسخه را اجرا کنید
requestEnforcementData
تابع. Metamask / کیف پول web3 شما برای تأیید ظاهر می شود.
پس از تأیید ، باید کمی صبر کنید. گره Chainlink اکنون درخواست شما را دارد و منتظر ارسال آن است!
پس از این کار (شاید یک یا دو دقیقه) ، می توانید با زدن دکمه آبی رنگ وضعیت را بررسی کنید تا نتیجه را بررسی کنید.
و خارق العاده! ما در اطلاعات جامع به داده های FDA خارجی دسترسی پیدا کرده ایم!
ادامه دادن
این به ما نشان داد که چگونه می توان به داده های خارجی با جامدادی دسترسی پیدا کرد یا آنها را واکشی کرد ، اما همانطور که صحبت کردیم ، این یک روش متمرکز است. به منظور غیرمتمرکز کردن آن ، ما می خواهیم دو کار انجام دهیم:
- از طریق چندین سخنرانی Chainlink به داده های خارجی دسترسی پیدا کنید
- به چندین منبع داده خارجی دسترسی پیدا کنید
اگر این فرایند را با گره های Chainlink مختلف و API های مختلف تکرار کنید ، ساده ترین راه برای غیرمتمرکز کردن آن است. یا می توانید از شخص دیگری که قبلاً این کار را تنظیم کرده است عقب بروید! تعدادی منبع داده وجود دارد که دسترسی عمومی را به صورت غیرمتمرکز مجاز می دانند. برخی از محبوب ترین اشکال داده ها قیمت ارزهای رمزنگاری شده است و می توانید لیستی از لیست قیمت تغذیه Chainlink را مشاهده کنید.
وارد شدن به کد شما بسیار آسان است ، زیرا فقط چند عملکرد است. می توانید با بررسی مستندات نحوه ادغام خوراک قیمت را بیاموزید.
و همین! اگر موفق شدید ، حتماً با استقرار موفق این داده ها ،patrickalphac را در توییتر برچسب گذاری کنید! به انجمن Chainlink بپیوندید و شروع به ساخت چند قرارداد هوشمند شگفت انگیز کنید!
برچسب ها
حساب رایگان خود را ایجاد کنید تا قفل تجربه خواندن سفارشی خود را باز کنید.