交易是修改分块状态的命令。 除其他事项外,交易用于发送付款,将订单输入分布式交易所,更改帐户设置以及授权另一个帐户持有您的货币。 如果将分块视为数据库,则交易是SQL命令。

说明

每个交易都具有以下属性:

源帐户

这是发起交易的帐户。 交易必须由此帐户签署,交易费必须由此帐户支付。 此交易的序列号基于此帐户。

交易费

每笔交易都设定由源帐户支付的交易费。 如果此交易费低于网络最低交易费,则交易将失败。 交易中的操作越多,所需交易费就越大。

序列号

每个交易都有一个序列号。 在处理每个帐户的交易时,交易遵循严格的排序规则。 要使交易有效,序列号必须比应用交易时存储在源帐户条目中的序列号大1。 应用交易时,源帐户的存储序列号在应用操作之前递增1。 如果帐户上的序列号为4,则传入的交易的序列号应为5。应用交易后,帐户上的序列号将改变为5。

请注意,如果具有相同源帐户的多个交易使其进入同一交易集,则会根据序列号对它们进行排序和应用。 例如,如果提交了3个交易且帐户序列号为5,则交易必须具有序号6,7和8。

操作列表

交易中包含任意操作列表。 通常只有一个操作,但可能有多个(最多100个)。 操作按顺序执行为一个ACID交易,这意味着要么应用所有操作,要么不应用任何操作。 如果任何操作失败,则整个交易失败。 如果操作是在源帐户以外的帐户上进行的,则需要对相关帐户进行签名。

签名列表

一个交易最多可以附加20个签名。 有关更多信息,请参阅多方签名。 如果交易包含授权交易不需要的签名,则该交易被视为无效 - 不允许使用多余的签名。

需要签名来授权操作并授权更改源帐户(交易费和序列号)。

Meno

可选备忘录包含可选的额外信息。 客户有责任解释此值。 备忘录可以是以下类型之一:

  • MEMO_TEXT : 使用ASCII或UTF-8编码的字符串,最长28个字节。
  • MEMO_ID : 64位无符号整数。
  • MEMO_HASH : 一个32字节的哈希值。
  • MEMO_RETURN : 一个32字节的散列,旨在被解释为发送者退款的交易的散列。

时间限制

可选由此交易有效时的下限和上限的UNIX时间戳(以秒为单位),由分块时间确定。 如果交易过早或过晚,则无法进入交易集。 maxTime等于0表示它未设置。

交易集

在分块关闭之间,网络中的所有节点都在收集交易。 当需要关闭下一个分块时,节点会将这些交易收集到交易集中。 SCP由网络运行以就哪个交易设置应用于最后一个分块达成协议。

生命周期

  1. Creation: 用户创建一个交易,填写所有字段,给它正确的序列号,添加它想要的任何操作,等等。尝试使用js-stellar-sdk
  2. Signing: 交易完成后,必须收集所有需要的签名并将其添加到交易信封中。 通常它只是执行交易的帐户的签名,但更复杂的设置可能需要收集来自多方的签名。 见多方签名
  3. Submitting: 签名后,交易应该有效,现在可以提交给POCChain网络。 交易通常使用horizon提交,但您也可以将交易直接提交给POCChain实例。
  4. Propagating(传播): 一旦POCChain接收到由用户或其他POCChain提供的交易,它会进行初步检查以查看交易是否有效。 在其他检查中,它确保交易正确形成并且源帐户足以支付交易费用。 POCChain不检查需要检查分块状态的内容,而不是查找源帐户 - 例如,交易尝试发送的目标帐户存在,该帐户有足够的此资产可供出售, 这是一条有效的道路。 如果初步检查通过,则POCChain将交易传播到它所连接的所有其他服务器。 这样,有效的交易就会传播到整个POCChain网络。
  5. Including in a transaction set (包括在交易集中): 当关闭分块时,POCChain会收集自上次分块关闭以来所听到的所有交易,并将它们收集到交易集中。 如果它现在听到任何传入的交易,它会将它们放在一边以便下一个分块关闭。 POCChain提名它收集的交易集。 SCP解决了所提议的各种交易集之间的差异,并决定了网络将应用的一个交易集。
  6. Application: 一旦SCP就特定交易集合同,该集合就会应用于分块。 此时,对于该集合中的每个交易,都会从源帐户中收取费用。 按照它们在交易中发生的顺序尝试操作。 如果任何操作失败,则整个交易将失败,并回滚该交易中先前操作的影响。 应用集合中的所有交易后,将创建新的分块并重新开始流程。

可能的错误

交易可能会因下表中的一个错误而失败。 操作的错误参考可以在操作列表doc中找到。

错误 编号 说明
FAILED -1 其中一个操作失败(检查错误操作列表)。
TOO_EARLY -2 在交易中minTime值之前的Ledger closeTime
TOO_LATE -3 交易中的maxTime值之后的Ledger closeTime
MISSING_OPERATION -4 未指定任何操作。
BAD_SEQ -5 序号与源帐号不匹配。
BAD_AUTH -6 有效签名/网络错误太少。
INSUFFICIENT_BALANCE -7 交易费会使帐户低于最低储备金
NO_ACCOUNT -8 找不到来源帐户。
INSUFFICIENT_FEE -9 交易费太少。
BAD_AUTH_EXTRA -10 未使用的签名附加到交易。
INTERNAL_ERROR -11 出现未知错误。