Polygon zkEVM zkROM代码解析

Posted mutourend

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Polygon zkEVM zkROM代码解析相关的知识,希望对你有一定的参考价值。

1. 引言

前序博客有:

Polygon zkEVM zkROM代码库为:

zkROM的基本流程为:

  • 1)A:加载输入变量;
  • 2)B:设置batch storage state-tree:batchHash (oldStateRoot) & globalExitRoot;
  • 3)C:循环解析RLP交易;
  • 4)D:循环处理交易;
  • 5)E:batch asserts:localExitRoot、transactions size、batchHashData & globalHash;
  • 6)F:finalize execution

2. A:加载输入变量

zkROM第一步为加载输入变量:

;;;;;;;;;;;;;;;;;;
;; A - Load input variabales
;;;;;;;;;;;;;;;;;;
		; 加载ctx.globalHash值到globalHash全局变量中
		; globalHash = H_keccak(oldStateRoot | oldLocalStateRoot | newStateRoot | newLocalExitRoot | batchHashData | numBatch | timestamp )
        $getGlobalHash()                  :MSTORE(globalHash)
        STEP => A
        1                                   :ASSERT ; Ensure it is the begining of the execution
        ; 加载ctx.input.globalExitRoot值到globalExitRoot全局变量中
        ; globalExitRoot对应为Global exit-tree root
        $getGlobalExitRoot()              :MSTORE(globalExitRoot)
        ; 加载ctx.input.oldStateRoot值到oldStateRoot全局变量中
        ; oldStateRoot对应为Previous state-tree root
        $getOldStateRoot()                :MSTORE(oldStateRoot)
        ; 加载ctx.input.oldLocalExitRoot值到oldLocalExitRoot全局变量中
        ; oldLocalExitRoot对应为Previous local exit-tree root
        $getOldLocalExitRoot()            :MSTORE(oldLocalExitRoot)
        ; 加载ctx.input.sequencerAddr值到sequencerAddr全局变量中
        ; sequencerAddr对应为Coinbase address which will receive the fees
        $getSequencerAddr()               :MSTORE(sequencerAddr)
        ; 加载ctx.input.batchHashData值到batchHashData全局变量中
        ; batchHashData = H_keccak( transactions | globalExitRoot | sequencerAddr )
        $getBatchHashData()               :MSTORE(batchHashData)
        ; 加载ctx.input.numBatch值到numBatch全局变量中
        ; numBatch对应为Current batch to process
        $getNumBatch()                    :MSTORE(numBatch)
        ; 加载ctx.input.timestamp值到timestamp全局变量中
        ; timestamp对应为Current batch timestamp
        $getTimestamp()                   :MSTORE(timestamp)
        ; 加载(ctx.input.batchL2Data.length-2) / 2)值到batchL2DataLength全局变量中
        ; batchL2DataLength对应为Transactions bytes read from the input
        $getTxsLen()                      :MSTORE(batchL2DataLength)

        ; Fill globalHash: oldStateRoot & oldLocalExitRoot
        32 => D ; HASHK或HASHKE的左侧长度为D,HASHKLEN/HASHPLEN的增量为D。
        ; 将oldStateRoot全局变量值加载到A寄存器中,此处实际为ctx.input.oldStateRoot值
        $ => A                              :MLOAD(oldStateRoot)
        ; H_keccak(oldStateRoot |
        A                                   :HASHK(0) ; GlobalHash address is 0
        A => SR ;SR寄存器为Storage状态机sparse merkle tree state root
        ; 将oldLocalExitRoot全局变量值加载到A寄存器中,此处实际为ctx.input.oldLocalExitRoot值
        $ => A                              :MLOAD(oldLocalExitRoot)
        ; H_keccak(oldStateRoot | oldLocalStateRoot | 
        A                                   :HASHK(0)
		; HASHPOS寄存器存储的为H_keccak函数的输入拼接字符串的最后位置
        HASHPOS                             :MSTORE(oldHashPos) ; Save globalHash data position

3. B:设置batch storage state-tree

zkROM第二步为设置batch storage state-tree,其又分为2步来实现:

  • B.1)设置batch hash
  • B.2)设置global exit root
