iT邦幫忙

2023 iThome 鐵人賽

DAY 7
0
Web 3

以 Python 進入以太坊虛擬機 (EVM) 的幻想境界系列 第 7

虛擬境界 7:比較和位元 (Comparison) 指令

  • 分享至 

  • xImage
  •  

第七章:介紹 EVM 比較和位元邏輯指令

在這一章中,我們將介紹 EVM 中的比較和位元邏輯指令,包括 LT、GT、SLT、SGT、EQ、ISZERO、AND、OR、XOR、NOT、BYTE、SHL、SHR 和 SAR。

#
# Comparison and Bitwise Logic
#
LT = 0x10
GT = 0x11
SLT = 0x12
SGT = 0x13
EQ = 0x14
ISZERO = 0x15
AND = 0x16
OR = 0x17
XOR = 0x18
NOT = 0x19
BYTE = 0x1A
SHL = 0x1B
SHR = 0x1C
SAR = 0x1D

比較指令概述

比較指令用於比較兩個數的大小或相等性。

LT 指令:如果第二個數小於第一個數,則將 1 推送到堆疊,否則推送 0。

def lt(self):
    value1 = self.evm.stack.pop()
    value2 = self.evm.stack.pop()
    result = 1 if value2 < value1 else 0
    self.evm.stack.append(result)

GT 指令:如果第二個數大於第一個數,則將 1 推送到堆疊,否則推送 0。

def gt(self):
    value1 = self.evm.stack.pop()
    value2 = self.evm.stack.pop()
    result = 1 if value2 > value1 else 0
    self.evm.stack.append(result)

SLT 指令:有符號比較,如果第二個數(當作有符號整數)小於第一個數,則將 1 推送到堆疊,否則推送 0。

def slt(self):
    value1 = int(self.evm.stack.pop())
    value2 = int(self.evm.stack.pop())
    result = 1 if value2 < value1 else 0
    self.evm.stack.append(result)

SGT 指令:有符號比較,如果第二個數(當作有符號整數)大於第一個數,則將 1 推送到堆疊,否則推送 0。

def sgt(self):
    value1 = int(self.evm.stack.pop())
    value2 = int(self.evm.stack.pop())
    result = 1 if value2 > value1 else 0
    self.evm.stack.append(result)

EQ 指令:如果兩個數相等,則將 1 推送到堆疊,否則推送 0。

def eq(self):
    value1 = self.evm.stack.pop()
    value2 = self.evm.stack.pop()
    result = 1 if value2 == value1 else 0
    self.evm.stack.append(result)

位元邏輯指令概述

位元邏輯指令包括 AND、OR、XOR、NOT、BYTE、SHL、SHR 和 SAR。這些指令執行位元邏輯操作。

AND 指令:對兩個數的位元進行 AND 運算。

def and_(self):
    value1 = self.evm.stack.pop()
    value2 = self.evm.stack.pop()
    result = value1 & value2
    self.evm.stack.append(result)

OR 指令:對兩個數的位元進行 OR 運算。

def or_(self):
    value1 = self.evm.stack.pop()
    value2 = self.evm.stack.pop()
    result = value1 | value2
    self.evm.stack.append(result)

XOR 指令:對兩個數的位元進行 XOR 運算。

def xor(self):
    value1 = self.evm.stack.pop()
    value2 = self.evm.stack.pop()
    result = value1 ^ value2
    self.evm.stack.append(result)

NOT 指令:對數進行位元 NOT 運算。

def not_(self):
    value = self.evm.stack.pop()
    result = ~value
    self.evm.stack.append(result)

SHL 指令:將數值左移指定的位數。

def shl(self):
    shift_amount = self.evm.stack.pop()
    value = self.evm.stack.pop()
    result = value << shift_amount
    self.evm.stack.append(result)

SHR 指令:將數值右移指定的位數。

def shr(self):
    shift_amount = self.evm.stack.pop()
    value = self.evm.stack.pop()
    result = value >> shift_amount
    self.evm.stack.append(result)

SAR 指令:算術右移,與 SHR 類似,但保留符號位。
(注意:Python 的右移操作是算術右移,所以 SHR 和 SAR 的實現在 Python 中是相同的。但在其他語言或平台上,這兩者可能有所不同。)

def sar(self):
    shift_amount = self.evm.stack.pop()
    value = self.evm.stack.pop()
    result = value >> shift_amount
    self.evm.stack.append(result)

BYTE 指令:從一個字中提取特定位元範圍的值。


def byte(self):
    position = self.evm.stack.pop()
    value = self.evm.stack.pop()
    mask = 0xFF << (8 * position)
    result = (value & mask) >> (8 * position)
    self.evm.stack.append(result)

ISZERO 指令:檢查數值是否為零。如果是,則將 1 推送到堆疊,否則推送 0。

def iszero(self):
    value = self.evm.stack.pop()
    result = 1 if value == 0 else 0
    self.evm.stack.append(result)

在這一章中,我們介紹了 EVM 比較和位元邏輯指令,包括 LT、GT、SLT、SGT、EQ、ISZERO、AND、OR、XOR、NOT、BYTE、SHL、SHR 和 SAR。這些指令執行比較和位元邏輯操作,可以用於各種運算。接下來,我們將繼續擴充你的 EVM 功能,如果有任何疑問,請隨時提問!


上一篇
虛擬境界 6:停止和算術指令
下一篇
虛空境界 8 :SHA3 (Keccak-256) 和環境指令
系列文
以 Python 進入以太坊虛擬機 (EVM) 的幻想境界30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言