با بررسی خروجی کامپایلر سالیدیتی به بخش مهمی به نام opcode می رسیم که از اصطلاحاتی همچون PUSH1 ، SSTORE ، SSTORE و … تشکیل شده. آیا باید به این کد ها اهمیت داد؟
همانطور که بارها اشاره کردیم، سالیدیتی یک زبان سطح بالاست. یعنی به زبان آدمی زاد نزدیک است اما از زبان ماشین بسیار دور. پس همانطور که انتظار داریم ماشین هیچ درکی از آن نخواهد داشت.
حال مجدد به سوال اول برگردیم.
Opcode چیست؟
خوب هست بدانیم EVM یک ماشین پشته ای است. به طور خلاصه نحوه عملکرد آن LIFO است. یعنی آخرین ورودی، اولین خروجی خواهد بود.
مثالی از تفسیر کد های Opcode و تبدیل به بایت کد
به عبارت زیر توجه کنید.
10 + 2 * 2
مشخص است که جواب این عبارت ۱۴ خواهد بود اما اجازه بدهید ببینیم ماشین پشته ای چگونه آن را میبیند.
2 2 * 10 +
همانطور که می بینیم اول ۲ وارد ماشین شده، بعد ۲ بعدی و بعد عمل ضرب. پس نتیجه ۴ را خواهیم داشت. بعد ۱۰ را هم داریم و بعد هم عمل جمع هست که همان نتیجه ۱۴ را خواهیم دید.
عمل قرار دادن اطلاعات در پشته توسط PUSH انجام می شود. و عمل حذف از پشته توسط POP انجام می شود. برای مثال PUSH1 یعنی ۱ بایت اطلاعات در پشته قرار داده شود.
PUSH1 0x60
یعنی مقدار ۱ بایت 0x60 را در استک قرار بده. با حذف 0x که نوشتنش اجباری نیست، به ۶۰ می رسیم. اتفاقا همتای PUSH1 نیز عدد ۶۰ است!
پس خروجی بایت کد خط بالا می شود “6060”
۶۰ اولی برای PUSH1 و ۶۰ دومی همان مقداری که میخواستیم وارد استک کنیم.
با بیان مثال بالا سعی کردیم یک آشناییت اولیه با مفهوم opcode و بایت کد بدست آورده باشید تا در مقالات بعدی بیشتر مورد بررسی قرار دهیم.