4 个版本
0.0.1-sol5 | 2020 年 5 月 1 日 |
---|---|
0.0.1-sol4 | 2019 年 10 月 25 日 |
0.0.0 | 2019 年 8 月 6 日 |
0.0.0-sol15 | 2019 年 7 月 27 日 |
#14 in #libra
45 每月下载次数
用于 7 个crate (4 直接使用)
1.5MB
35K SLoC
id: vm-runtime title: MoveVM 运行时 custom_edit_url: https://github.com/libra/libra/edit/master/language/vm/vm_runtime/README.md
MoveVM 运行时
MoveVM 运行时是 Move 字节码格式的验证和执行引擎。运行时以两种模式导入和加载:验证模式(由准入控制和内存池组件)和执行模式(由执行组件)。
概述
MoveVM 运行时是一种栈式机器。虚拟机运行时接收作为输入的 区块,它是一系列 事务脚本 和一个 数据视图。数据视图是给定版本(即,区块高度)区块链中数据和代码的 只读 快照。启动时,运行时没有加载任何代码或数据。它实际上是 “空” 的。
每个事务都在 Libra 账户 的上下文中执行——具体来说,是事务提交者的账户。每个事务的执行包括三个部分:账户序言、事务本身和账户尾声。这是运行时所知的唯一事务流程,也是运行时执行的唯一流程。运行时负责从区块中加载单个事务并执行事务流程。
- 交易序言 - 在验证模式下,运行时会在交易脚本上运行字节码验证器,并执行在Libra 账户模块中定义的序言。序言负责检查交易结构并拒绝明显错误的交易。在验证模式下,运行时根据序言的运行结果返回
success
或failure
状态。序言永远不会对区块链状态进行任何更新。 - 交易执行 - 在执行模式下,验证通过后,运行时开始执行特定于交易/客户端的代码。典型的代码会对区块链中的数据进行更新。VM运行时执行交易会产生一个写集,该写集作为从当前区块链状态(通过数据视图接收)到新版本的状态变化,该新版本是应用写集的结果。重要的是,在执行交易的过程中,链上数据永远不会改变。此外,虽然写集是在执行字节码时产生的,但VM不会将更改应用到全局区块链状态——这是执行模块的责任。
- 交易尾声 - 在执行模式下,执行在Libra 账户模块中定义的尾声,以根据用户提交的交易执行结果执行操作。一个这样的操作示例是从提交账户的余额中扣除交易的费用。
在执行过程中,运行时会通过数据视图加载引用的代码来解决代码引用。可以将这个过程想象成类似于链接。然后,在交易块(一系列交易与数据视图的列表)的上下文中,运行时会缓存跨交易之间的代码和链接/导入的模块。运行时跟踪每个交易块中从一交易到另一交易的状态变化(数据更新);执行一个块的定义规定,交易是顺序执行的,因此前一个交易的状态变化必须对块内后续交易可见。
实现细节
- 运行时的顶级结构体位于
runtime
和libra vm
相关代码中。 - 交易流程在
process_txn
模块中实现。 - 解释器在 事务执行器中实现。
- 代码缓存逻辑和政策定义在 代码缓存 目录下。
- 运行时加载的代码和运行时的类型系统视图定义在 加载数据 目录下。
- 值的表示和数据集生成逻辑可以在 value 和 数据缓存 文件中找到。
文件夹结构
.
├── 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运行时,将签名交易转换为事务输出,并将其作为此交易的副作用写入区块链。
依赖项
~24–37MB
~596K SLoC