آموزش solidity : برنامه‌‌ نویسی اتریوم (Ethereum)

این مقاله یک راهنمای گام به گام برای شما در یادگیری زبان solidity است. بنیاد اتریوم از روزهای اول پروژه در اواخر 2013 و اوایل 2014 دنیای بلاکچین‌‌ را لرزاند. پس از آنکه اولین حباب بزرگ بیت کوین از 1000 دلار هم عبور کرد و توجه همگان را به خود جلب کرد، اتریوم در واقع بیت کوین 2 و آنچه را جنبش بلاکچین‌‌ می‌‌پنداشتیم، آغاز کرد. اتریوم پروژه‌‌ی بلاکچین‌‌ با رمز ارز اتر (شبیه بیت کوین) است، اما اتریوم ویژگی یک زبان ماشین مجازی تورینگ و قابلیت پردازش را در گره‌‌های خود اضافه کرده است.

1 661

آموزش solidity

ماشین مجازی اتریوم (EVM) به گره‌‌های اتریوم اجازه می‌‌دهد تا داده‌‌های تبادلی برای پرداخت را ذخیره و پردازش کنند، به رویدادهای دنیای واقعی پاسخ دهند و امکان وجود فرصت‌‌های جدید برای پشتیبانی اپلیکیشن‌‌های درون زنجیره را فراهم کنند که پیش از این هیچ‌‌گاه برای توسعه‌‌دهندگان و کاربران دنیای واقعی ممکن نبود. من شانس این را داشتم که در اوایل سال 2014 در سوییس باشم و به واحد اتریوم آنجا سری بزنم و با تعدادی از بنیان‌‌گذاران اتریوم پیش از فروش توکن اتر ملاقات کنم.

من از میهای آلیسی (Mihai Alisie) پرسیدم که قرارداد هوشمند اتریوم چیست و او پاسخ داد:

قراردادهای هوشمند روشی برای تمام مردم جهان است تا با آن با یکدیگر به کسب‌‌وکار بپردازند، حتی اگر به یک زبان صبحت نکنند و ارزشان هم یکی نباشد.

خب در واقع این همان چشم‌‌اندازی بود که با آن شروع کردم، ایده‌‌ای که می‌‌توانیم با آن قوانین یک قرارداد تجاری را به شکل برنامه‌‌ریزی‌‌شده به زبان ماشینی تعریف کنیم تا افراد را گرد هم آورده و به آنان امکان انجام تجارت به شکلی قابل‌‌اعتماد، امن و اتوماتیک بدهیم.

خود زبان solidity ابزاری است که از آن برای تولید کدهای ماشینی استفاده می‌‌کنیم که می‌‌توانند روی EVM اجرا شوند. solidity زبانی دارای کامپایلر است که کدهای سطح بالای قابل خواندن توسط انسان را گرفته و آنان را به دستورات کوتاهی مانند «داده‌‌ها را در یک دفتر ثبت قرار بده»، «داده‌‌ها را از دو دفتر ثبت اضافه کن»، «به دستورالعمل واقع در نقطه حافظه xxxxx برگرد» تبدیل می‌‌کند که بنیان هر برنامه‌‌ی ریزپردازنده‌‌ای را شکل می‌‌دهند.

پس زبان solidity تنها یکی از چندین زبانی است که می‌‌تواند به بایت‌‌کدهای solidity که خود زبان دیگری است و همان کار را انجام داده و سرپنت نامیده می‌‌شود کامپایل می‌‌کند. هر زبانی می‌‌تواند چندین ابزار کامپایل داشته باشد اما همه یک کار را انجام می‌‌دهند و آن تولید بایت‌‌کد ماشینی EVM برای اجرا در گره‌‌های اتریوم جهت پرداخت است.

آموزش solidity

خود solidity در برابر سایر زبان‌‌های برنامه‌‌نویسی یک زبان بسیار ساده است.

این درواقع یک زبان عمداً کوتاه‌‌شده و ساده نوشته شده است که به نحوی شبیه به ECMAScript (جاوااسکریپت) دارد. نکاتی کلیدی از سند منطق طراحی اتریوم هست که باید به یاد بیاوریم، از جمله اینکه ما داریم با یک مدل پشته و حافظه با حجم واژه 32 بیتی کار می‌‌کنیم، EVM دسترسی به پشته برنامه را که کپیک فضای ثبتی است و در آن توانایی چسباندن آدرس‌‌های حافظه را داریم می‌‌دهد. هدف این کار ضد loop کردن برنامه است که یک حافظه موقت و فضای ذخیره‌‌ دائمی است و در بلاکچین‌‌ دائمی نوشته شده است و مهم‌‌تر از همه، EVM خواهان قعطیت کامل در قراردادهای هوشمند است.

