1 of 8

EIP-663: Introducing SWAPN, DUPN, and EXCHANGE Instructions in the EVM

@hydai

深入淺出 EOF

2 of 8

EIP-663 的解法

  • 允許對最頂部 256 個物件進行操作
  • 簡化編譯器的設計,不需要大幅組合 DUP* & SWAP* 來存取更深的 stack 物件
  • 如果還不夠用,那肯定是開發者的問題
    • Stack 最深就 1024 個物件,能操作 ¼ 的深度了還不夠的話,請自己反省

3 of 8

新指令

  • DUPN(0xE6)
    • 複製第 N 個物件到 stack 的最頂部
  • SWAPN(0xE7)
    • 將 stack 的最頂部與第 N+1 個物件交換
  • EXCHANGE(0xE8)
    • 交換 stack 中的兩個物件
  • 指令的參數
    • 全部的參數為 8-bit 的整數 (imm)
  • 對於 DUPN 與 SWAPN:
    • N = imm + 1
    • 因此可以對 stack[1~256] 進行操作
  • 對於 EXCHANGE:
    • 將 imm 切成兩塊
    • 較高的部分為 N(4-bit) = (imm >> 4) + 1
    • 較低的部分為 M(4-bit) = (imm & 0x0F) + 1
    • 將第 N+1, N+M+1 的物件交換

4 of 8

執行規則

  • DUPN
    • 複製第 N 個物件到 stack 的頂部 stack.push(stack[N-1])
    • stack 的高度 +1
  • SWAPN
    • 將 swap(stack[0], stack[N])
    • stack 高度不改變
  • EXCHANGE
    • swap(stack[N], stack[N+M])
    • stack 高度不改變

5 of 8

Gas 消耗

  • 與現存的 DUP*, SWAP* 的消耗一樣,皆為 3 Gas

6 of 8

驗證

  • 傳統的 EVM 遇到即中止執行
  • 只允許存在 EOFv1
  • 所有的指令參數 imm 為 8 位元的數值
  • imm 不能是 RJUMP/RJUMPI/RJUMPV 的跳躍目標

7 of 8

EXCHANGE VS SWAPN

  • SWAPN 明顯可以取代 EXCHANGE
  • EXCHANGE 真的有其存在必要性嗎?
  • 有的,而且還很常見
    • 比如在 stack 中,top|A|B|C|,我們下次執行時需要的參數順序為 ACB
    • SWAPN 2 |C|B|A|
    • SWAPN 1 |B|C|A|
    • SWAPN 2 |A|C|B|
    • 但是 EXCHANGE 就只要一次即可將 BC 對調

8 of 8

測試資料

  • 對 DUPN/SWAPN 而言,n = imm+1
  • 對 EXCHANGE 而言,n = (imm >> 4) + 1,m=(imm & 0x0F) + 1
  • 若 stack_height < n,則 DUPN imm 失敗 (不能複製不存在的物件)
  • 若 stack_height < n+1,則 SWAPN imm 失敗 (不能交換不存在的物件)
  • 若 stack_height < n+m+1,則 EXCHANGE imm 失敗 (不能交換不存在的物件)
  • 若 DUPN imm 執行後導致 stack overflow,則失敗
  • 若可用的 Gas < 3,則在執行階段時 DUPN imm / SWAPN imm / EXCHANGE imm 執行失敗
  • DUPN imm 應複製 stack[n - 1] 到 stack top
  • SWAPN imm 應交換 stack[n] 與 stack[stack.top()]
  • EXCHANGE imm 應交換 stack[n] 與 stack[n + m].