iT邦幫忙

2023 iThome 鐵人賽

DAY 25
0
Web 3

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

虛擬境界25:Storage Circuits

  • 分享至 

  • xImage
  •  

這邊簡介存儲電路(Storage Circuit)應如何在特定的情況下工作。

定義

在這裡,有一些重要的術語和概念:

  • context:這是一個的集合,包含一系列關於當前呼叫或交易的狀態信息(例如:全局計數器、帳戶地址、操作碼、堆疊指標等)。
  • is_persistentgc_end_of_call:這兩個變數標誌著當前呼叫是否在未來成功,以及呼叫何時結束,分別用於確定存儲寫入是否持久化,以及什麼時候回滾存儲寫入。

Storage Circuit 結構

在 Storage Circuit,我們按照帳戶地址進行分組,並進一步根據存儲位置進行分組。每個子組中(每個帳戶的每個位置)的記錄都按照全局計數器的升序排列。存儲電路的目標是管理和驗證對存儲的訪問和修改。

記錄在訪問記錄中添加了一個額外的 val_prev,用於寫入存儲時使用。還有一個在總線映射中的額外值 is_first_touch,用於標記存儲位置在一個EOA呼叫中第一次被訪問時的狀態。

一個標準的總線映射查詢可以這樣進行:

bus_mapping_lookup(
    gc,
    Storage,
    key,
    val,
    rw,
    val_prev,
    is_first_touch,
)

實現方法

def check_storage(row: Row, row_prev: Row, row_next: Row, tables: Tables):
    # 4.0. Unused keys are 0
    assert row.field_tag() == 0

    # 4.1. MPT lookup for last access to (address, storage_key)
    # value = 0 means that the leaf doesn't exist. And this is needed by the non-existing proof.
    is_non_exist = FQ(row.value == Word(0)) * FQ(row.initial_value == Word(0))
    if not all_keys_eq(row, row_next):
        tables.mpt_lookup(
            row.address(),
            is_non_exist * FQ(MPTProofType.NonExistingAccountProof)
            + (1 - is_non_exist) * FQ(MPTProofType.StorageMod),
            row.storage_key(),
            row.value,
            row.initial_value,
            row.root,
            row_prev.root,
        )
    else:
        assert row.root == row_prev.root

參考資料

https://github.com/privacy-scaling-explorations/zkevm-specs/blob/master/src/zkevm_specs/state_circuit.py


上一篇
虛擬境界24:Stack Circuits
下一篇
虛擬境界26:介紹 EVM Circuits
系列文
以 Python 進入以太坊虛擬機 (EVM) 的幻想境界30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言