الزام برای قطعیت دلیلی برای ندیدن تابع random() توسط شما در زبان solidity است. وقتی یک بلاک اتریوم استخراج می‌‌شود، استقرار و تابع‌‌های قرارداد هوشمند در آن بلاک روی گرهی که بلاک را استخراج کرده است اجرا می‌‌شوند و وضعیت جدید به هر فضای ذخیره و تراکنش تغییر پیدا می‌‌کند که در آن قرارداد هوشمند در گره استخراج‌‌کننده رخ می‌‌دهد. سپس بلاک جدید در همه گره‌‌های دیگر منتشر می‌‌شود و هر گره سعی می‌‌کند به طور مستقل بلاک را تایید کند که شامل انجام همین تغییرات در نسخه محلی بلاکچین‌‌شان است. در اینجاست که اگر قرارداد هوشمند بدون قعطیت عمل کند شکست خواهد خورد. اگر گره‌‌‌‌های دیگر نتوانند درباره وضعیت بلاکچین‌‌ پس از بلاک جدید به اجماع برسند و قراردادهای آن اجرایی شود، شبکه اسماً دچار سکته می‌‌شود.

به همین دلیل است که قراردادهای هوشمند اتریوم (و قراردادهای هوشمند در هر سیستم بلاکچینی) باید با قطعیت عمل کنند: به طوری که شبکه گره‌‌ها بتواند همیشه درباره بلاک جدید ورودی اجماع را تایید و حفظ کند تا کار تداوم پیدا کند.

محدودیت دیگری که در قراردادهای هوشمند EVM وجود دارد ناتوانی آن برای دسترسی به داده‌‌های خارج از حافظه و ذخیره و همچیم ناتوانی برای جستجوی منابع بیرونی مانند یک JQuery است. ما به کارکردهای کتابخانه‌‌ای زیادی مانند تحلیل ساختارهای JSON یا انجام محاسبات نقطه شناور دسترسی نداریم و انجام این امور روتین یا ذخیره زیاد داده در خود بلاکچین‌‌ اتریوم هزینه‌‌بر است.

وقتی قرارداد هوشمندی را می‌‌طلبید که کار تغییر وضعیت یا رایانش را انجام می‌‌دهد (هر کاری غیر از خواندن از روی حافظه)، به ازای کاری که توسط قرارداد هوشمند انجام شده است متحمل هزینه سوخت می‌‌شوید و این هزینه سوخت به میزان کار رایانشی مرد نیاز برای اجرا کارکرد شما بستگی دارد. این نوعی سیستم ریزپرداخت برای ریزتراکنش است که در آن می‌‌توانید انتظار پرداخت هزینه سوخت برای یک سری امور رایانشی را داشته باشید.

خود هزینه سوخت عموما ثابت باقی می‌‌ماند، یعنی وقتی اتر در بازارهای جهانی بالا برود، قیمت سوخت باید پایین بیاید. بنابراین وقتی تابعی را در قرارداد هوشمند اجرا می‌‌کنید، می‌‌توانید برآوردی از میزان سوخت پرداختی دریافت کنید، اما باید قیمتی که مایل به پرداخت هستید را هم تعیین کنید و گره استخراج هم می‌‌تواند تصمیم بگیرد که آیا این مبلغ برای انتخاب و انجام آن قرارداد هوشمند در بلاک بعدی خوب است یا خیر.

قراردادهای هوشمند آدرس خود را دارند که از آن می‌‌توانند اتر دریافت و ارسال کنند. قراردادهای هوشمند می‌‌توانند ایجاد کننده تابع را به شکل قابل‌‌تاییدی ردگیری کنند، بدین ترتیب می‌‌تواند بفهمد که آیا یکی از تابع‌‌های آن توسط یکی از مالکین ممتاز یا حساب مدیر فراخوانده شده است و طبق تابع‌‌های مدیریتی عمل می‌‌کنند. آنان توانایی خواندن داده از بلاکچین‌‌ اتریوم را دارند و به اطلاعات موجد در بلاک‌‌های قدیمی‌‌تر دسترسی دارند. اما آیا قراردادهای هوشمند قفل‌‌شده در دنیای قاطع کوچک خود تنها می‌‌توانند از داده‌‌های ذخیره شده در خود بلاکچین‌‌ اتریوم مطلع شوند؟

