iT邦幫忙

2024 iThome 鐵人賽

DAY 5
0
Modern Web

web3 短篇集系列 第 5

敲開 EVM Opcodes 的入門磚

  • 分享至 

  • xImage
  •  

今天我才解完 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

Reference

除了上述的教材,我也推薦以下幾個我看過覺得不錯的:


上一篇
在區塊鏈上做一筆交易
下一篇
讓用戶主動提領 (Pull over Push pattern)
系列文
web3 短篇集30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言