交易的五个阶段
交易会经历五个阶段:存储阶段(storage phase)、贷记阶段(credit phase)、核算阶段(computation phase)、行动阶段(action phase)和回响阶段(bounce phase)
存储阶段:主链向合约收取租金,租金以每比特每秒的价格计算。
贷记阶段:将信息中attached balance余额贷记给合约的阶段。
核算阶段:TVM 执行代码并验证每个操作,同时跟踪gas usage。
行动阶段:智能合约记录并更新到新状态,并处理一些对外信息。
回响阶段:在合约失败且传入信息带有 "可回响 "标记的情况,这意味着在这一阶段,如果出现任何error,并且传入的余额中还有剩余的钱,那么合约就会创建回响信息返回给发件人,将钱退回。
首先一个合约想要改变自身的状态,必须收到一条消息。即所谓的接收信息。
接收到的信息有两种:外部消息,内部信息。
外部消息 - 从链的角度来看,不知从何而来的一组数据字符串。
-这些数据本身未经验证。
-它不附带Toncoins。
-它可以包含合同发起者书写的任何内容。
合约的工作就是理解这些数据,并在其代码中对其进行解析。
内部消息 - 合约之间传递的消息。
这种消息的结构更丰富。
-内部消息可以携带余额,Toncoins。
-发送方的合约地址对内部信息有安全认证,TON的架构保障了信息和发送方地址之间一定无误。
处理信息和opcode
合约一旦收到消息,它可能会对外部还是内部,不同的消息做出不同的反应。两种消息都包含了消息发起者的任意的payload data,如果合约想要处理不同种类的消息,它会用到一种叫做opcode的东西。
opcode:操作码。在消息中的四字节前缀,用来指示合同应该支持的操作类型。
一笔TON上的交易的本质,是一系列合约状态的改变。消息本身不是交易,只是一笔交易的输入。
接下来细致的拆解下交易中的每个流程都发生了什么。
存储阶段(storage phase):先减去合约自上次交易后到目前为止,存储的字节数和时间来扣除存储的费用,如果资金不足,合约将转入冻结状态,在有限的时间内保持其状态。
贷记阶段(credit phase):将传入信息中附带的toncoins,贷记到合约中。
核算阶段(computation phase):这一步是编写的程序开始运行的阶段,TVM将执行代码,验证每一步的操作,保障gas usage不会超额使用。
行动阶段(action phase):在这一步骤中最重要的就是合约的新状态。合约可能会在代码执行结束时或者任意的过程中为自己创建新状态和新存储内容,这些都会在合约被成功执行后记录下来,并且还会有一些对外发出的消息被创建。
回响阶段(bounce phase):如果合约执行失败,且传入消息带有 "可跳转 "标志,则会发生这种情况。这意味着在这一阶段,如果出现任何失败,并且收到的信息中还有剩余的钱,那么合约就会向发件人发送出站信息,将钱退回。这是一种安全功能,可以让人们在出现任何错误或合同内部出现任何故障的情况下取回大部分资金。
总结一下关于交易的事项:
合约接收到的信息可以是内部信息,也可以是外部信息。
内部信息可以携带资金,并可以通过发送合约的地址进行验证,而外部信息本身根本无法验证,需要由合约来创建验证。
交易的执行要经过五个阶段。
存储阶段,收取租金。
贷记阶段,将收到的币贷记到余额中。
计算阶段,执行代码。
行动阶段,更新存储和发送信息。
回响阶段,合约处理失败并将币发回给发送方。