نه اصلا! اینجاست که اوراکل‌‌ها وارد میدان می‌‌شوند. ما می‌‌توانیم با اوراکل تماس بگیریم که به ما چیز قابل اعتمادی درباره دنیای خارج بگوید و بر حسب آن داده‌‌های درون قرارداد هوشمند عمل کنیم. نکته کلیدی این است که اگرچه خود رویدادهای دنیای واقعی قاطع نیستند، اوراکل می‌‌تواند همیشه برای پاسخ دادن به درخواست همه گره‌‌ها درباره آنچه به شکل قاطع رخ می‌‌دهد اعتماد کرد، به طوری که همه گره‌‌ها می‌‌توانند به اجماع برسند. پس اوراکل قابل‌‌اعتماد روی کاغذ به این شکل کار می‌‌کند: یک اوراکل داده‌‌‌‌هایی دریافت می‌‌کند (مثلا یک قیمت تیکر درباره قیمت یک سهم در دنیای واقعی) و آن داده را در یک قرارداد هوشمند ساده اوراکل درون فضای ذخیره ثبت می‌‌کند، مانند این:

شرکت‌‌هایی هستند که در اوراکل‌‌های قابل‌‌اعتماد متخصص هستند و سیستم‌‌‌‌هایی را برای واسطه‌‌زدایی از خودشان طراحی می‌‌کنند. اگر نگاهی به اسناد Oraclize بیاندازید به این نقل قول جالب می‌‌رسید:

هدف ما وادار کردن توسعه‌‌دهندگان قراردادهای هوشمند به اعتماد به Oraclize برای داده‌‌های مورد نیازشان نیست. Oraclize می‌‌تواند بدون هیچ پشتیبانی مسئولیتی‌‌ داده‌‌ها را دستکاری کند. به همین دلیل است که Oraclize برای تکمیل این کار پیچیده داده‌‌های درخواست شده با اثبات مسئولیت را برمی‌‌گرداند؛ مثلا اینکه داده از تامین‌‌کننده‌‌ای برسد که توسط قرارداد هوشمند تقاضا شده باشد.

پس می‌‌توانید بخش اسناد اثبات مسئولیت را برای کسب جزییات بیشتر بررسی کنید، اما ایده‌‌ آن این است که حتی وقتی خوره‌‌های تازه‌‌کار اتریوم در آینده گره‌‌های اتریوم خود را راه‌‌اندازی کنند و شروع به همگام‌‌سازی بلاکچین‌‌شان با شبکه بکنند، همه داده‌‌هایی که برای اجرا آن قراردادهای هوشمند مستقل از اوراکل نیاز دارند به شکل امن در زنجیره قراردارد و می‌‌توانند برای همیشه دانلودش کنند. اینکه چه کسی هزینه سوخت انجام کار توسط واراکل را پرداخت می‌‌کند موضوع دیگری است، اما اساسا این هزینه توسط درخواست‌‌کننده داده در یکی از چندین روش ممکن بازپرداخت می‌‌شود. نکته جالب این است که اگرچه ما نمی‌‌توانیم قرارداد هوشمندی بنویسیم که برای گنجاندن تصادفی بودن واقعی شانسی عمل کند، بلکه می‌‌توانیم قرارداد هوشمندی بنویسیم که به نظارت اوراکل بر آن واکنش نشان دهد.

آموزش اصول solidity

پس بیایید با اصول قراردادهای هوشمند نوشته شده به زبان solidity شروع کنیم. بهترین راه برای یادگیری انجام دادن است. می‌‌توانیم از این قطعه کوچک کد در بالا بفهمیم که ما ترکیب اعلام تابع ساده‌‌ و انواع ساده داده مانند unit و string (واحد و رشته) را داریم و در اسناد می‌‌بینیم که متغیرهایی مانند آدرس داریم که شامل موجودی و روش‌‌های انتقال هستند و موجودی را به یک آدرس اتریوم برمی‌‌گردانند و امکان ارسال اتر توسط قرارداد هوشمند به آن آدرس را فراهم می‌‌کنند.

