در مقاله قبل به بررسی زبان برنامهنویسی تزوس (Tezos) یعنی Michelson پرداختیم و در این مقاله قصد داریم توضیحات بیشتری در مورد این زبان برنامهنویسی بدهیم. در این مقاله به بررسی ابزاری خارق العاده میپردازیم که به نوشتن، اشکالزدایی و بررسی کد Michelson بسیار کمک میکند. این ابزار Jupyter notebook with the Michelson Kernel نام دارد. ما در این نوشتار قصد داریم یک قرارداد هوشمند جدید را در Michelson بنویسیم که در آن از رستهای استفاده میشود که پارامتر آن توسط کاربر انتقال داده شده است. شایان ذکر است که مفهوم قرارداد هوشمند را اولین بار اتریوم (Ethereum) وارد فضای ارز دیجیتال کرد.
توصیه میشود که قبل از خواندن این مقاله، حتما بخش اول را مطالعه کنید زیرا در آن به توضیح مفهوم قرارداد هوشمند در زبان برنامهنویسی تزوس پرداخته میشود. در ابتدا به بررسی بهترین ابزاری میپردازیم که برای کدگذاری Michelson موجود است.
Jupyter Notebook ابزاری برجسته برای کدگذاری زبان برنامهنویسی تزوس
تیم بیکینگ بد (Baking Bad) یک کامپایلر (compiler) آنلاین را توسعه داده که کاری بسیار فراتر از کامپایل کردن کد Michelson انجام میدهد. آن به برجسته کردن خط نوشتاری کد، اشکالزدایی و تجسم مرحله به مرحله پشته کمک میکند. میتوانید قبل از اینکه فایل MichelsonTutorial-Demo.ipynb را انتخاب نمایید، این ابزار را از طریق این لینک باز کنید. این فایل به دو قسمت تقسیم میشود:
۱- قسمت اول کد درون خطی (inline code) است که در آن، کل قرارداد هوشمند در داخل یک واحد خاص قرار میگیرد. شما میتوانید با نوشتن RUN %default parameter storage در واحد زیر، آن را کامپایل و راهاندازی کنید.
بعد از راهاندازی این قرارداد هوشمند، توضیحات مفصلی برای هر مرحله موجود است. در نهایت، انبارش جدید شما به انجام میرسد.
۲- کد مرحله به مرحله، میتوانید آموزشها را برای تغییر پشته یکی یکی وارد کنید و تاثیر آنها را بر هر مرحله مورد بررسی قرار دهید.
در هر قرارداد هوشمند از زبان برنامهنویسی تزوس یا همان Michelson، با تعیین پارامتر (parameter) و انبارش شروع میکنید. سپس BEGIN parameter storage را تایپ کنید تا اجرا آغاز شود.
بعد از این مرحله تنظیمات، میتوانید دستورالعملها را یکی یکی وارد کنید و با استفاده از فرمان CMD/CTRL + SHIFT آنها را راهاندازی کنید. در واحد out […]، ارزش حال حاضر در بالای پشته برای شما ارائه میشود.
وقتی که میخواهید اجرای قرارداد هوشمند را خاتمه دهید، باید COMMIT را وارد کنید و آن انبارش جدید را برگشت خواهد داد. البته به شرطی که خطایی در کد شما نباشد. اگر خطایی در هر مرحله از اجرا موجود باشد، شما با پیامی مواجه میشوید و میتوانید آن خطا را فورا اصلاح کنید.
مدیریت پارامترها در یک قرارداد هوشمند تزوس
مدیریت ورودی کاربران در تزوس بسیار آسان است. ما در اینجا با قراردادی کار میکنیم که در jupyter Notebook ارائه شد و در بالا آن را معرفی کردیم. به دنبالهرویی از notebook بپردازید و دستور العملها را یکی یکی انجام دهید تا درک بهتری از ظاهر پشته بعد از هر دستور العمل داشته باشید. شکل کامل این قرارداد هوشمند به صورت زیر است:
اگر به یاد داشته باشید، جفتی شامل پارامتر و انبارش به طور خودکار، بعد از فراخوانی قرارداد در بالای پشته انتقال داده میشود. ما در این جفت میتوانیم به پارامتر دسترسی داشته و از آن استفاده کنیم. نحوه عملکرد آن در ادامه توضیح داده خواهد شد.
ابتدا اجازه دهید که پشته را راهاندازی کنیم:
در این مرحله به یک پشته تازه دسترسی پیدا میکنیم که شامل جفتی از پارامتر و انبارش است. هدف نهایی ما این است که این دو رسته را ادغام کنیم و آنها را برگردانیم.
در مرحله بعد، عنصر بالای پشته را کپی میکنیم زیرا به پارامتر و انبارش در دو عنصر جداگانه پشته نیاز داریم و از این طریق قادر خواهیم بود که آنها را در یک رسته خاص و کنار هم قرار دهیم.
زبان برنامهنویسی تزوس دارای متغیر نیست و ماهیتا غیر قابل تغییر است. عناصر جدید پشته را میتوان با روشهای مختلفی ایجاد کرد. توجه داشته باشید که در هر مرحله از اجرا، شما با عنصر برجسته پشته سر و کار خواهید داشت. در این مرحله، تنها با آن میتوانید کار کنید.
حال اجازه دهید که با اولین عنصر پشته شروع کنیم، و اجازه دهید پارامتر را از جفت بیرون کنیم. ما از دستور العمل CAR استفاده میکنیم که هدف آن تجزیه یک عنصر نوع pair و برگشت دادن سمت چپ این جفت است. بعد از اجرای CAR، رسته World در بالای پشته باقی میماند.
حال ممکن است در شگفت باشید که اگر زبان برنامهنویسی تزوس تنها با اولی سر و کار داشته باشد، چگونه میتوان با عنصر دوم پشته کار کرد؟ خیلی آسان است. با استفاده از دستور العمل SWAP، عنصر دوم را در بالا قرار دهید و دیگری را برای بعد نگه دارید.
وقتی که از دستور العمل SWAP استفاده میکنید، به زبان برنامهنویسی تزوس میگویید که من در حال حاضر به عنصر اول نیاز ندارم و میخواهم بر روی دومی کار کنم. Michelson عنصر اول را به موقعیت دوم میبرد و عنصر دوم را نیز به موقعیت اول میآورد.
حالا جفت دومی که در ابتدا کپی کردیم در بالا قرار دارد، ما میتوانیم از یک CAR معکوس برای دسترسی به بخش صحیح جفت استفاده کنیم.
دستور العمل CDR مانند دستور العمل CAR کار میکند، اما در این حالت، سمت راست جفت دستکاری شده را نگه میدارید. بعد از آن میبینیم که پشته آن از دو عنصر تشکیل شده است. در موقعیت اول رسته Hello موجود است و در موقعیت دوم نیز رسته World موجود است.
حال باید آنها را کنار هم بگذاریم!
در برنامهنویسی کامپیوتر، عملکرد کنار هم قرار دادن دو رسته concatenation نامیده میشود. دستور العمل کنار هم قرار دادن دو رسته در Michelson به CONTACT معروف است. این عملکرد دو رسته حال حاضر را به بالای پشته میبرد و یک رسته خاص را برگشت میدهد. برای اینکه این عملکرد موفقیتآمیز باشد، دو شرط باید محقق شود:
اولا باید دو عنصر بر بالای پشته داشته باشید. اگر عناصر بیشتری موجود باشد، آن تنها با دو عنصر بالا سر و کار خواهد داشت.
دوما این دو عنصر بالای پشته باید رسته باشند.
حال اگر آنچه را که در بخش اول در موردش صحبت کردیم به یاد داشته باشید، میدانید که قرار است چه اتفاقی بیافتد. ما باید یک جفت را با یک لیست و انبارش جدید ایجاد کنیم و اجرای قرارداد هوشمند را پایان دهیم.
ابتدا اجازه دهید یک لیست خالی را به بالای پشته انتقال دهیم:
وقتی که لیست خالی در آنجا جای گرفت، میتوانیم یک جفت با لیست خالی و رسته ایجاد کنیم:
در مورد ترتیب عناصر و تایپ آنها بسیار دقت کنید، زبان برنامهنویسی تزوس عنصر اول را به سمت چپ جفت انتقال میدهد و عنصر دوم را نیز در سمت راست جای میدهد. برگشت دادن یک جفت (pair string list (operation)) باعث ایجاد خطا میشود.
حال پشته ما صحیح است و شامل یک جفت با لیستی از عملکردها و یک رسته است. اجرای قرارداد هوشمند در اینجا پایان میپذیرد.
نتیجهگیری
در این مقاله به بررسی ابزار Jupyter Notebook پرداختیم که در زبان برنامهنویسی تزوس مورد استفاده قرار میگیرد و به نوشتن، اشکالزدایی و اجرای کد بسیار کمک میکند.
در این نوشتار، کدهای جدید عملکردی Michelson مانند CAR، SWAP و غیره معرفی شدند و عملکرد آنها مورد بحث قرار گرفت. شکلهایی هم که در این نوشتار آورده شدهاند به درک بهتر متن و درک بهتر انواع قرارداد هوشمند مورد بحث کمک خواهند کرد. امیدواریم که این راهنما مفید واقع شده باشد. نظرات خود را از ما دریغ نکنید.