跳到主要内容

TVM 概览

本文提供了TVM如何执行交易的概览。

本文档提供 TVM 如何执行事务的鸟瞰图。

提示

TON 课程:TVM

提示

在开始课程之前,请确保您已充分了解区块链技术的基础知识。如果您的知识有缺口,我们建议您参加区块链基础知识与 TONRU 版本, CHN 版本)课程。

TON Blockchain 课程是TON Blockchain 开发的综合指南。

模块 2 完全涵盖 TVM、事务、可扩展性和业务案例。

检查 TON 区块链课程

中文

以及四种不同的cell类型:

控制寄存器

当某个 TON 链上的账户发生某些事件时,就会引起交易。最常见的事件是 "某些信息的到达",但一般来说也可能有 "滴答"、"合并"、"拆分 "和其他事件。

每个交易最多由 5 个阶段组成:

  1. Storage phase - in this phase, storage fees accumulated by the contract due to the occupation of some space in the chain state are calculated. Read more in Storage Fees.
  2. Credit phase - 在这一阶段,将计算与(可能的)接收信息值有关的合约余额和收取的存储费。
  3. Compute phase - 在此阶段,TVM 正在执行合约(见下文),合约执行的结果是exit_codeactions(序列化的操作列表)、gas_detailsnew_storage和一些其他信息的集合。
  4. Action phase - 如果计算阶段成功,则在此阶段处理计算阶段的 "行动"。具体而言,行动可能包括发送消息、更新智能合约代码、更新库等。请注意,某些操作在处理过程中可能会失败(例如,如果我们尝试发送的消息的 TON 超过合约所拥有的 TON),在这种情况下,整个交易可能会回退或跳过该操作(这取决于操作的模式,换句话说,合约可能会发送 "发送或回退 "或 "尝试发送-如果不忽略 "类型的消息)。
  5. Bounce phase - 如果计算阶段失败(返回 exit_code >=2),在此阶段,将为由传入报文启动的事务生成_反弹报文_。

Compute phase

在此阶段,执行 TVM。

提示

计算阶段跳过

计算阶段包括用正确的输入调用 TVM。在某些情况下,TVM 根本无法调用(例如,账户不存在、未初始化或冻结,正在处理的入站报文没有代码或数据字段,或者这些字段的哈希值不正确)。

相应的 构造函数 反映了这一点:

  • cskip_no_state$00 - 帐户(不存在、未初始化或冻结)和报文中的无状态(即智能合约代码和数据)。

  • cskip_bad_state$01 - 信息中传递的无效状态(即状态的哈希值与预期值不同)到冻结或未初始化的帐户。

  • cskip_no_gas$10 - 没有资金 购买 gas 。(大约 < 0.00004 TON by 08.2024)

TVM 状态

在任何给定时刻,TVM 的状态完全由 6 种属性决定:

  • 堆栈(见下文)
  • Control registers --(见下文)简单地说,这意味着在执行过程中最多可直接设置和读取 16 个变量
  • Current continuation - 描述当前执行的指令序列的对象
  • Current codepage - 简单地说,就是当前运行的 TVM 版本
  • Gas limits - 一组 4 个整数值;当前 gas 限值 gl、最大 gas 限值 gm、剩余 gas 限值 gr和 gas credit gc
  • Library context - 可以由 TVM 调用的库的哈希映射

TVM 的初始化

所有其他寄存器值都将被忽略。

  • Integer(整数) - 有符号的 257 位整数
  • Tuple(元组) - 由最多 255 个元素组成的有序集合,具有任意值类型,可能是不同的。
  • Null(空)

还有四种截然不同的 cell :

  • TVM 指令
  • TON TVM TVM 概念(可能包含过时的信息)
  • Builder(构建器) - 一种特殊的对象,允许您创建新的cell
  • Continuation - 一种特殊对象,可将Cell用作 TVM 指令源

控制寄存器

  • c0 — 包含下一个 continuation 或返回 continuation(类似于常规设计中的子例程返回地址)。此值必须是一个 Continuation。
  • c1 — 包含备用(返回) continuation ;此值必须是一个 Continuation。
  • c2 — 包含异常处理程序。该值是一个 Continuation,每当异常触发时就会调用。
  • c3 — 支持寄存器,包含当前字典,本质上是一个包含程序中使用的所有函数的代码的哈希映射。此值必须是一个 Continuation。
  • c4 — 包含持久数据的根,或简单地说,合约的 data 部分。此值是一个 Cell。
  • c5 — 包含输出操作。该值是一个 cell 。
  • c7 — 包含临时数据的根。它是一个 Tuple。

TVM 的初始化

所有其他寄存器值都将被忽略。

Detailed description of the initialization process can be found here: TVM Initialization

参见

The list of TVM instructions can be found here: TVM instructions.

TVM 执行结果

除了退出代码和消耗的 gas 数据外,TVM 还间接输出以下数据:

  • c4 寄存器 - 将作为智能合约的新 data 存储的cell(如果执行不会在此阶段或以后的阶段回滚)
  • c5 寄存器 - (输出动作列表)列表中最后一个动作和对先前动作的引用的cell(递归)

所有其他寄存器的值都将被忽略。

请注意,由于最大 cell 深度有限制 <1024,特别是 c4 和 c5 深度有限制 <=512,因此一个 tx 中的输出操作数量也有限制 <=255。如果一个合约需要发送的信息超过了这个数量,它可以向自己发送一条带有 continue_sending 请求的信息,并在随后的事务中发送所有必要的信息。

参阅