TVM 概览
本文提供了TVM如何执行交易的概览。
本 文档提供 TVM 如何执行事务的鸟瞰图。
- TVM 源 - TVM C++ 实现
- TVM Retracer
TON 课程:TVM
在开始课程之前,请确保您已充分了解区块链技术的基础知识。如果您的知识有缺口,我们建议您参加区块链基础知识与 TON(RU 版本, CHN 版本)课程。
TON Blockchain 课程是TON Blockchain 开发的综合指南。
模块 2 完全涵盖 TVM、事务、可扩展性和业务案例。
检查 TON 区块链课程
中文
以及四种不同的cell类型:
控制寄存器
当某个 TON 链上的账户发生某些事件时,就会引起交易。最常见的事件是 "某些信息的到达",但一般来说也可能有 "滴答"、"合并"、"拆分 "和其他事件。
每个交易最多由 5 个阶段组成:
- 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.
- Credit phase - 在这一阶段,将计算与(可能的)接收信息值有关的合约余额和收取的存储费。
- Compute phase - 在此阶段,TVM 正在执行合约(见下文),合约执行的结果是
exit_code
、actions
(序列化的操作列表)、gas_details
、new_storage
和一些其他信息的集合。 - Action phase - 如果计算阶段成功,则在此阶段处理计算阶段的 "行动"。具体而言,行动可能包括发送消息、更新智能合约代码、更新库等。请注意,某些操作在处理过程中可能会失败(例如,如果我们尝试发送的消息的 TON 超过合约所拥有的 TON),在这种情况下,整个交易可能会回退或跳过该操作(这取决于操作的模式,换句话说,合约可能会发送 "发送或回退 "或 "尝试发送-如果不忽略 "类型的消息)。
- Bounce phase - 如果计算阶段失败(返回
exit_code >=2
),在此阶段,将为由传入报文启动的事务生成_反弹报文_。
Compute phase
在此阶段,执行 TVM。
- TVM 4.3.5 - TON 区块链论文
计算阶段跳过
计算阶段包括用正确的输入调用 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
请求的信息,并在随后的事务中发送所有必要的信息。
参阅
- TVM Instructions
- TON TVM TVM 概念(可能包含过期信息)