Qlyphs 文档

从第一性原理出发

三个问题,从最底层讲起。理解了它们,其他页面都只是细节。

Qlyphs 建立在三个问题的答案之上。每个答案都以前一个为基础。本页从零开始推导这三个问题, 不假设你了解 Quantus 或代币。

其他每一页都遵循同样的方法:先提出问题,再推理,然后讲机制,最后说明它保证什么、边界在哪里。

1. 谁来决定谁拥有什么?

问题

如果 Alice 持有 750 GLYF,是什么让这件事成立?谁又能改变它?

代币余额是一种主张。 必须有某种东西让这个主张成立。它可能存在于三个地方。

某家公司的数据库? 那余额就是运营方说多少就是多少。你要信任他们不去修改、不弄丢、也不冻结它。

链内的一项新功能? 那么链本身就必须改变,每一条代币规则都会变成一次网络升级。

由所有人早已认同的历史推导出的结果。 链已经为每个人提供了同一份有序的已签名消息列表。 为读取它定义精确的规则,余额就随之确定。没有任何运营方持有它:任何人都可以从链上重新计算出来。 这正是 Qlyphs 的做法。

  1. 01 / 05

    链是一份有序的签名消息列表

    把区块链层层剥开,剩下的是一段所有人都认同的历史:一条条消息,每条都由发送者签名,按同一个顺序排列。Quantus 提供的正是这一点。它不需要知道 GLYF 代币是什么。

  2. 02 / 05

    规则把一个状态变成下一个状态

    把规则写成一个函数:输入当前状态和下一条消息,返回新的状态。有效的消息会改变余额。无效的消息(比如花掉超过你持有的数量)会被拒绝,不做任何改变。

  3. 03 / 05

    重放历史,得到账本

    从某个固定区块处的空状态开始,按顺序对每条消息应用这个函数。结果就是账本:谁持有什么。没有人手动输入余额;余额由历史推导而来。

  4. 04 / 05

    任何人都能做,并得到同一个答案

    相同的历史、相同的规则、相同的起点:得到相同的账本,逐字节一致。对账本做哈希,就得到一个简短的指纹。两个用不同语言编写的独立程序,可以比较指纹,而不必相互信任。

  5. 05 / 05

    改动一个字节,所有人都能发现

    修改历史中的任意一条消息,重放就会给出不同的账本,因而得到不同的指纹。这就是签名指纹值得检查的原因:它把整个状态固定了下来。

上面的指纹经过缩短,仅作示意。真实的指纹是覆盖整个状态的 SHA-512 根。

这一个想法就能解释协议的大部分内容。消息必须逐字节精确,这样任何两个程序都不会对它们作出不同的解读: 见消息。规则绝不能凭空创造任何单位:见账本。 而且所有人都必须从同一个区块开始,并忽略仍可能改变的区块:见最终性。

2. 如何在不信任对方的情况下付款?

问题

你发送 QTC,卖家发送代币。谁先来?如果对方始终不履行怎么办?

谁先行动,谁就承担风险。 先付款,卖家可以留下钱。先交付,买家可以留下代币。

托管只是转移了风险,并没有消除风险。 现在由中间人持有资金,你要信任这个中间人。

那就把它变成一个不可分割的事件。 Quantus 可以把多个调用作为一个批处理执行, 要么完全成功,要么除了网络费之外什么都不留下。把付款和一个一次性条件放进同一个批处理。

让规则来交付。 代币在你付款之前就已经为这笔出售预留好了。当这个确切的批处理成功时, 协议会把已预留的代币转给你。没有哪台服务器来决定是否交付。

试一试:破坏任意一个步骤,然后发送批处理。

一笔 Quantus 交易 · batch_all
破坏一个步骤:
  1. 使用一次性凭证证明这次购买是第一笔,也是唯一一笔。
  2. 向卖家支付 10 QTC价格直接付到收款账户。
  3. 支付 0.1 QTC 费用价格的 1%,向上取整。

选一个要破坏的步骤(也可以不选),然后发送。

一次性条件正是阻止重复付款的关键。它只能被使用一次,因此第二次购买会在第一步就失败,根本走不到付款。 买卖完整演示一笔出售,公开挂单(open listings)展示两位买家之间的抢购竞争, 出错时会怎样逐一讲解每一种失败情形。

3. 不重放全部历史,钱包如何确认?

问题

付款之前,你的钱包必须知道这些代币确实是为你预留的。它无法重放整条链。那么它能检查什么?

它不能信任网站给出的答案。 被攻破的服务器可以显示一个并不存在的预留。

它可以检查签名。 独立的重放程序计算出账本并对其指纹签名。你的钱包构建时内置了它们的公钥, 因此网站无法替换成自己的公钥。

要求两个,且各自独立构建。 一个重放程序用 TypeScript 编写,另一个用 Python 编写。 两者都必须在近期、针对一个已最终确认的区块,对同一个指纹签名。

核对它付款所依据的确切状态。 钱包在已签名、已最终确认的状态中找到这项预留,并据此构建购买交易。 哪怕只改动了一个字节,检查也会失败。下一步,选择性证明(开发中) 将只发送你正在购买的条目,以及一条通往已签名指纹的简短路径。

签名能证实见证者计算出的结果。它们并不能证明见证者是诚实的,这就是为什么要有两个见证者、 各自独立构建,也是为什么只要缺少任何一项检查,钱包就会拒绝。设计即可验证展示了证明如何沿着树向上攀升, 为什么需要后量子解释了为什么签名采用 ML-DSA-87。

一页看懂这套方法

问题原则机制阅读
谁拥有什么?所有权由共同认可的历史推出对 QLYP 消息进行确定性重放账本
历史何时算数?只有不会再改变的部分已固定的锚点、已最终确认的区块最终性
我如何安全付款?付款与条件是同一个事件带一次性凭证的原子批处理买卖
如果失败了怎么办?两个账本,两个各自独立的答案原生回滚、QLYP 拒绝出错时会怎样
我的钱包如何知道?检查签名,而不是服务器两个见证者对同一状态签名设计即可验证

本页内容