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系列博客
- ZK-Rollups工作原理
- Polygon zkEVM——Hermez 2.0简介
- Polygon zkEVM网络节点
- Polygon zkEVM 基本概念
- Polygon zkEVM Prover
- Polygon zkEVM工具——PIL和CIRCOM
- Polygon zkEVM节点代码解析
- Polygon zkEVM的pil-stark Fibonacci状态机初体验
- Polygon zkEVM的pil-stark Fibonacci状态机代码解析
- Polygon zkEVM PIL编译器——pilcom 代码解析
- Polygon zkEVM Arithmetic状态机
- Polygon zkEVM中的常量多项式
- Polygon zkEVM Binary状态机
- Polygon zkEVM Memory状态机
- Polygon zkEVM Memory Align状态机
- Polygon zkEVM zkASM编译器——zkasmcom
- Polygon zkEVM哈希状态机——Keccak-256和Poseidon
- Polygon zkEVM zkASM语法
- Polygon zkEVM可验证计算简单状态机示例
- Polygon zkEVM zkASM 与 以太坊虚拟机opcode 对应集合
以上是关于Polygon zkEVM zkROM代码解析的主要内容,如果未能解决你的问题,请参考以下文章