4 个版本

0.0.1-sol52020 年 5 月 1 日
0.0.1-sol42019 年 10 月 25 日
0.0.0 2019 年 8 月 6 日
0.0.0-sol152019 年 7 月 27 日

#14 in #libra

45 每月下载次数
用于 7 个crate (4 直接使用)

Apache-2.0

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 账户 的上下文中执行——具体来说,是事务提交者的账户。每个事务的执行包括三个部分:账户序言、事务本身和账户尾声。这是运行时所知的唯一事务流程,也是运行时执行的唯一流程。运行时负责从区块中加载单个事务并执行事务流程。

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

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

实现细节

  • 运行时的顶级结构体位于 runtimelibra 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