0.2.7 2022年8月16日
0.2.6 2022年8月13日
0.2.2 2022年7月22日
0.1.7 2022年7月9日
0.1.0 2022年5月26日

#aptos 中排名 33

每月下载次数 32
70 个crate中使用(直接使用30个)70 个crate

Apache-2.0

1.5MB
28K SLoC


id: vm-runtime title: MoveVM 运行时 custom_edit_url: https://github.com/aptos-labs/aptos-core/edit/main/language/move-binary-format/vm-runtime/README.md

MoveVM 运行时

MoveVM 运行时是 Move 字节码格式的验证和执行引擎。运行时以两种模式导入和加载:验证模式(由 准入控制内存池 组件)和执行模式(由 执行 组件)。

概述

MoveVM 运行时是一种堆栈机器。VM运行时接收输入为 区块,它是一个包含 交易脚本数据视图 的列表。数据视图是给定版本(即,区块高度)区块链中数据和代码的 只读 快照。在启动时,运行时没有加载任何代码或数据。它实际上是 “空的”

每次交易都在Aptos账户的上下文中执行,具体来说是交易提交者的账户。每次交易执行包含三个部分:账户序言、交易本身和账户尾声。这是运行时已知且唯一执行的交易流程。运行时负责从区块中加载单个交易并执行交易流程。

  1. 交易序言 - 在验证模式下,运行时会对交易脚本运行字节码验证器,并执行在Aptos账户模块中定义的序言。序言负责检查交易结构,并拒绝明显不良的交易。在验证模式下,根据序言的执行结果,运行时会返回successfailure的状态。序言永远不会对区块链状态进行任何更新。
  2. 交易执行 - 在执行模式下,验证之后,运行时开始执行特定于交易/客户端代码。典型的代码会对区块链中的数据进行更新。VM运行时执行交易会产生一个写集,该写集作为从区块链当前状态(通过数据视图接收)到新版本的原子状态变化,新版本是应用写集的结果。重要的是,在交易执行期间,链上数据永远不会被更改。此外,虽然写集是执行字节码的结果,但VM不会将这些更改应用到全局区块链状态——这是执行模块的责任。
  3. 交易尾声 - 在执行模式下,执行Aptos账户模块中定义的尾声以根据用户提交的交易执行结果执行操作。这样的一个操作示例是从提交账户的余额中扣除交易的费用。

在执行过程中,运行时会通过数据视图加载引用的代码来解决代码引用。可以将这个过程视为类似于链接。然后,在事务块(事务列表与数据视图的组合)的上下文中,运行时会缓存块内事务之间的代码和链接/导入的模块。运行时会跟踪每个事务块中从一项交易到下一项交易的状态变化(数据更新);块执行的语义指定了事务是顺序执行的,因此,每个块中先前交易的状态变化必须对块内的后续交易可见。

实现细节

  • 运行时顶级结构位于runtimediem vm相关代码中。
  • 交易流程在process_txn模块中实现。
  • 代码缓存逻辑和政策在code cache目录下定义。
  • 运行时加载的代码和运行时类型系统视图在loaded data目录下定义。
  • 值的表示和数据生成写集的逻辑可以在valuedata cache文件中找到。

文件夹结构

.
├── src                 # VM Runtime files
│   ├── code_cache      # VM Runtime code cache
│   ├── loaded_data     # VM Runtime loaded data types, runtime caches over code
│   ├── unit_tests      # unit tests
├── vm-cache-map        # abstractions for the code cache

此模块与之交互

该包主要用在两个部分:AC和mempool用它来确定是否接受一个交易;执行器运行MoveVM运行时来执行签名交易中的程序字段,并将其转换为TransactionOutput,其中包含执行器需要将其修补到区块链的writeset,这是此交易的副作用。

依赖项

~53–71MB
~1.5M SLoC