拓冰建站拓冰建站
首页 / 资讯中心 / 正文

Aptos VM 运行时深度解析:AptosVM 单交易执行、交易模拟与区块级并行执行

Aptos VM 运行时深度解析AptosVM 单交易执行、交易模拟与区块级并行执行【免费下载链接】aptos-coreAptos is a layer 1 blockchain built to support the widespread use of blockchain through better technology and user experience.项目地址: https://gitcode.com/GitHub_Trending/ap/aptos-core本文基于 aptos-move/aptos-vm/README.md 及aptos-vmcrate 源码系统讲解 Aptos 链上虚拟机VM的三大核心组件——AptosVM单交易执行、AptosSimulationVM交易模拟与AptosVMBlockExecutor区块执行——的运行机制并深入剖析一条用户交易从 Prologue 校验、字节码验证、执行到 Epilogue 计费的完整生命周期。读完本文你将掌握 Aptos 交易的执行管线、失败处理路径discard 与 abort以及 Block-STM 并行执行背后的代码级实现位置可直接对照仓库源码继续深入。一、AptosVM 是什么Aptos 链上的交易执行引擎aptos-vm是 Aptos 链的虚拟机运行时 crate见 Cargo.toml包描述为 Aptos VM runtime。从架构定位上看它位于 Move 通用运行时move-vm-runtime之上将 Move 语言层的执行能力与 Aptos 链层的账户、Gas、状态与区块执行模型耦合在一起。aptos-vm的核心职责有三AptosVM执行单条Aptos 交易既包括普通用户交易也包括系统交易如BlockMetadata、StateCheckpoint、Validator 交易等AptosSimulationVM在真实网络提交交易之前进行模拟执行用于 Gas 估算、签名验证等预检场景AptosVMBlockExecutor执行一个区块内的一批已通过签名验证的交易可基于配置选择顺序执行或通过 Block-STM 并行执行。从依赖关系看Cargo.tomlaptos-vm直接依赖move-vm-runtimeMove 底层运行时、aptos-block-executor区块执行器、aptos-gas-meter/aptos-gas-scheduleGas 计量、aptos-vm-typesVM 输出与变更集类型、aptos-framework-natives框架原生函数等组件是连接 Move 语言运行时与 Aptos 链层的关键胶水层。二、用户交易执行的四个阶段Prologue → Execution → Aborted → EpilogueREADME 明确指出对于每一条用户交易AptosVM 都会依次执行以下步骤Prologue前置校验检查交易结构本身包括签名验证、对支付本笔交易 Gas 的账户进行余额检查等。若 Prologue 检查失败交易会被丢弃discarded且不会对区块链状态产生任何更新。Execution执行运行交易指定的代码——可以是脚本Script或入口函数Entry Function。若交易负载是脚本则执行前需通过 Move 字节码验证器bytecode verifier验证若负载是入口函数则直接从代码缓存code cache加载这保证了所加载代码已被验证。代码验证并加载完成后检查交易参数随后通过 AptosVM 所包装的 MoveVM 执行负载。执行成功则产出一个变更集change set——该变更集可以但尚未应用到区块链状态。Aborted execution中止处理若执行未成功AptosVM 会检查该用户交易是否需要创建一个账户即赞助账户创建sponsored account creation 场景详见 AIP-52 的细节。Epilogue收尾用户交易的后处理主要用于收取 Gas。后处理运行在带临时变更的区块链状态之上即执行阶段产生的临时写入之上。若交易耗尽 Gas则 Epilogue 会在干净状态clean state上重新运行一次。最终产出最终变更集其中既包含 Execution 阶段产生的写入也包含 Epilogue 阶段产生的写入。这四阶段在源码中有清晰的对应物位于 src/move_vm_ext/session/user_transaction_sessions/ 目录阶段源码文件职责Prologueprologue.rs前置校验签名、账户余额、序列号等Executionuser.rs用户代码执行会话Abortedabort_hook.rs执行失败后的账户创建检查等钩子Epilogueepilogue.rs后处理与 Gas 收取最终变更集的组合逻辑见 session_change_sets.rsSystemSessionChangeSet/UserSessionChangeSet它负责把执行阶段与收尾阶段的写入合并为可提交的变更集。2.1 失败的两种命运Discard 与 Abort需要特别注意 README 强调的一个关键语义Prologue 失败 丢弃discard无任何状态更新。这是 Aptos 交易安全模型的重要边界——校验类错误不允许留下任何痕迹。而执行阶段失败则不同交易被**保留keep**但只收 Gas执行产生的写入不会生效。该语义在 src/lib.rs 的流程图中以keep, only charge gas明确标注并在 src/errors.rs 的discarded_output等工具函数中落地丢弃的交易产出空输出discarded_output不携带任何写入集。三、交易生命周期全景Validate → Verify → Execute除了 README 中的四阶段描述src/lib.rs 的模块文档中还绘制了一幅完整的单交易处理流程图将其划分为三大区域Validate校验区检查签名check signature检查大小与 Gascheck size and gas运行 Prologuerun prologue。任何校验错误validation error都会进入discard, no write set分支。Verify验证区反序列化脚本并验证参数deserialize script, verify arguments反序列化模块deserialize modules验证脚本与模块verify scripts and modules。验证错误verification error同样进入 discard 分支。Execute执行区执行主逻辑execute main运行 Epiloguerun epilogue生成写入集make write set。此处存在两条分岔invariant violation内部 panic→ discardexecution failure执行失败→ keep, only charge gas仅收 Gas成功路径 →keep, transaction executed gas charged保留并收取 Gas。这幅图与 README 的四阶段划分互为印证Validate 区对应 Prologue 阶段Verify 区对应脚本字节码验证/入口函数从缓存加载环节Execute 区对应执行与 Epilogue 阶段。四、核心实现AptosVM 的入口方法AptosVM主体定义在 src/aptos_vm.rs该文件约 3900 行其核心入口包括execute_user_transactionL2485单条用户交易的顶层入口接收resolver状态解析器、code_storage代码存储、SignedTransaction、日志上下文与AuxiliaryInfo内部委托给execute_user_transaction_with_custom_gas_meter并使用生产级 Gas 计量器make_prod_gas_meter计量成功返回(VMStatus, VMOutput)失败则返回discarded_output构造的空输出。execute_single_transactionL3275面向区块执行场景的单交易执行入口供AptosExecutorTask在区块执行时逐条调用。execute_write_setL2525处理系统交易中的WriteSetPayload直写变更集或脚本形式用于治理、创世等系统操作。围绕执行路径aptos-vm还提供了若干验证子模块src/verifier/transaction_arg_validation.rs交易参数的合法性检查event_validation.rs事件写入校验native_validation.rs原生函数调用校验resource_groups.rs资源组resource group相关校验view_function.rs视图函数View Function只读查询判定。此外src/keyless_validation.rs 承担 Keyless 账户的验证逻辑src/transaction_validation.rs 与 transaction_validation_versioned.rs 实现验证接口src/function_usage.rs 记录交易函数调用用量用于后续索引与分析。五、AptosSimulationVM提交前的交易模拟README 指出AptosSimulationVM 用于在真实网络上执行交易之前模拟交易。实现层面它包装wrapsAptosVM并对**多签交易multi-signature transactions**做了少量修改。其定义同样位于 src/aptos_vm.rs并通过 src/lib.rs 的pub use crate::aptos_vm::{AptosSimulationVM, AptosVM};对外导出。模拟执行的价值在于在不产生真实链上状态变更的前提下预演交易执行的 Gas 消耗、输出事件与执行结果供钱包与客户端在提交前向用户展示预估费用或供 API 层的交易模拟接口如/transactions/simulate使用。从依赖关系看Cargo.toml 的 dev-dependencies 包含aptos-transaction-simulation模拟能力与aptos-transaction-simulationcrate 协同工作。六、AptosVMBlockExecutor区块级执行与 Block-STM 并行AptosVMBlockExecutor 用于执行一个区块内已通过签名验证的一批交易并且基于期望的并发度可以顺序执行或通过 Block-STM 并行执行。该能力通过 src/lib.rs 中定义的VMBlockExecutortrait 暴露其关键方法new()创建执行器实例execute_block(...)执行一个交易块并返回每条交易的输出输出长度与输入交易数一致被跳过/丢弃的交易输出为空输出不会直接应用到状态由调用方负责更新状态trait 文档明确强调该约定execute_block_no_limit(...)无区块限制地执行execute_block_sharded(...)分片执行接口默认未实现由ShardedBlockExecutor扩展。VMBlockExecutor的 trait 文档还给出了一条重要提醒若在VMBlockExecutor中保存任何状态如缓存必须确保该状态跨多次执行有效——同一个执行器可能先在新状态上运行再在旧状态上运行。区块执行的并行能力来自 src/block_executor/ 目录其中mod.rs定义AptosVMBlockExecutorWrapper、AptosTransactionOutput等区块执行相关类型vm_wrapper.rs实现AptosExecutorTask实现ExecutorTasktrait其execute_transactionL54是 Block-STM 在并行执行时逐交易调用的核心回调——注释明确说明该函数由 BlockExecutor 为每条待执行交易调用可能是顺序执行的一部分也可能是并行执行中的投机执行speculatively。它内部调用AptosVM::execute_single_transaction并处理三类结果SPECULATIVE_EXECUTION_ABORT_ERROR→ExecutionStatus::SpeculativeFailure并行执行中的投机失败交由 Block-STM 冲突检测重试重配置reconfiguration事件 →Executed { skips_rest: true }跳过区块剩余交易正常结果 →Executed { skips_rest: false }。并行执行的底层支持来自aptos-block-executor依赖见 Cargo.toml它实现了 Block-STM 乐观并发控制各交易投机执行、冲突时回滚重试从而在保证串行化语义的前提下提升吞吐。此外src/sharded_block_executor/ 目录提供了分片执行sharded execution的骨架实现ShardedBlockExecutor与ExecutorClient对应 trait 中的execute_block_sharded接口用于将区块执行扩展到多执行器实例。七、系统交易与用户交易的分流README 开篇即强调 AptosVM 同时执行系统交易和用户交易。系统交易与用户交易的主要差异在于负载类型与执行路径用户交易SignedTransaction负载为脚本或入口函数走四阶段管线系统交易包括BlockMetadata区块元数据、StateCheckpoint状态检查点、ValidatorTransaction验证者交易、BlockEpilogue区块收尾以及WriteSetPayload直写集/脚本写集等。其中WriteSetPayload由execute_write_setL2525处理Direct变体直接采纳写集Script变体则以execute_as账户身份执行脚本生成写集。validator_txns模块src/validator_txns/专门承载验证者交易的执行逻辑。八、Cargo 特性与扩展点aptos-vm/Cargo.toml 声明了三个可选特性供不同使用场景裁剪编译特性作用fuzzing为 Move 核心类型、二进制格式、VM 类型与框架原生函数启用 fuzzing 支持move-core-types/fuzzing等failpoints启用故障注入点fail/failpoints与move-vm-runtime/failpoints用于测试注入人为故障profiling启用move-vm-runtime/profiling支持执行性能剖析testing引入move-unit-test与框架原生函数、VM 环境的测试支持供单元测试与 e2e 测试使用这些特性与 scripts/fail_if_modified_files.sh 等 CI 脚本配合支撑了仓库对 VM 的持续集成验证。aptos-vm的测试还依赖 aptos-move/e2e-move-tests 等上层测试套件通过事务性测试transactional test驱动真实交易执行路径。九、总结从单交易到区块的一体化执行体系将 README 与源码结合可以勾勒出aptos-vm的完整执行体系单交易维度AptosVMPrologue校验→ 代码验证/加载 → 执行 → 中止处理账户创建→ EpilogueGas 收取失败分 discard无状态更新与 keep-only-gas仅收 Gas两种语义预演维度AptosSimulationVM包装 AptosVM针对多签交易微调用于提交前的 Gas 估算与结果预演区块维度AptosVMBlockExecutor通过VMBlockExecutortrait 与AptosExecutorTask接入 Block-STM以顺序或并行方式批量执行已验证交易并支持分片执行扩展。无论哪一层最终产出都是VMOutput与变更集交由存储层决定是否提交。若你想进一步深入建议从 src/aptos_vm.rs 的execute_user_transaction与 src/lib.rs 的流程图读起再结合 user_transaction_sessions 下的 Prologue/Epilogue 实现逐行对照即可完整理解一条 Aptos 交易的链上旅程。【免费下载链接】aptos-coreAptos is a layer 1 blockchain built to support the widespread use of blockchain through better technology and user experience.项目地址: https://gitcode.com/GitHub_Trending/ap/aptos-core创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门