消息
QLYP 签名的是规范的二进制消息,而不是对一笔买卖的松散描述。一个消息信封,少数几种操作,每种操作只有一种写法。
两个分别编写的程序,如何以完全相同的方式读取同样的字节?
每个 QLYP 操作都是一条小型二进制消息,放在一笔普通的 Quantus 交易中,并随该交易一起签名。格式本身是二进制的,校验又排除了歧义:两个正确的实现不可能把同样的字节读成两种意思。
为什么这样设计
两个读取者绝不能产生分歧。 如果一个程序读到「发送 250」,另一个读到「发送 25」,账本就会一分为二。所以格式必须只允许一种读法。
文本格式允许多种写法。 同一个 JSON 对象可以用不同的键顺序、空格或数字形式写出。每种写法都是不同的字节,而签名覆盖的是字节。
所以 QLYP 采用规范二进制。 每个字段都有固定的顺序;整数有固定的宽度,字节串有唯一规范的长度前缀。解码器必须用完每一个字节,并且重新编码后得到完全相同的消息,否则该消息无效。
而且每条消息都写明了它属于哪里。 名称与版本、链的创世信息以及你的序列号,可以阻止一条消息在另一个网络上、在另一个版本下被重放,或在同一个网络上被重放两次。
逐字节解析
- 01 / 05
它以名称和版本开头
每条 QLYP 消息都以四个字节「QLYP」和一个版本字节开头。不以此开头的 remark(备注)根本不是 QLYP 操作,未来的版本也不会被误认为 v1。
- 02 / 05
它指明所在的链
接下来的 32 个字节是网络的创世哈希。为主网签名的消息在测试网络上毫无意义,反之亦然:它无法在另一条链上重放。
- 03 / 05
它为你的操作计数
八个字节以小端序记录你账户的 QLYP 序列号。每个被接受的操作都会使它加一,因此同一条消息不能应用两次。被拒绝的操作不会使它加一。
- 04 / 05
它说明要做什么
一个标签字节决定执行哪种操作:0 部署代币,1 铸造,2 转账,3 向指定买家报价一份代币。标签 4 到 8 为保留标签,目前会被拒绝。
- 05 / 05
然后是确切的字段,仅此而已
字段按固定的规范布局排列,总计不超过 1,024 字节。解码必须消耗每一个字节,重新编码必须还原出相同的字节。每条消息只有一种写法。
操作
| 标签 | 操作 | 携带的内容 |
|---|---|---|
| 0 | 部署(Deploy) | 代币符号、小数位数、最大供应量、单次铸造上限、开放铸造或仅限创建者铸造 |
| 1 | 铸造(Mint) | 40 字节的资产 ID 和一个正数数量 |
| 2 | 转账(Transfer) | 资产 ID、数量和一个 32 字节的接收方 |
| 3 | 报价(Offer) | 资产、数量、买家、收款账户、价格、费用、费用账户、到期 |
| 4–8 | 保留(Reserved) | 目前会被拒绝;不是发射平台(launchpad)或 AMM |
| 9 | 铭刻(Inscribe) | 内容类型和内容字节,用于 Quarks(编号的独一无二资产) |
| 13 | 费率(Fee rate) | 新的每美元 QTC 汇率及其生效区块,由费用运营者发布 |
| 14 | 费用管理(Fee admin) | 取消待生效的汇率、冻结运营者,或更换某个费用角色 |
| 15 | 保留(Reserved) | 目前会被拒绝;留给先承诺后揭示的符号认领方式 |
新的操作,例如公开挂单(open listings)和联合曲线,使用新的标签,且必须在一个公布的区块上明确启用。索引器遇到不认识的标签会直接拒绝,从不猜测。
标识与限制
- 资产 ID 由创建者的 32 字节账户 ID 加上创建该资产时使用的 8 字节序列号组成。代币符号是唯一、可读的标签;你的钱包签名的是资产 ID。
- 符号由 1 到 12 个大写字母或数字组成。小数位数的范围是 0 到 18。
- 数量是以最小单位计的整数,绝不使用浮点数。
- 整条消息最多 1,024 字节,含信封在内。
两个计数器,两种职责
Quantus 为你的账户维护一个 nonce,用来防止原生交易被重放。QLYP 维护自己的序列号,用来为你已被接受的资产操作排序。两者的变化方式不同:QLYP 操作被拒绝时,序列号保持不变,即使承载它的那笔交易已经用掉了一个 nonce。