هرچقدر که در Smart Contract ها عمیق‌تر می‌شویم بیشتر با اصطلاحاتی چون PUSH ، SSTORE ، MSTORE و. مواجه می‌شویم. این‌ها دقیقا چه هستند و آیا ما باید به آنها اهمیت دهیم؟ برای درک درست این اصطلاحات باید در Ethereum Virtual‌Machine یا همان EVM عمیق‌تر شویم. زبان Solidity از نوع زبان‌های است. ما آن را می‌فهمیم ولی ماشین آن را نمی‌فهمد. زمانی که ما یکی از کلاینت‌های ا ت ریوم مانند را نصب می‌کنیم، EVM خودکار با آن نصب می‌شود. در واقع EVM یک سبک می‌باشد که اختصاصا برای اجرای Smart Contract ها ساخته شده است. وقتی ما کدهای Solidity را می‌کنیم، کدها به Bytecode تبدیل می‌شوند و این همان چیزیست که ماشین می‌فهمد. این یک نمونه Smart Contract بسیار ساده است: اگر این Smart Contract را در اجرا نمایید، با کلیک بر روی دکمه details اطلاعات زیر را می‌بینیم: این بخش کامپایل شده‌ی کدهای Solidity است: این چیزی نیست جز یک عدد بر مبنای شانزده (هگزا) ، که از کدهایی که در Contract نوشتیم بدست آمده است و به آن گفته می‌شود. در همین پنجره ( details ) در بخش Web Deploy چنین چیزی می‌بینیم: در نهایت چیزی که از Contract ما بر روی شبکه ا ت ریوم قرار می‌گیرد همین عدد هگزا ای است که در فیلد data می‌بینید و برای این عمل به پرداخت , gas نیاز دارد. در واقع EVM با همه چیز به عنوان یک مقدار هگزا برخورد می‌کند. اگر تابحال برایتان سوال پیش آمده که چرا در ابتدای آدرس ا کانت های ا ت ریوم یا ه ش تراکنش‌ها" x " را می‌بینیم، دلیل آن همین است. در واقع" x " به این معنی است که مقداری که در جلوی آن قرار می‌گیرد، یک عدد بر مبنای شانزده است. وجود" x " الزامی نیست، چراکه همانطور که گفته شد EVM با همه مقادیر به صورت هگزا برخورد می کند. همینطور عباراتی به شکل زیر را می‌بینیم: به این بخش Operation Code یا همان گفته می‌شود. این بخش برای انسان قابل خواندن است ولی درک آن بسیار مشکل می باشد. تمام این Operation ها در واقع معادلی در مبنای شانزده دارند. بطور مثال معادل MSTORE مقدار x می باشد و یا SSTORE معادل x می‌باشد. در ا ت ریوم می‌توانید لیست کامل Opcode ها را مشاهده نمایید. ماشین EVM از نوع Stack Machine می‌باشد. برای درک ساده‌ی ا ست ک‌ها تصور کنید قطعات نان را در ف ر قرار می‌دهید. طبیعتا قطعه نان آخری که در ف ر قرار داده‌اید را، در هنگام خارج کردن نان‌ها، اول از همه بیرون خواهید آورد. در علوم کامپیوتر به این فرآیند Last In First Out یا همان گفته می‌شود. در محاسبات ریاضیاتی، ما چنین عمل می‌کنیم: در Stack Machine اصول LIFO به این شکل عمل می‌کنند: ابتدا را در ا ست ک قرار بده، سپس عدد بعدی را قرار بده و بعد از آن عملیات ضرب را انجام بده. حاصل آن می‌شود که در راس ا ست ک قرار می‌گیرد. سپس عدد را در ا ست ک قرار بده (بعد از ) و این دو عدد را با هم جمع کن. مقدار نهایی استک خواهد بود. عمل وارد کردن داده در استک PUSH و عمل خارج کردن داده POP نام دارد. در Opcode ی که بالا تر دیدم تعداد زیادی PUSH وجود دارد که به معنی قرار دادن بایت از داده ای مشخص در ا ست ک می باشد. (در ادامه این مورد با مثال‌های متعدد بیشتر توضیح داده می‌شود) در نتیجه، این عبارت: به معنی قرار دادن بایت با مقدار" x " در ا ست ک می‌باشد. تصادفا مقدار هگزای عملیات PUSH برابر با" x " است که اگر عبارت غیر الزامی" x " را حذف کنیم، Bytecode بدست آمده برابر با" " می‌شود. با نگاهی به، می‌بینیم که MSTORE (هگزا: x ) دو ورودی می‌گیرد و خروجی‌ای ندارد. Opcode بالا بدین معنی است: PUSH x : مقدار x را وارد ا ست ک کن . PUSH x : مقدار x را وارد ا ست ک کن . MSTORE x : به مقدار x از فضای حافظه را اختصاص بده و به نقطه x برو (در ادامه توضیح ساده تری از این Opcode می‌بینید) نتیجه نهایی Bytecode اینچنین خواهد بود: در حقیقت ما همیشه مقدار" " را در ابتدای بایت کدهای Solidity می‌بینیم و دلیل این موضوع این است که Smart Contract ها با این Opcode راه اندازی ( Bootstrap ) می‌شوند. در Opcode بالا، مقدار x در مبنای ده برابر و مقدار x در مبنای ده برابر است. در نتیجه Opcode بالا به این معنی است که: ا ست ک: که نمونه آن PUSH می‌باشد و بالا تر مثال آن را دیدیم حافظه تصادفی ( RAM ) : که نمونه آن MSTORE در Opcode ها می‌باشد حافظه دیسک: که نمونه Opcode آن SSTORE است در ا ت ریوم برای ذخیره داده در حافظه دیسک باید gas پرداخت شود و به همین دلیل ذخیره داده در دیسک گران‌ترین و ذخیره داده در ا ست ک ارزان‌ترین است. زبان Assembly نوشتن کامل Smart Contract با Opcode ها امکان پذیر است و برای این منظور ساخته شده است. طبیعتا نوشتن در این حالت بسیار سخت تر است، ولی برای نوشتن Contract هایی که در آن‌ها باید در مصرف gas صرفه جویی شود و یا زمانی که کاری می‌خواهید انجام دهید که اجرای آن در Solidity امکان پذیر نیست، استفاده از زبان اسمبلی Solidity کارا خواهد بود. در انتها برای شروع به نوشتن Smart Contract ها نیازی به دانستن Opcode ها نداریم. اما دانستن آنها علاوه بر اینکه دانش ما را در این زمینه بالا می‌برد، در هنگام Error Handling (که به خوبی در EVM انجام نمی‌شود) بسیار مفید می باشد. نویسنده: