今天我才解完 10 題的 EVM puzzles,社群也有人分享 EOFv1 的升級,於是就隨筆分享這個主題。
The Ethereum Virtual Machine is a stack-based, big-endian VM with a word size of 256-bits and is used to run the smart contracts on the Ethereum blockchain.
stack 的運作原理就是「先進後出」,例如盤子向上堆,最底下的盤子會最後一個拿到,或者像人在嘔吐,剛吃進去的東西先吐出來..
stack 最大的深度為 1024 個,但要取值的時候只能取到前 16 個,所以 solidity 一個 function 內有超過 16 個 local variables 或 function parameters 編譯時就會出現 "Stack too deep" 的錯誤。這個問題預期會在 EOFv1 升級後獲得解決。
最近順著 EVM-Puzzles-Walkthrough 學習下來,解到第七題後,8, 9, 10 題可以不看詳解自己查表解開,真是高興,以下是 EVM Puzzles 的詳解:
https://github.com/0xKitsune/EVM-Puzzles-Walkthrough
EVM Puzzles 第一題題目如下:
00 34 CALLVALUE
01 56 JUMP
02 FD REVERT
03 FD REVERT
04 FD REVERT
05 FD REVERT
06 FD REVERT
07 FD REVERT
08 5B JUMPDEST
09 00 STOP
? Enter the value to send:
中間欄位是讓電腦讀的 opcode ID,以 hex 表示。右邊欄位是讓人類讀的 opcode name + stack input。(例如 PUSH 0C
就是把十進位 12 push 到 stack 的最上面。)
左邊欄位是以 hex 表示的 byte offset,一個 opcode 佔 1 byte,因此這組 opcodes 的大小 (code size) 是 10 bytes。因為最後一個 opcode 的 offset 是 9 個 byte,代表這個 opcode 之前有 9 bytes,加上 STOP 自己一個 opcode,整體就是 10 bytes 的大小。
以下舉例在 EVM 做一個減法運算
PUSH1 0x2
PUSH1 0x6
SUB
上面 opcodes 的 stack 呈現方式如下,我們以左進 [ ] 來表示
[] // 一開始 stack 是空的
[0x2] // 0x2 進入到 stack
[0x6 0x2] // 0x6 進入到 stack
[0x4] // opcode 就像一個 function SUB(0x6, 0x2)
--
你可以在 evm.codes 查表、看文件,然後到 playground 去實測,搭配學習關於 stack, memory, storage 等等的概念。
EVM 的東西我才剛起步,所以推薦同步追蹤 hydai 的鐵人賽教學影片!
https://ithelp.ithome.com.tw/users/20083367/ironman/8062
除了上述的教材,我也推薦以下幾個我看過覺得不錯的: