Optimism 实现了 EVM 模拟 OVM 的逻辑,相关的项目的 Github 地址。 本文中使用的代码的最后一个提交信息如下: commit ca1fede6c8cb9e4eacd8205c1d53284d0c8debdc Author: Mark Tyneway Date: Fri Oct 30 12:14:50 2020 -0700 deploy: use layer 2 chainid (#42) 核心代码在 contracts-v2/contracts/optimistic-ethereum/OVM 目录中。除了 OVM 目录,iOVM 目录是接口定义,libraries 目录是各种库的实现,包括编解码,二叉树等等。 OVM/chainLayer 1 的智能合约中用两条链维护交易信息和状态信息,分别是 CanonicalTransactionChain 和 StateCommitmentChain。 Layer 2 的所有的交易信息,一个个 Batch 的通过 CallData 提交到 Layer 1。每个 Batch 中的交易的 Hash 信息组织成 Merkle 树。简单的说,CanonicalTransactionChain 存储的是一个个 Batch 交易的 Merkle 树根。这些树根用来判断某个具体的交易是否在链中。 Layer 2 的世界状态,通过一个个交易的状态改变来表示。每个交易后的状态也是通过一个个 Batch 提交到 Layer 1。每个 Batch 中的状态,也再次组织成 Merkle 树。这些树根用来判断某个状态是否在链中。 具体两条链的存储信息,可以查看源代码:OVM_CanonicalTransactionChain.sol 和 OVM_StateCommitmentChain.sol。 OVM/executeexecute 是 OVM 在 EVM 执行的核心逻辑,包括 ExecuteManager,StateManager 以及 SafetyChecker。对应的源代码分别是:OVM_ExecutionManager.sol,OVM_SafetyChecker.sol 和 OVM_StateManager.sol。 ExecuteManager 是整个智能合约执行环境以及指令集的处理。OVM 其实和 EVM 逻辑上采用同样的指令集,但是在 OVM 的环境下,特别在 Layer 1 的 EVM 执行 OVM 时,需要将这些指令集「转义」。之所以叫 OVM 的原因,可能很大程度为了区分 EVM,表述方便。蛮多指令需要转义,把 OVM 在 Layer 1 的实现想象成虚拟机。这些指令包括:TIMESTAMP,CALL,STATICCALL,DELEGATECALL,GASLIMIT,SLOAD,SSTORE 等等。一个交易的执行从 ExecuteManager 的 run 函数开始: function run( Lib_OVMCodec.Transaction memory_transaction, address_ovmStateManager ) run 函数提供了执行的交易,以及执行交易前的状态。 StateManager 实现了智能合约以及账户的存储状态管理。ExecuteManager 在执行一个交易时会通过 StateManager 更新状态。 (责任编辑:admin) |