سالیدیفا

Opcode چیه؟ و چه ارتباطی با بایت کد داره؟

وقتی خروجی کامپایلر سالیدیتی رو بررسی می کنیم به بخش مهمی به نام opcode می رسیم که از اصطلاحاتی مثل PUSH1 ، SSTORE ، SSTORE و … تشکیل شده. این اصطلاحاتی چین و چرا برامون مهمن؟

احتمالا میدونیم که سالیدیتی یه زبان سطح بالاست. یعنی به زبان آدمیزاد خیلی نزدیکتره تا زبان ماشین. در نتیجه انتظار داریم ماشین هیچ درکی از اون نداشته باشه.

دوباره به سوال اول برگردیم.

Opcode چیه؟

opcode یا همون operation code دستور عمل های سطح پایینی هستن که توسط ماشین قابل درک هستن. همه opcode ها همتای هگزادسیمال خودشونو دارن. مثلا 0x52 همتای MSTOREه 0x55 همتای SSTOREه. در واقع این کد به زبان خود ماشین به ماشین میفهمونه که چه دستوری رو باید اجرا کنه.

خوبه بدونیم که EVM یک ماشین پشته ای هستش و نحوه عملکرد اون LIFO ه. یعنی آخرین ورودی(Last In)، اولین خروجی خواهد بود(First Out).

مثالی از تفسیر کد های Opcode و تبدیل به بایت کد

به عبارت زیر توجه کنین.

10 + 2 * 2

مشخصه که جواب این عبارت ۱۴ خواهد بود اما اجازه بدین ببینیم ماشین پشته ای چطوری میبینتش.

2 2 * 10 + 

مشخصه که اول ۲ وارد ماشین شده، بعد ۲ بعدی و بعد عمل ضرب. پس نتیجه ۴ رو خواهیم داشت. بعد ۱۰ رو هم داریم و بعد هم عمل جمع هست که همان نتیجه ۱۴ رو خواهیم دید.

عمل قرار دادن اطلاعات تو استک(پشته) با PUSH انجام میشه. و عمل حذف از پشته هم با POP انجام میشه. برای مثال PUSH1 یعنی ۱ بایت اطلاعات تو استک قرار داده بشه.

PUSH1 0x60

یعنی مقدار ۱ بایت 0x60 را در استک قرار بده. با حذف 0x که نوشتنش اجباری نیست، به ۶۰ می رسیم. اتفاقا همتای PUSH1 هم عدد ۶۰ه!

پس خروجی بایت کد خط بالا می شود “6060”

۶۰ اولی برای PUSH1 و ۶۰ دومی همون مقداری که میخواستیم وارد استک کنیم.

با بیان مثال بالا سعی کردیم یک آشناییت اولیه با مفهوم opcode و بایت کد پیدا کرده باشیم تا در مقالات بعدی بیشتر مورد بررسی قرارشون بدیم.