;;;;;;;;;;;;;;;;;;
;; B - Set batch storage state-tree: batchHash (oldStateRoot) & globalExitRoot
;;;;;;;;;;;;;;;;;;

;; Set batch hash
		; 将HASHPOS重置为0,表示将启动新的哈希运算
        0 => HASHPOS ; A new hash with position 0 is started
        ; lastHashKIdUsed全局变量对应为Last hash address used
        ; 加载lastHashKIdUsed全局变量值到E寄存器中
        $ => E                              :MLOAD(lastHashKIdUsed)
        ; 将E寄存器值+1,并更新到lastHashKIdUsed全局变量中
        E+1 => E                            :MSTORE(lastHashKIdUsed)
		; numBatch全局变量对应为Current batch to process
		; 加载numBatch全局变量值到A寄存器中
        $ => A                              :MLOAD(numBatch)
        ; H_keccak( (numBatch-1) |
        A - 1                               :HASHK(E)
        ; 常量值 CONST %STATE_ROOT_STORAGE_POS = 0
        %STATE_ROOT_STORAGE_POS             :HASHK(E) ; Storage position of the batch hash
        ; H_keccak( (numBatch-1) | %STATE_ROOT_STORAGE_POS 
        HASHPOS                             :HASHKLEN(E)
        ; 校验计数器
        %MAX_CNT_KECCAK_F - CNT_KECCAK_F - %MIN_CNT_KECCAK_BATCH - 2:JMPN(outOfCounters)
        ; 将H_keccak( (numBatch-1) | %STATE_ROOT_STORAGE_POS)哈希结果给C寄存器
        $ => C                              :HASHKDIGEST(E)
        ; 打印日志,表示即将启动a batch process
        $eventLog(onStartBatch, C)
		
		; 常量值CONSTL %ADDRESS_SYSTEM = 0x0000000000000000000000000000000000000000n
        %ADDRESS_SYSTEM => A ; 系统地址默认为0地址,加载到A寄存器
        ; 常量值CONST %SMT_KEY_SC_STORAGE = 3,为智能合约STORAGE在SMT中的KEY
        %SMT_KEY_SC_STORAGE => B ;
        ; 加载oldStateRoot全局变量值加载到D寄存器中,此处实际为ctx.input.oldStateRoot值
        $ => D                              :MLOAD(oldStateRoot)
        ; 。。。。。
        $ => SR                             :SSTORE ; Store 'oldStateRoot' in storage position 'keccak256(numBatch - 1, 0)'

;; Set global exit root
        0 => HASHPOS
        $ => E                              :MLOAD(lastHashKIdUsed)
        E+1 => E                            :MSTORE(lastHashKIdUsed)

        32 => D
        $ => A                              :MLOAD(globalExitRoot)
        A                                   :HASHK(E)
        %GLOBAL_EXIT_ROOT_STORAGE_POS       :HASHK(E) ; Storage position of the global exit root map
        HASHPOS                             :HASHKLEN(E)
        %MAX_CNT_KECCAK_F - CNT_KECCAK_F - %MIN_CNT_KECCAK_BATCH - 2:JMPN(outOfCounters)
        $ => C                              :HASHKDIGEST(E)

        %ADDRESS_GLOBAL_EXIT_ROOT_MANAGER_L2 => A
        %SMT_KEY_SC_STORAGE => B
        $ => D                              :MLOAD(numBatch)
        $ => SR                             :SSTORE ; Store 'numBatch' in storage position 'keccak256(globalExitRoot, 0)'
        SR                                  :MSTORE(batchSR)

附录:Polygon Hermez 2.0 zkEVM系列博客

以上是关于Polygon zkEVM zkROM代码解析的主要内容,如果未能解决你的问题,请参考以下文章

Polygon zkEVM zkROM代码解析

Polygon zkEVM zkROM代码解析

Polygon zkEVM zkROM代码解析

Polygon zkEVM zkROM代码解析

Polygon zkEVM节点代码解析

Polygon zkEVM PIL编译器——pilcom 代码解析