ما آرایه‌‌ها، enumها، اپراتورها و ساختارهای نرخ هش به نام نقشه‌‌برداری (mapping) شما و برخی واحدهای از پیش تعریف‌‌شده و متغیرهای جهانی داریم که شامل چیزهایی مانند ارتفاع بلاک، برچسب زمانی آخرین بلاک و یک هش SHA و تابع‌‌های آدرس/کلید می‌‌شوند. یک تغییر ناگهانی درباره solidity در هنگام کار کردن با آرایه‌‌های چندبعدی است که: شاخص‌‌بندی از بیشتر زبان‌‌ها در طول اعلام به ترتیب برعکس قرار دارد و در سندها هم اینطور آمده است:

یک آرایه با حجم ثابت k و عنصر نو T به‌‌شکل [T[k و آرایه حجم غیرثابت به‌‌شکل [T] نوشته می‌‌شوند. آرایه‌‌ای از 5 آرایه غیرثابت از واحد به شکل[[unit[5] نوشته می‌‌شود (دقت داشته باشید که نشانه‌‌گذاری در مقایسه با زبان‌‌های دیگر برعکس شده است). برای دسترسی به دومین واحد در سومین آرایه دینامیک یا غیرثابت، می‌‌توانید از [x[2][1 استفاده کنید.

بیایید نوعی اپلیکیشن اجتماعی اساسی بسازیم که افراد در آن می‌‌توانند تصاویر و اطلاعاتی درباره خود داشته باشند و در بلاکچین‌‌ ارسال کنند. هر کاربر یک آدرس اتریوم و یک کنترل یا نام کاربری مربوط به آن حساب خواهد داشت. ما داده‌‌های جمعیت‌‌شناختی اساسی هم داریم که شاید مردم به آن وارد نشوند و سپس یک صفحه ساده جستجو داریم که در آن می‌‌توانیم کاربران دیگر را در یک دایرکتوری مبنا جستجو کنیم و تصاویری که در پروفایلشان وارد کرده‌‌اند را ببینیم.

در اینجا تصویری از شمایل رابط کاربری اپلیکیشن غیرمتمرکز قرارداد هوشمند solidity اتریوم با کاربران و تصاویر اضافه‌‌شده را مشاهده می‌‌کنید:

How To Learn Solidity: The Ultimate Ethereum Coding Guide

در اینجا یک عکس خوشگل از خودم و تصویری هم از ساختار کریسال گالیوم آرسنید از دوران دبیرستانم برایتان گذاشته‌‌ام. می‌‌توانید هش‌‌های اسناد SH256 و برچسب زمانی هر تصویر و یک علامت تایید کوچک که نشان‌‌دهنده تطابق داده تصویر پیوست‌‌شده با هش سندی که ساخته شده است را ببینید. پس می‌‌خواهم نحوه ساخت این اپلیکیشن را گام به گام شما نشان دهم و نکات جالبی را برایتان بیاورم و همه نمونه‌‌های لینک و کدی که شاید در آینده به آنان مراجعه کنید را خواهم نوشت.

اولین کاری که باید بکنیم راه‌‌اندازی یک زمینه آزمایشی ترافل است که به من اجازه آزمایش کامپایل کردن قرارداد هوشمندم را می‌‌دهد. کامپایل و به‌‌کارگیری قراردادهای هوشمند شامل تولید تراکنش‌‌های بلند امضاشده است، اما ترافل به من اجازه می‌‌دهد که قرارداد هوشمندم را با استفاده از دستورات ساده کامپایل، استفاده و آزمایش کنم. ابزارهای زیادی وجود دارد که می‌‌توانند این کار را انجام دهند، اما من این ویدیوی آموزشی قرارداد هوشمند solidity را دوست داشتم که از ابزار ترافل استفاده می‌‌کند. من یک پوشه پروژه‌‌های آزمایشی گیت‌‌هاب را دارم که برای این آموزش درست کردم. من با چند دستور ساده راه‌‌اندازی شروع می‌‌کنم:

یک نمونه ساده قرارداد هوشمند solidity

خب من می‌‌خواهم یک قرارداد به نام Geekt.sol در پوشه /Geekt/contracts بسازم که وقتی truffle init را نام‌‌گذاری کردم ساختم. در اینجا جالب‌‌ترین تکه‌‌های کد را می‌‌نویسم. در بالای فایل خطی داریم که نسخه کامپایلر و نحو تعریف اساسی قرارداد هوشمند و تعاریف متغیر را مشخص می‌‌کند.

 

وقتی تابع تغییر وضعیت را به دنیای واقعی فرا می‌‌خوانید، باید مقدار اتری که برای آن پرداخت می‌‌کنید را مشخص کنید اما خوشبخاته می‌‌توانید برآورد هزینه سوخت و قیمت آن را قبل از کار دریافت کنید و اغلب هم خیلی دقیق درمی‌‌آید. استخراج‌‌کنندگان اتریوم تصمیم می‌‌گیرند که آیا به اندازه کافی پرداخت کرده‌‌اید یا نه و تراکنش تغییر وضعیت شما را در بلاک بعدی می‌‌گنجانند، پس در هنگام پیدا شدن بلاک جدید باید منتظر برگشتن آن تابع‌‌ها بمانید. خوانش داده از این شاختارهای ذخیره‌‌‌‌سازی رایگان است و نیازی هم به انتظار کشیدن برای بلاک بعدی ندارید، گره‌‌ها خودشان داده‌‌ها را خوانده و آن‌‌ها را به شما برمی‌‌گردانند.

پس ارائه نقشه کاربری، کار اصلی ذخیره‌‌سازی ماست که امکان ساخت آیتم‌‌های کاربری و جستجوی آنان با آدرس را فراهم می‌‌کند. نقشه‌‌برداری‌‌ها برای ذخیره‌‌ی داده بازگشت سریع آن بسیار بهینه هستند، اما هیچ راه آسانی برای تکرار یک نقشه وجود ندارد، پس می‌‌توانید ببینید که آرایه آدرس userByAddress درست کرده‌‌ام که همه آدرس‌‌های شناخته‌‌شده‌‌ی یک کاربر در سیستم ما، مانند صفحات سفید همه کاربران را نگه می‌‌دارد. من نقشه برداری notarizedImages را برای ارائه امکان ساخت آیتم تصویری در ذخیره و جستجوی آن توسط هش SHA256 داده تصویری را فراهم می‌‌کند و آن شاخص‌‌های notaryHash طول 32 بایتی دارند.

همچنین یک آرایه 32 بایتی ImageByNotaryHash داریم که لیستی از همه notaryHashهاست، همانند یک صفحه سفید که اجازه تکرار همه تصاویری که مستند شده‌‌اند را فراهم می‌‌کند.

این‌‌ها ساختارهای بسیار پایه‌‌ای و نمایانگر آیتم‌‌های ذخیره‌‌سازی هستند، پس ایجاد آنان اتر واقعی می‌‌خواهد و داده‌‌ی آن‌‌ها در واقع در بلاکچین‌‌ اتریوم ذخیره می‌‌شود و تغییر وضعیت متغیرهای درونی آنان هم اتر واقعی می‌‌خواهد. ما در واقع از نقشه‌‌برداری‌‌ها و آرایه‌‌های خارجی برای ردگیری محل قرارگیری این ساختارهای تصویر/کاربر استفاده کردیم. ساختار notarizedImage ما یک URL از تصویر و یک برچسب زمانی را جایی در فضای وب ذخیره می‌‌کند که نشان می‌‌‌‌دهد تصویر ثبت شده است. بخش User ما کاربرانی را ذخیره می‌‌کند: دسته، شهر، ایالت، کشور و آرایه‌‌ای از همه چیزهایی که این کاربر ثبت کرده و به حساب کاربری خود افزوده است را ذخیره می‌‌کند، مانند یک نسخه کوچک کاربر به کاربر از آیتم صفحات سفید imagesByNotaryHash.

این تابع registerNewUser ماست. این دسته، شهر، ایالت، کشور را به عنوان متغیر ورودی می‌‌گیرد و برای نشان دادن موفقیت یا شکست با عبارات درست و نادرست آن را برمی‌‌گرداند. اگر شکست بخورد چه؟ خب ما به کاربران اجازه نمی‌‌دهیم بر دسته یکدیگر چیزی بنویسند، پس مانند یک سیستم دارای حق برای دسته‌‌ها عمل می‌‌کند. اگر کاربری با این دسته‌‌ها وجود داشته باشد، پس باید یک جمله شرطی «اگر» اضافه کنم تا آن را بررسی کند. ما اجازه ساخت نام کاربری بدون دسته را نمی‌‌دهیم. چیزی که به آن توجه می‌‌کنیم thisNewAddress است که تابع را فرامی‌‌خواند. می‌‌توانید ببینید که از تابع msg.sender برای گرفتن آن داده استفاده می‌‌کنیم، این آدرسی است که تراکنش «این تابع را انجام بده» از آن در هنگام فراخوانی تابع قرارداد هوشمند ارسال شده است و برای انجام آن اتر واقعی می‌‌پردازند. پس یک آیتم نقشه‌‌برداری به صورت پیش‌‌فرض خالی است و وقتی تابع را فرامی‌‌خوانیم:

این یک پروژه جدید User در نقشه‌‌برداری User ما ایجاد و دسته را تعیین می‌‌کند. همین اتفاق درباره شهر، ایالت و کشور می‌‌افتد. دقت کنید که ما آدرس جدید کاربر را پیش از برگشت، به صفحه سفید کاربری جهانی userByAddress اضافه می‌‌کنیم.

addImageToUser ما به تابع کاربر کاملا شبیه تابع registerNewUser است. این شما را توسط آدرس ارسالتان از طریق آیتم ویژه msg.sender جستجو کرده و پیش از اینکه سعی کند تصویری برای ورودی کاربر اضافه کند، بررسی می‌‌کند که آیا یک کاربر ثبت شده برای آن آدرس وجود دارد یا نه. ما به کاربران اجازه می‌‌دهیم تا NotaryHash خود را به صفحه سفید تصاویر (در صورتی که وجود نداشته باشد) اضافه کنند تا از مبارزه کاربر بر سر ورودی‌‌های صفحه جهانی جلوگیری شود، اما ما به آنان اجازه می‌‌دهیم تا هر ورودی notaryHash درون صفحه سفید تصاویر خودشان را اضافه یا به‌‌روزرسانی کنند.

در نهایت تابع دسترسی (بالا) به ما اجازه می‌‌دهد تا هر کاربر یا تصویر را خوانده یا لیست کامل صفحات سفید کاربران و تمام تصاویر را بگیریم. دقت داشته باشید که این تابع‌‌ها داده‌‌های ثابتی را برمی‌‌گردانند که اساسا یعنی فقط قابل خواندن هستند (تغییرپذیر نیستند) و برای فراخوانی تابع هم آزادند و می‌‌توانند داد‌‌ها را برگردانند، نیازی به صبر کردن برای تولید بلاک جدید وجود ندارد. ما اساسا تابع را به آرایه‌‌ها/نقشه‌‌برداری‌‌های خودمان فراخوانده و داده‌‌های مربوط را برمی‌‌گردانیم: کاربران طبق آدرس و تصاویر طبق notaryHash.

کامپایل و آزمایش کردن یک قرارداد هوشمند

حالا می‌‌خواهیم قرارداد هوشمندمان را به طور محلی در یک محیط آزمایشی امتحان کنیم. این کار با استفاده از دستورات ساده ترافل آسان است، اما ابتدا به یک گره محلی اتریوم برای آزمایش نیاز داریم. در اینجاست که TestPRC اتریوم وارد می‌‌شود. TestPRC اساسا یک گره جعلی است که وانمود می‌‌کند یک گره است و درست مانند یک گره به ماشین میزبانی‌‌تان پاسخ می‌‌دهد. TestPRC مانند یک گره معمولی اتریوم روی پورت 8545 کار می‌‌کند و توانایی کامپایل قراردادهای هوشمند solidity در کد EVM را داشته و آن کد را هم اجرا می‌‌کند، علاوه بر این پاسخ‌‌ آزمایش را به سرعت دریافت می‌‌کنید و دیگر نیازی به صبر کردن برای شبکه اتریوم جهت یافتن بلاک بعدی ندارید. حالا می‌‌توانید دستورات کامپایل/به‌‌کارگیری آزمایشی ترافل را بر یک گره واقعی اتریوم اجرا کنید، اما به اتر واقعی نیاز دارد و اجرای آن بر روی گره خودتان هم زمان‌‌بر و هم حافظه‌‌بر است. پس دستورات کوتاه نصب را انجام می‌‌دهیم:

این TestPRC را با عبارت رمز ویژه شروع کرده و باید چنین خروجی‌‌ دریافت کنید:

در اینجا با اجرا و تعامل با قراردادهای هوشمند از طریق وب 3 یا ترافل، فعالیت‌‌هایی را در این پنجره با اجرای TestPRC می‌‌بینید. خب ما آماده اجرای تست هستیم. باید فایل /migratons/2_deploy_contracts.js را برای در بر گرفتن نام قرارداد هوشمند تعدیل کنید تا ترافل بداند آن را کامپایل و اجرا کند. ما این دستور را اجرا می‌‌کنیم.

کامپایل ترافل

اگر همه چیز خوب پیش برود پیامی دریافت می‌‌کنید که می‌‌گوید «در حال ذخیره دست‌‌ساخته‌‌هاست» و هیچ پیغام خطایی دریافت نمی‌‌کنید. اگر قراردادتان ارور یا مشکل دیگری داشته باشد، خطای کامپایلری که خواهید دید احتمالا مرموز بوده و تفسیر آن سخت است. اگر خطایی درباره حجم پشته دریافت کنید، احتمالا به این معنی‌‌ست که متغیرهای زیادی به درون تابع ورود و خروج داشته‌‌اند و باید بدانید که طبق قانون حداکثر ورود و خروج متغیرها 16 است. همچنین به یاد داشته باشید که قراردادهای هوشمند solidity نمی‌‌توانند انواع داده شخصی را برگشت دهند، پس باید درمورد آن هم کاری انجام دید و من خود معمولا آرایه‌‌ها و آدرس‌‌های ساختاری دیگر در نقشه‌‌برداری‌‌های درونی خودم را برگشت می‌‌دهم. اگر خطای runtime درباره پشته دریافت کردید، احتمالا بدین معناست که یک عبارت شرطی بد در کدهایتان دارید.

Truffle migrate

این دستور اجرای آزمایشی قرارداد هوشمندتان را در گره TestPRC را انجام می‌‌دهد. خروجی آن به شکل زیر است:

وقتی قرارداد هوشمند ما (به نام Geekt) با موفقیت اجرا شود در بلاکچین‌‌ اتریوم صاحب آدرسی می‌‌شود و در بالا می‌‌بینید که این آدرس 0xe70ff0fa937a25d5dd4172318fa1593baba5a027. در یک شبکه واقعی اتریوم، برای اجرای قرارداد هزینه سوخت می‌‌پردازید و آدرس هیچگاه تغییر نمی‌‌کند. در TestPRC اگر TestPRC را ببندید، همه چیز را فراموش می‌‌کند و به محض اینکه دوباره آن را باز کنید باید قرارداد هوشمند را دوباره اجرا کنید و آدرس متفاوتی برای قرارداد هوشمندتان دریافت خواهید کرد. آدرس قرارداد هوشمند شما جایی‌‌ است که مردم می‌‌توانند تراکنش‌‌ها را با پیام‌‌هایی برای تعامل با آن ارسال کنند تا تراکنش تغییر وضعیت را انجام داد یا تنها داده‌‌های خارج از بلاکچین‌‌ اتریوم را بخوانند. قراردادهای هوشمند می‌‌توانند به طور مستقیم از طریق این آدرس‌‌ها و با پیام با یکدیگر تعامل داشته باشند. قراردادهای هوشمندی که با قراردادهای هوشمند دیگر برای ذخیر‌‌سازی، تغییر یا خواندن داده از طریق این پیام‌‌های بلاکچین‌‌ اتریوم تعامل دارند، به عناون سازمان‌‌های مستقل غیرمتمرکز یا DAO شناخته می‌‌شوند.

خب حالا به بخش بامزه کار رسیده‌‌ایم. ما آماده انجام آزمایشات اولیه و تعامل با قراردادهای هوشمندمان هستیم. ما کنسول ترافل را شروع کرده و در گره TestPRC چند جستار انجام می‌‌دهیم تا مطمئن شویم همه چیز کار می‌‌کند و می‌‌توانیم کاربران و تصاویر را اضافه کرده و به‌‌درستی دریافت کنیم.

منبع: https://blockgeeks.com

شاید از این مطالب هم خوشتان بیاید.

ارسال پاسخ

آدرس ایمیل شما منتشر نخواهد شد.

1 نظر
  1. فاطمه

    سلام
    پست فوق العاده بود
    برای کتابم با ذکر منبع استفاده کردم
    باتشکر