交易

交易 (transaction) 是区块链世界中的一个基础概念。它是与区块链进行交互的一种方式。交易用于改变区块链的状态,也是唯一能够实现这一目的的途径。在 Sui 中,交易被用来调用包中的函数、部署新的包以及升级现有的包。

交易结构

每个交易都明确指定了其操作的对象!

交易包括以下内容:

  • 发送者 - 签署交易的账户
  • 命令列表(或链) - 要执行的操作序列;
  • 命令输入 - 命令的参数:可以是 pure 类型(如数字或字符串),也可以是 object 类型(交易将要访问的对象);
  • Gas 对象 - 用于支付交易费用的 Coin 对象;
  • Gas 价格和预算 - 交易的费用;

命令

Sui 的交易可以包含多个命令。每个命令可以是一个内置命令(如发布一个包),或者是对已发布包中函数的调用。命令按照在交易中列出的顺序依次执行,并且可以使用前面命令的结果,形成一个链条。交易要么完全成功,要么完全失败。

交易的示意图(伪代码)如下:

Inputs:
- 发送者 = 0xa11ce

Commands:
- payment = SplitCoins(Gas, [ 1000 ])
- item = MoveCall(0xAAA::market::purchase, [ payment ])
- TransferObjects(item, sender)

在这个示例中,交易包含三个命令:

  1. SplitCoins - 一个内置命令,从传递的对象(这里是 Gas 对象)中分离出一个新的币;
  2. MoveCall - 调用包 0xAAA 中模块 market 中函数 purchase,传递参数为 payment 对象;
  3. TransferObjects - 一个内置命令,将对象转移给接收者。

交易效果

交易效果是交易对区块链状态所做出的更改。具体来说,交易可以通过以下方式改变状态:

  • 使用 Gas 对象支付交易费用;
  • 创建、更新或删除对象;
  • 发出事件;

执行交易的结果包括不同的部分:

  • 交易摘要 (Transaction Digest) - 交易的哈希,用于标识交易;
  • 交易数据 (Transaction Data) - 交易中使用的输入、命令和 Gas 对象;
  • 交易效果 (Transaction Effects) - 交易的状态和“效果”,具体包括:交易的状态、对象的更新及其新版本、使用的 Gas 对象、交易的 Gas 成本以及交易发出的事件;
  • 事件 (Events) - 交易发出的自定义事件
  • 对象变更 (Object Changes) - 对象的变更,包括所有权的变更;
  • 余额变更 (Balance Changes) - 参与交易账户的总余额变更;