SafetyChecker 检查 OVM 的指令合约中的指令集是否正常,有没有超过目前可以执行的范围。安全性检查通过 OVM_SafetyChecker.sol 的 isBytecodeSafe 函数实现。 function isBytecodeSafe( bytes memory_bytecode ) override external pure returns (bool) { OVM/verificationverification 是 OVM 调用的业务逻辑。在 Layer 1,只是在验证的时候才需要通过 OVM 执行判断某个交易执行是否正确。verification 逻辑中包括了 BondManager (抵押管理),StateTransitioner (状态转换管理)和 FraudVerifier (错误状态验证逻辑)。FraudVerifier 逻辑是最核心的逻辑。整个验证过程的逻辑调用关系如下: 通过调用 initializeFraudVerification 函数,开始让 Layer 1 开始验证某个交易执行后的状态是否正确。StateTransitioner 准备交易之前的世界状态以及交易执行的中间状态存储。在世界状态准备就绪后(proveContractState/proveStorageSlot),通过调用 ExecutionManager 的 run 函数执行交易并更新状态。更新后的状态通过 StateTransitioner 的 completeTransition 函数生成世界状态。生成的世界状态和提交的世界状态进行对比,如果不一致,之前提交世界状态的节点通过 BondManager 进行惩罚。 仔细的分析一下 FraudVerifier 的 initializeFraudVerification 和 finalizeFraudVerification 函数。先从 initializeFraudVerification 函数开始: function initializeFraudVerification( bytes32_preStateRoot, Lib_OVMCodec.ChainBatchHeader memory_preStateRootBatchHeader, Lib_OVMCodec.ChainInclusionProof memory_preStateRootProof, Lib_OVMCodec.Transaction memory_transaction, Lib_OVMCodec.TransactionChainElement memory_txChainElement, Lib_OVMCodec.ChainBatchHeader memory_transactionBatchHeader, Lib_OVMCodec.ChainInclusionProof memory_transactionProof ) _preStateRoot 是之前的世界状态的 Merkle 树根。通过 _preStateRootBatchHeader 和 _preStateRootProof 可以验证某个状态是在 StateCommitmentChain 上。 require( ovmStateCommitmentChain.verifyStateCommitment( _preStateRoot, _preStateRootBatchHeader, _preStateRootProof ), "Invalid pre-state root inclusion proof." ); _transction 信息是需要验证的交易信息。通过 _txChainElement,_transactionBatchHeader 以及 _transactionProof 可以验证某个交易是否在 CanonicalTransactionChain 上。 (责任编辑:admin) |