Michelson یکی از هیجان برانگیزترین زبانهای برنامهنویسی برای قرارداد هوشمند در حال حاضر است. این زبان مبتنی بر استک (stack) است که در آن قراردادهای هوشمند برای تضمین امنیت بلاک چین (blockchain) تزوس (Tezos) نوشته شده است. Michelson در مقایسه با بایت کد (bytecode) قراردادهای هوشمند اتریوم (ethereum) خواناتر، ایمنتر و قویتر است. همه زبانهای سطح بالا را میتوان برای نوشتن قرارداد هوشمند در تزوس مورد استفاده قرار داد و همه آنها در نهایت به Michelson ترجمه میشوند.
در این مقاله به بررسی زبان برنامهنویسی Michelson میپردازیم و یاد میگیریم که منظور از مبتنی بودن بر استک چیست و در نهایت تعدادی قرارداد هوشمند ساده نیز مینویسیم. این مقاله برای افراد مبتدی در برنامهنویسی و یا توسعه تزوس نوشته شده است.
مفهوم استک در زبان برنامهنویسی تزوس
برای درک نحوه عملکرد Michelson، یکی از مفاهیمی که باید به درستی درک کرد، مفهوم استک است. هر قرارداد Michelson لیستی از آموزشهایی است که به دنبال یکدیگر میآیند. این دستورالعملها به همان ترتیبی که نوشته شدهاند، اجرا خواهند شد.
هر یک از این آموزشها، استک را به صورتی دستکاری خواهد کرد. استک را به عنوان تودهای از دادهها در نظر بگیرید. آموزشهایی که مینویسید بر دادههای موجود در توده تاثیر میگذارند. استک به ترتیب عکس ورود کار میکند و اگر بخواهید به دادههایی دسترسی داشته باشید که در بالای استک نیستند، ابتدا باید با دادههایی سر و کار داشته باشید که در بالای آن هستند.
زمانی که مشغول کدگذاری با Michelson هستید، سه مفهوم اصلی را باید در نظر داشته باشید:
دادههای جدید در بالای استک قرار میگیرند.
دادههای داخل استک تنها زمانی قابل دسترس میشوند که در بالای استک باشند.
ترتیب پردازش دادهها از بالای استک به پایین است.
در ادامه به یک مثال در این زمینه پرداخته میشود.
عملکرد PUSH
اگر میخواهید مقداری داده را به بالای استک اضافه کنید، باید عملکرد PUSH را فراخوانی کنید. این عملکرد به این صورت کار میکند:
توجه داشته باشید که ممکن است از قبل دادههایی در استک موجود باشد، در این حالت، ارزش جدید بر بالای این دادهها گذاشته میشود. به این ترتیب میتوان دادههای جدید را در Michelson حرکت داد:
ساختار قرارداد هوشمند Michelson
یک قرارداد هوشمند در زبان برنامهنویسی تزوس به صورت ساختاری ساده نمایش داده میشود که از سه مولفه ساخته شده است:
نوع پارامتر (parameter) مورد انتظار
نوع انبارش
کد Michelson
این را میتوان به صورت کد زیر ترجمه کرد:
علاوه بر این ساختار، دو قانون وجود دارد که باید در موقع نوشتن قرارداد هوشمند در زبان برنامهنویسی تزوس یعنی Michelson مورد توجه قرار داد:
جفتی که محتوی پارامتر و انبارش است، زمانی که کد اجرا شود به طور خودکار به استک انتقال داده میشود. توجه داشته باشید که اگر پارامتری موجود نباشد، Unit در عوض آن مورد استفاده قرار میگیرد.
این کد باید همیشه جفتی را که شامل لیستی از عملکردها و انبارش به روز است، برگشت دهد. وقتی که این جفت آخرین چیز باقی مانده در استک باشد، اجرا متوقف خواهد شد.
یک قرارداد هوشمند ساده Michelson
حالا که ما در مورد PUSH و ساختار قرارداد هوشمند در Michelson میدانیم، اجازه دهید یکی بنویسیم!
در اینجا، ما یک قرارداد Hello World را خواهیم نوشت و یک رشته را در داخل انبارش ذخیره میکنیم:
وقتی که این کد اجرا شد، اوضاع به مانند زیر پیش خواهد رفت:
Parameter Unit نشان میدهد که پارامتر گذر کرده از نوع unit است.
Storage string نشان میدهد که قرارداد دارای انبارشی از نوع string است.
DROP کدی عملکردی است که هر چیزی را که در بالای استک باشد، بر خواهد داشت.
PUSH یک ارزش را به بالای استک میآورد که در اینجا رسته Hello World است.
NIL یک کد عملکردی است که لیستی خالی از آن نوع خاص را بر بالای استک اضافه میکند.
PAIR از دو مولفه بالای استک استفاده میکند؛ جفت جدیدی را که شامل این دو مولفه است، ایجاد میکند و جفت را بر روی استک به عقب انتقال میدهد.
توجه داشته باشید که هر دستور العمل با یک سمی کالن (semi-colon) به پایان میرسد.
اضافه کردن اعداد صحیح و ذخیره نتیجه
اجازه دهید یک عملکرد جدید بنام ADD را معرفی کنیم. احتمالا حدس زدهاید که این عملکرد چکار میکند، این عملکرد دو ارزش عددی را به هم اضافه میکند. در اینجا قرارداد هوشمند سادهای را میبینید که نحوه عملکرد چنین چیزی را در تزوس به نمایش میگذارد:
اجازه دهید به داخل هر عملکرد برویم و ببینیم چه اتفاقی در داخل استک روی میدهد:
Parameter unit، یک بار دیگر، ما از هیچ پارامتری استفاده نمیکنیم، بنابراین در حال گذر از یک unit هستیم.
Staorage int، این بار، ما در حال ذخیره ارزش عدد صحیح تایپ در داخل انبارش هستیم.
DROP، ما به جفت اولیه نیاز نداریم، بنابراین میتوانیم از آن خلاص شویم و فضا را برای ارزشهایی که واقعا لازم است، فراهم نماییم.
Push int 2 ؛ Push int 3؛ توجه داشته باشید که این ترتیب اساسی است. زمانی که int 3 را انتقال دهید، int 2 به کف استک میرود. اگر چیزی اضافه شود، ترتیب خیلی اهمیت نخواهد داشت. اما اگر برای مثال دو عدد را کم کنیم، لازم است که آنها را در ترتیب صحیح انتقال دهیم.
ADD نیز به روشی مانند PAIR عمل میکند. باید از دو عنصر بالای استک استفاده کنید و به ارزش خاصی از آنها برسید و آن را به استک برگردانید. ADD دو عدد را به هم اضافه خواهد کرد. توجه داشته باشید که این اعداد باید از یک نوع باشند.
NIL، مانند قرارداد هوشمند قبل، لیستی خالی از عملکردها را انتقال میدهیم. میبینید که روال کار در قراردادهای تزوس بسیار شبیه به همدیگر است.
PAIR، جفتی شامل لیست عملکردها و انبارش جدید ایجاد میکند.
نتیجهگیری
اغلب در مورد پیچیدگی زبان برنامهنویسی تزوس اغراق میشود و شاید دلیل این امر، عدم وجود آموزشهای مناسب برای مبتدیان در فضای اینترنت باشد. به همین خاطر بود که من اقدام به تهیه این مقاله آموزشی کردم که امیدوارم مثمر ثمر واقع شده باشد. درک Michelson کلید درک ویژگیهای منحصر به فرد بلاک چین تزوس است و از این طریق میتوان به امنیت و مفیدی این بلاک چین پی برد.
در بخش دوم از این مقاله، به بررسی Michelson ادامه خواهیم داد و تعدادی قرارداد هوشمند ساده دیگر را خواهیم نوشت. نظرات خود را حتما با ما در میان بگذارید.