بحث کد های کامپایل شده تو سالیدیتی اونقدر مهمه که دوباره سراغ opcode ها اومدیم. میخوایم با فهرست کامل تری از opcode ها آشنا بشیم. بعدش با یه مثال روش تبدیل opcode به bytecode رو یاد بگیریم.
فهرست کامل را میتونین توی سایت اتریوم مشاهده کنین که اخیرا هم بروزش کردن و اطلاعات مفیدی اضافه کردن.
ولی اینجا به چند نمونه از اونا اشاره می کنیم. بعدش با مثال عملی تبدیل opcode به bytecode را یاد میگیریم.
پشته (استک) | نام | استک اولیه | نتیجه | گس مصرفی |
00 | STOP | – | – | 0 |
01 | ADD | a, b | a + b (جمع دو uint256/int256 ) | 3 |
33 | CALLER | آدرس msg sender | 2 | |
31 | BALANCE | آدرس | موجودی آدرس به wei | 100/2600 |
60 | PUSH1 | قرار دادن ۱ بایت در استک | 3 | |
5A | GAS | گس باقیمانده | 2 | |
50 | POP | برداشتن و حذف بالاترین مورد استک | 2 | |
42 | TIMESTAMP | زمان بلاک فعلی | 2 | |
40 | BLOCKHASH | شماره بلاک | هش بلاک مورد نظر | 20 |
مثالی از تبدیل opcode به bytecode
فرض کنین می خوایم opcode زیر رو به بایت کد تبدیل کنیم:
PUSH1 0x60 PUSH1 0x40 MSTORE
حال که فهرست opcode ها را در اختیار داریم کافیه اونا رو با اعدادشون جایگزین کنیم:
PUSH1 با ۶۰، مقدار بعدش هم که ۶۰ه که همون ۶۰ میشه، دوباره PUSH1 ۶۰، بعد ۴۰ هم خودش، و مقدار MSTORE هم که ۵۲ ه. پس بایتکدمون این میشه:
60 60 60 40 52
مبدل bytecode به opcode
تو سایت ethscan یک مبدل bytecode به opcode وجود داره. اما بعد از تست هایی که کردیم نتایج قابل اعتمادی نمیده. پس ضمن اینکه می توانین برای صرفه جویی تو وقت ازش استفاده کنین، ولی لازمه خروجیش رو حتما بررسی کنین.