Solidity opcode基礎

今天要介紹幾個基礎的solidity opcode(指令碼)給大家~

介紹前先簡單說一下opcode是什麼,我們可以把opcode理解為程式語言的語言,平常看到的語法被編譯過後,都會被轉化成電腦才看的懂的指令碼,也就是opcode。

學習基礎opcode有助於我們更深入了解以太坊!以下附上兩篇文章讓讀者可以更加了解opcode:

  1. https://medium.com/@blockchain101/solidity-bytecode-and-opcode-basics-672e9b1a88c2
  2. https://www.evm.codes/about?fork=grayGlacier

先備知識:(深呼吸~)

  1. 一個opcode(指令碼)佔用一個byte
  2. stack:儲存opcode參數及輸出結果的地方,stack內的資料都是先進後出(可以把opcode當成function,可有參數,也可無參數)
  3. memory:暫存合約執行過程中資料的地方(記憶體位置從0開始計算)
  4. storage:永久儲存合約資料的地方(跟stoage slot的storage是指同樣的東西)
  5. counter:整份opcode的bytes數。原文說明:The program counter (PC) is a byte offset in the deployed code (https://www.evm.codes/about)
  6. opcode以16進制表示,則稱作bytecode

基礎語法:(以下只介紹「我認為」比較常見的opcode)

請讀者搭配opcode超連結內的範例實作較易理解

A

  1. push(value),把value丟入stack
  2. pop,remove stack最上面的資料

B

  1. mstore(offset, value) 一次寫入32bytes的資料,從最右位元開始寫入
    offset等於0,將資料寫入前32 bytes(記憶體位置0–31)
    offset等於1,將資料寫入記憶體位置1–32
    offset等於3,以此類推…
  2. mload(offset, value)一次讀取32bytes的資料,從最右位元開始讀取,讀取出的資料會被放入stack
    offset等於0,讀取前32 bytes(記憶體位置0–31)
    offset等於1,讀取記憶體位置1–32
    offset等於3,以此類推…

C

  1. sstore(key, value),將value寫入key指定的storage slot位置
  2. sload(key),讀取key指定的storage slot位置,讀出的資料會被放入stack

D

  1. jump(counter),跳躍至指定位置的byte,指定位置的byte必需是jumpdest。(counter定義請參閱先備知識)
  2. jumpi(counter, b),如果b等於1,跳躍至指定位置的byte,指定位置的byte必需是jumpdest。

E

  1. stop、returnrevert、selfdestruct,執行之後會終止程式

以上各opcode範例皆可從 https://www.evm.codes/?fork=grayGlacier 的Reproduce in playground找到,如附圖