iT邦幫忙

2023 iThome 鐵人賽

DAY 12
0
Web 3

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

虛擬境界 12:日誌指令

  • 分享至 

  • xImage
  •  

第十二章:介紹 EVM 日誌相關指令

在這一章中,我們將介紹 EVM 中與日誌相關的指令,包括 LOG0、LOG1、LOG2、LOG3 和 LOG4。我們也會設計一個用於處理日誌的 class。

#
# Logging
#
LOG0 = 0xA0
LOG1 = 0xA1
LOG2 = 0xA2
LOG3 = 0xA3
LOG4 = 0xA4

日誌相關指令概述

這些指令用於記錄合約執行過程中的日誌,可以用於事件通知和資訊記錄。

  • LOG0 - LOG4 指令:根據指定數量的主題,將日誌記錄到區塊鏈中。
def log(self, num_topics):
    mem_offset, length, *topics = [self.evm.stack.pop() for _ in range(num_topics + 2)]

    data = self.evm.memory[mem_offset: mem_offset + length]

    log_entry = {
        "address": self.evm.address,
        "data": data.hex(),
        "topics": [f"0x{topic:064x}" for topic in topics]
    }

    self.evm.logs.append(log_entry)

這些指令允許合約在執行過程中生成日誌,並將其記錄到區塊鏈上。

日誌處理 class

以下是一個用於處理日誌的 class 範例:

class LogHandler:
    def __init__(self, evm):
        self.evm = evm
        self.logs = []

    def log(self, num_topics):
        mem_offset, length, *topics = [self.evm.stack.pop() for _ in range(num_topics + 2)]

        data = self.evm.memory[mem_offset: mem_offset + length]

        log_entry = {
            "address": self.evm.address,
            "data": data.hex(),
            "topics": [f"0x{topic:064x}" for topic in topics]
        }

        self.evm.logs.append(log_entry)

這個 class 允許合約進行日誌的處理和記錄,並將日誌存儲在 logs 屬性中。

在這一章中,我們介紹了 EVM 中與日誌相關的指令,包括 LOG0、LOG1、LOG2、LOG3 和 LOG4。我們也設計了一個用於處理日誌的 class。


上一篇
虛擬境界 11:儲存空間指令
下一篇
虛擬境界 13:系統指令
系列文
以 Python 進入以太坊虛擬機 (EVM) 的幻想境界30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言