ZooBC 维基
交易

交易

交易是发给链的一条经过签名的指令:向某人付款、发行代币、下单、把一个地址关联到一个组。ZooBC 没有运行用户代码的虚拟机。每项功能都是一种内置的交易类型,带有固定的规则,所有节点都以完全相同的方式执行,因此钱包在签名之前就知道一笔交易能做的一切,以及它的最低手续费是多少。

内置类型

从 0.5.8 版本起,ZooBC 定义了 73 个交易类型编号(含类型 0),分为十二个家族。

十二个图块,每个交易类型家族一个,各标有其类型数量,合计 73
十二个图块,每个交易类型家族一个,各标有其类型数量,合计 73

类型编号等于组号加上 256 乘以子类型,因此编号是稀疏的:2 是 NodeRegistration,258(第 2 组,子类型 1)是它的更新。链未定义的编号会被拒绝,而每个已定义的类型从第 1 个区块起就被接受。

有两个编号比较特殊。类型 0 即 Empty,不转移任何东西:它的存在是为了携带一条消息,它仍须支付高于零的手续费,并且不会增加发送方的 nonce(链为每个发送方保存的计数器)。类型 53 即 CancelLongevity 已停用:每条链都拒绝它,改用 CloseLongevity(309)。

一笔交易的历程

  1. 钱包构建信封(所有类型都采用相同的布局),并针对一条链对其进行签署。
  2. 钱包用 POST /api/v1/transactions 提交签名后的字节。HTTP 202 表示节点已把交易接纳进其交易池,并不表示交易已进入区块。重复发送相同的字节是安全的:副本会被标记为重复。
  3. 节点把交易继续转发,由某个出块者把它打包进区块。一个区块最多容纳 2,000 笔交易和 524,288 字节的载荷,并且每个账户最多一笔交易(见 每个账户每个区块一笔交易与批量交易)。
  4. GET /api/v1/transactions/<hash>/status 报告其进度:staging、mempool(附带排队位置)、confirmed(附带区块高度)、rejected(附带原因)或 not_found。

如果在有效窗口内没有任何区块打包这笔交易,它就会过期(见 有效期与时间戳)。

状态在此期间发生变化时

在签名与被打包进区块之间,其他交易可能改变这笔交易所依赖的东西:托管已被结算,报价已被别人接受,代币已过期。这样的交易会成为付费空操作:它被打包进区块,支付手续费,但不改变其他任何东西。该区块在每个节点上都保持有效,因此没有人能通过发送即将过时的交易来拖停链。

只有每个节点都以相同方式看到的故障才会使区块无效,例如错误的签名、低于下限的手续费(见 手续费),或超过发送方余额的付款。

本类别的文章

另见

本主题下的文章