0.2.7 |
|
---|---|
0.2.6 |
|
0.2.2 |
|
0.1.7 |
|
0.1.0 |
|
在 #aptos 中排名 33
每月下载次数 32
在 70 个crate中使用(直接使用30个)70 个crate
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账户的上下文中执行,具体来说是交易提交者的账户。每次交易执行包含三个部分:账户序言、交易本身和账户尾声。这是运行时已知且唯一执行的交易流程。运行时负责从区块中加载单个交易并执行交易流程。
- 交易序言 - 在验证模式下,运行时会对交易脚本运行字节码验证器,并执行在Aptos账户模块中定义的序言。序言负责检查交易结构,并拒绝明显不良的交易。在验证模式下,根据序言的执行结果,运行时会返回
success
或failure
的状态。序言永远不会对区块链状态进行任何更新。 - 交易执行 - 在执行模式下,验证之后,运行时开始执行特定于交易/客户端代码。典型的代码会对区块链中的数据进行更新。VM运行时执行交易会产生一个写集,该写集作为从区块链当前状态(通过数据视图接收)到新版本的原子状态变化,新版本是应用写集的结果。重要的是,在交易执行期间,链上数据永远不会被更改。此外,虽然写集是执行字节码的结果,但VM不会将这些更改应用到全局区块链状态——这是执行模块的责任。
- 交易尾声 - 在执行模式下,执行Aptos账户模块中定义的尾声以根据用户提交的交易执行结果执行操作。这样的一个操作示例是从提交账户的余额中扣除交易的费用。
在执行过程中,运行时会通过数据视图加载引用的代码来解决代码引用。可以将这个过程视为类似于链接。然后,在事务块(事务列表与数据视图的组合)的上下文中,运行时会缓存块内事务之间的代码和链接/导入的模块。运行时会跟踪每个事务块中从一项交易到下一项交易的状态变化(数据更新);块执行的语义指定了事务是顺序执行的,因此,每个块中先前交易的状态变化必须对块内的后续交易可见。
实现细节
- 运行时顶级结构位于
runtime
和diem vm
相关代码中。 - 交易流程在
process_txn
模块中实现。 - 代码缓存逻辑和政策在code cache目录下定义。
- 运行时加载的代码和运行时类型系统视图在loaded data目录下定义。
- 值的表示和数据生成写集的逻辑可以在value和data 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