交易
交易是发给链的一条经过签名的指令:向某人付款、发行代币、下单、把一个地址关联到一个组。ZooBC 没有运行用户代码的虚拟机。每项功能都是一种内置的交易类型,带有固定的规则,所有节点都以完全相同的方式执行,因此钱包在签名之前就知道一笔交易能做的一切,以及它的最低手续费是多少。
内置类型
从 0.5.8 版本起,ZooBC 定义了 73 个交易类型编号(含类型 0),分为十二个家族。
类型编号等于组号加上 256 乘以子类型,因此编号是稀疏的:2 是 NodeRegistration,258(第 2 组,子类型 1)是它的更新。链未定义的编号会被拒绝,而每个已定义的类型从第 1 个区块起就被接受。
有两个编号比较特殊。类型 0 即 Empty,不转移任何东西:它的存在是为了携带一条消息,它仍须支付高于零的手续费,并且不会增加发送方的 nonce(链为每个发送方保存的计数器)。类型 53 即 CancelLongevity 已停用:每条链都拒绝它,改用 CloseLongevity(309)。
一笔交易的历程
- 钱包构建信封(所有类型都采用相同的布局),并针对一条链对其进行签署。
- 钱包用
POST /api/v1/transactions提交签名后的字节。HTTP 202 表示节点已把交易接纳进其交易池,并不表示交易已进入区块。重复发送相同的字节是安全的:副本会被标记为重复。 - 节点把交易继续转发,由某个出块者把它打包进区块。一个区块最多容纳 2,000 笔交易和 524,288 字节的载荷,并且每个账户最多一笔交易(见 每个账户每个区块一笔交易与批量交易)。
GET /api/v1/transactions/<hash>/status报告其进度:staging、mempool(附带排队位置)、confirmed(附带区块高度)、rejected(附带原因)或 not_found。
如果在有效窗口内没有任何区块打包这笔交易,它就会过期(见 有效期与时间戳)。
状态在此期间发生变化时
在签名与被打包进区块之间,其他交易可能改变这笔交易所依赖的东西:托管已被结算,报价已被别人接受,代币已过期。这样的交易会成为付费空操作:它被打包进区块,支付手续费,但不改变其他任何东西。该区块在每个节点上都保持有效,因此没有人能通过发送即将过时的交易来拖停链。
只有每个节点都以相同方式看到的故障才会使区块无效,例如错误的签名、低于下限的手续费(见 手续费),或超过发送方余额的付款。
本类别的文章
- 交易信封:每笔交易携带的字段及其手续费。
- 签署交易:链绑定摘要,以及可以签名的密钥类型。
- 有效期与时间戳:已签名的交易能保持有效多久。
- 每个账户每个区块一笔交易与批量交易:每个账户每个区块一笔交易,以及批量交易。
- 托管:由链保管、直到审批人作出决定的付款。
- 多重签名:只有凭多个签名才能花费的账户。
- 流动支付(流式支付):在若干分钟内以流的方式付给接收方的钱。
- 定时转账:只签名一次的一系列付款。
- 触发器与见证:在某个高度或某个事件之后释放的钱。
- 账户组:共享同一个账户的多个地址。
另见
本主题下的文章
- 交易信封
每笔 ZooBC 交易按顺序携带的字段、每个字段存放什么,以及有意缺少的东西,例如燃气(gas)上限或链 id。 - 多重签名
ZooBC 多重签名账户如何只在规定数量的参与方签名之后才能花费,即使这些参与方使用的是不同链的密钥。 - 定时转账
一笔 ZooBC ScheduledTransfer 如何设置一系列以 ZBC 或代币进行的付款,资金可以预先锁定,也可以在到期时拉取,以及它如何被取消或重定向。 - 托管
ZooBC 付款如何由链保管,直到指定的审批人作出决定;它的四种可能结局、费用,以及由收款方发起的托管请求。 - 有效期与时间戳
为什么每笔 ZooBC 交易都携带自己的时间,它能保持有效多久(默认一小时,最长一天),以及区块和结算如何使用时间。 - 每个账户每个区块一笔交易与批量交易
为什么 ZooBC 区块只能携带每个账户的一笔交易,以及批量交易如何让一个账户在单笔交易中完成多笔支付或转账。 - 流动支付(流式支付)
ZooBC 流动支付如何在若干分钟内把 ZBC 或代币以流的方式付给接收方,以及任何一方如何以公平的拆分来停止它。 - 签署交易
ZooBC 签名覆盖哪些内容,交易的哈希和 id 如何得出,哪些密钥类型可以签名,以及外部链的钱包如何签署其本链的交易。 - 触发器与见证
ZooBC 触发器如何把 ZBC 锁定到未来某个区块高度或外部世界的某个事件发生时,以及已注册节点如何通过见证来裁定事件。 - 账户组
ZooBC 账户组如何让任何密钥类型的多个地址共享同一个余额,并由一名控制者决定每个成员可以花费多少。