Qlyphs 文档

消息

QLYP 签名的是规范的二进制消息,而不是对一笔买卖的松散描述。一个消息信封,少数几种操作,每种操作只有一种写法。

问题

两个分别编写的程序,如何以完全相同的方式读取同样的字节?

每个 QLYP 操作都是一条小型二进制消息,放在一笔普通的 Quantus 交易中,并随该交易一起签名。格式本身是二进制的,校验又排除了歧义:两个正确的实现不可能把同样的字节读成两种意思。

为什么这样设计

两个读取者绝不能产生分歧。 如果一个程序读到「发送 250」,另一个读到「发送 25」,账本就会一分为二。所以格式必须只允许一种读法。

文本格式允许多种写法。 同一个 JSON 对象可以用不同的键顺序、空格或数字形式写出。每种写法都是不同的字节,而签名覆盖的是字节。

所以 QLYP 采用规范二进制。 每个字段都有固定的顺序;整数有固定的宽度,字节串有唯一规范的长度前缀。解码器必须用完每一个字节,并且重新编码后得到完全相同的消息,否则该消息无效。

而且每条消息都写明了它属于哪里。 名称与版本、链的创世信息以及你的序列号,可以阻止一条消息在另一个网络上、在另一个版本下被重放,或在同一个网络上被重放两次。

逐字节解析

  1. 01 / 05

    它以名称和版本开头

    每条 QLYP 消息都以四个字节「QLYP」和一个版本字节开头。不以此开头的 remark(备注)根本不是 QLYP 操作,未来的版本也不会被误认为 v1。

  2. 02 / 05

    它指明所在的链

    接下来的 32 个字节是网络的创世哈希。为主网签名的消息在测试网络上毫无意义,反之亦然:它无法在另一条链上重放。

  3. 03 / 05

    它为你的操作计数

    八个字节以小端序记录你账户的 QLYP 序列号。每个被接受的操作都会使它加一,因此同一条消息不能应用两次。被拒绝的操作不会使它加一。

  4. 04 / 05

    它说明要做什么

    一个标签字节决定执行哪种操作:0 部署代币,1 铸造,2 转账,3 向指定买家报价一份代币。标签 4 到 8 为保留标签,目前会被拒绝。

  5. 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。

本页内容