从第一性原理出发
三个问题,从最底层讲起。理解了它们,其他页面都只是细节。
Qlyphs 建立在三个问题的答案之上。每个答案都以前一个为基础。本页从零开始推导这三个问题, 不假设你了解 Quantus 或代币。
其他每一页都遵循同样的方法:先提出问题,再推理,然后讲机制,最后说明它保证什么、边界在哪里。
1. 谁来决定谁拥有什么?
如果 Alice 持有 750 GLYF,是什么让这件事成立?谁又能改变它?
代币余额是一种主张。 必须有某种东西让这个主张成立。它可能存在于三个地方。
某家公司的数据库? 那余额就是运营方说多少就是多少。你要信任他们不去修改、不弄丢、也不冻结它。
链内的一项新功能? 那么链本身就必须改变,每一条代币规则都会变成一次网络升级。
由所有人早已认同的历史推导出的结果。 链已经为每个人提供了同一份有序的已签名消息列表。 为读取它定义精确的规则,余额就随之确定。没有任何运营方持有它:任何人都可以从链上重新计算出来。 这正是 Qlyphs 的做法。
- 01 / 05
链是一份有序的签名消息列表
把区块链层层剥开,剩下的是一段所有人都认同的历史:一条条消息,每条都由发送者签名,按同一个顺序排列。Quantus 提供的正是这一点。它不需要知道 GLYF 代币是什么。
- 02 / 05
规则把一个状态变成下一个状态
把规则写成一个函数:输入当前状态和下一条消息,返回新的状态。有效的消息会改变余额。无效的消息(比如花掉超过你持有的数量)会被拒绝,不做任何改变。
- 03 / 05
重放历史,得到账本
从某个固定区块处的空状态开始,按顺序对每条消息应用这个函数。结果就是账本:谁持有什么。没有人手动输入余额;余额由历史推导而来。
- 04 / 05
任何人都能做,并得到同一个答案
相同的历史、相同的规则、相同的起点:得到相同的账本,逐字节一致。对账本做哈希,就得到一个简短的指纹。两个用不同语言编写的独立程序,可以比较指纹,而不必相互信任。
- 05 / 05
改动一个字节,所有人都能发现
修改历史中的任意一条消息,重放就会给出不同的账本,因而得到不同的指纹。这就是签名指纹值得检查的原因:它把整个状态固定了下来。
上面的指纹经过缩短,仅作示意。真实的指纹是覆盖整个状态的 SHA-512 根。
这一个想法就能解释协议的大部分内容。消息必须逐字节精确,这样任何两个程序都不会对它们作出不同的解读: 见消息。规则绝不能凭空创造任何单位:见账本。 而且所有人都必须从同一个区块开始,并忽略仍可能改变的区块:见最终性。
2. 如何在不信任对方的情况下付款?
你发送 QTC,卖家发送代币。谁先来?如果对方始终不履行怎么办?
谁先行动,谁就承担风险。 先付款,卖家可以留下钱。先交付,买家可以留下代币。
托管只是转移了风险,并没有消除风险。 现在由中间人持有资金,你要信任这个中间人。
那就把它变成一个不可分割的事件。 Quantus 可以把多个调用作为一个批处理执行, 要么完全成功,要么除了网络费之外什么都不留下。把付款和一个一次性条件放进同一个批处理。
让规则来交付。 代币在你付款之前就已经为这笔出售预留好了。当这个确切的批处理成功时, 协议会把已预留的代币转给你。没有哪台服务器来决定是否交付。
试一试:破坏任意一个步骤,然后发送批处理。
- 使用一次性凭证证明这次购买是第一笔,也是唯一一笔。
- 向卖家支付 10 QTC价格直接付到收款账户。
- 支付 0.1 QTC 费用价格的 1%,向上取整。
选一个要破坏的步骤(也可以不选),然后发送。
一次性条件正是阻止重复付款的关键。它只能被使用一次,因此第二次购买会在第一步就失败,根本走不到付款。 买卖完整演示一笔出售,公开挂单(open listings)展示两位买家之间的抢购竞争, 出错时会怎样逐一讲解每一种失败情形。
3. 不重放全部历史,钱包如何确认?
付款之前,你的钱包必须知道这些代币确实是为你预留的。它无法重放整条链。那么它能检查什么?
它不能信任网站给出的答案。 被攻破的服务器可以显示一个并不存在的预留。
它可以检查签名。 独立的重放程序计算出账本并对其指纹签名。你的钱包构建时内置了它们的公钥, 因此网站无法替换成自己的公钥。
要求两个,且各自独立构建。 一个重放程序用 TypeScript 编写,另一个用 Python 编写。 两者都必须在近期、针对一个已最终确认的区块,对同一个指纹签名。
核对它付款所依据的确切状态。 钱包在已签名、已最终确认的状态中找到这项预留,并据此构建购买交易。 哪怕只改动了一个字节,检查也会失败。下一步,选择性证明(开发中) 将只发送你正在购买的条目,以及一条通往已签名指纹的简短路径。
签名能证实见证者计算出的结果。它们并不能证明见证者是诚实的,这就是为什么要有两个见证者、 各自独立构建,也是为什么只要缺少任何一项检查,钱包就会拒绝。设计即可验证展示了证明如何沿着树向上攀升, 为什么需要后量子解释了为什么签名采用 ML-DSA-87。