交易信封
每笔 ZooBC 交易,无论类型如何,都是一个布局相同的字节串,称为信封。该类型自有的数据放在一个单独的字段里,即交易体;其余一切(谁发送、谁接收、手续费、时间、可选的消息)由全部 73 种类型共用。了解信封,就足以读取任何交易、为其计价并对其进行检查。
按顺序排列的字段
| 字段 | 大小 | 说明 | |
|---|---|---|---|
| 类型 | 4 字节,小端序 | [[transactions | 交易类型]]编号 |
| 版本 | 1 字节 | 1、2 或 3 | |
| 时间戳 | 8 字节 | Unix 秒 | |
| 发送方 | 一个地址 | ||
| 接收方 | 一个地址 | 或 4 字节的空标记 02 00 00 00 | |
| 手续费 | 8 字节 | 以原子单位计 | |
| 存续 | 8 字节 | 版本 2 和 3 | |
| 到期 | 4 字节 | 版本 3 | |
| 交易体 | 4 字节长度,后接交易体 | 最多 65,536 字节 | |
| 托管部分 | 可变 | 或 4 字节的空标记 | |
| 消息 | 4 字节长度,后接消息 | 可选 | |
| 签名 | 可变 | 始终位于最后 |
地址由 4 字节的类型编号后接载荷构成:原生 ZBC_ 账户共 36 字节,以太坊账户共 24 字节(见 账户与地址)。每个金额都是整数个原子单位,1 ZBC 等于 100,000,000 个原子单位。
缺少的东西
没有燃气(gas)上限,因为没有需要计量的虚拟机:每种类型都是一条固定规则,其价格在签名之前就已知。没有链 id 字段:签名改为覆盖该链的创世区块哈希(见 签署交易)。也没有 nonce 字段:链在自己的状态中保存每个发送方的 nonce。
版本
- 版本 1 没有存续字段。
- 版本 2 增加了存续字段。
- 版本 3 还增加了到期字段,用来设定交易保持有效的时长(见 有效期与时间戳)。
声明了存续押金的版本 1 交易会被拒绝,声明了有效期的版本 1 或 2 交易也会被拒绝:它们的字节中没有容纳这些内容的位置。
存续、交易体、托管部分和消息
- 存续要么为 0,要么至少为 10,000,000 原子单位(0.1 ZBC)。它会开启一条存续记录,让交易在常规修剪之后仍被保存,而且它从不退还(见 付费保存数据(存续))。在消息中携带外部链已签名交易的交易不得支付存续押金。
- 交易体最多 65,536 字节,按其类型所定义的方式排布。
- 托管部分只能由 SendZBC 和 TransferToken 携带;它把这笔付款变成托管。
- 消息为明文时最多 256 字节,且不得含零字节;加密时最多 320 字节(加密消息以“ZBE1”开头);携带来自以太坊、Solana 或比特币的外部链原生交易时最多 4,096 字节。
手续费字段
手续费以原子单位声明,且必须至少等于该交易的下限:0.025 ZBC 的基础操作费乘以已注册节点投票决定的手续费系数,再加上每个已注册节点都要保存的交易体和消息字节的费用。由于下限只取决于交易本身和链的参数,钱包可以在签名之前用 GET /api/v1/blockchain/estimate-fee 向任何节点查询。
低于下限的手续费会被拒绝,包含这种交易的区块无效。声明中高于下限的部分会在同一区块中退还给付款方,因此不小心多付不会有任何损失。不转移任何东西的 Empty 类型仍须支付高于零的手续费,而已注册节点为网络执行的少数职责交易,例如存储证明和事件见证,必须声明恰好为 0 的手续费。手续费 一文解释了计算公式、退还规则以及手续费的去向。