今天要介紹幾個基礎的solidity opcode(指令碼)給大家~
介紹前先簡單說一下opcode是什麼,我們可以把opcode理解為程式語言的語言,平常看到的語法被編譯過後,都會被轉化成電腦才看的懂的指令碼,也就是opcode。
學習基礎opcode有助於我們更深入了解以太坊!以下附上兩篇文章讓讀者可以更加了解opcode:
先備知識:(深呼吸~)
- 一個opcode(指令碼)佔用一個byte
- stack:儲存opcode參數及輸出結果的地方,stack內的資料都是先進後出(可以把opcode當成function,可有參數,也可無參數)
- memory:暫存合約執行過程中資料的地方(記憶體位置從0開始計算)
- storage:永久儲存合約資料的地方(跟stoage slot的storage是指同樣的東西)
- counter:整份opcode的bytes數。原文說明:The program counter (PC) is a byte offset in the deployed code (https://www.evm.codes/about)
- opcode以16進制表示,則稱作bytecode
基礎語法:(以下只介紹「我認為」比較常見的opcode)
請讀者搭配opcode超連結內的範例實作較易理解
A
- push(value),把value丟入stack
- pop,remove stack最上面的資料
B
- mstore(offset, value) 一次寫入32bytes的資料,從最右位元開始寫入
offset等於0,將資料寫入前32 bytes(記憶體位置0–31)
offset等於1,將資料寫入記憶體位置1–32
offset等於3,以此類推… - mload(offset, value)一次讀取32bytes的資料,從最右位元開始讀取,讀取出的資料會被放入stack
offset等於0,讀取前32 bytes(記憶體位置0–31)
offset等於1,讀取記憶體位置1–32
offset等於3,以此類推…
C
- sstore(key, value),將value寫入key指定的storage slot位置
- sload(key),讀取key指定的storage slot位置,讀出的資料會被放入stack
D
- jump(counter),跳躍至指定位置的byte,指定位置的byte必需是jumpdest。(counter定義請參閱先備知識)
- jumpi(counter, b),如果b等於1,跳躍至指定位置的byte,指定位置的byte必需是jumpdest。
E
以上各opcode範例皆可從 https://www.evm.codes/?fork=grayGlacier 的Reproduce in playground找到,如附圖