术语表
凭证、折叠(fold)、跳过、承保人、存储单元。其中有几个在这里的含义比在别处更窄,还有几个命名的事件,是多数链根本没有词可称呼的。
这个协议所用的词汇,以及它使用这些词的确切含义。其中有几个词 在这里的意思比在别处更窄,而其中两个 — 跳过 和 丢弃 — 命名的事件是多数链根本没有词可称呼的,因为它们没有 对应的东西。
凭证#
Zycord 中唯一的交易类型。一份凭证携带着它读过的状态和它写过的状态,外加把两者连接起来的程序、为它授权的各个签名、一位承保人、一个 TTL,以及在两个手续费市场中各自的一个出价。因为它自带自己的输入和输出,所以核查它是否有效根本不需要任何状态。
折叠(fold)#
推进账本前进的那个确定性循环。它按一个全序遍历一个区块的各份凭证,并对每一份核查它所声明的读取是否仍然成立:成立就提交那些写入,不成立就跳过。折叠在一个热的键值工作集上执行比较、相加和写入 — 不执行代码,不验证签名,不重新执行,也没有椭圆曲线运算。它是这个系统中唯一不能并行化的阶段。
跳过#
当一份凭证所声明的读取不再成立时,它会遭遇的处置。它的费用记在它的承保人账上,而该区块仍然有效。跳过是语义,不是失败:打包与应用是两个不同的事件,正是这一点让区块生产者可以是盲的 — 它绝不可能因为打包了一份过时的凭证而产出一个无效区块。
丢弃#
一种不计费的非事件,也是实现为白皮书的词汇表补上的那个词。一份凭证到达应用阶段时,其保证金已被消耗,它会被丢弃:不计费,不标记为已见,并且可以针对一笔新鲜的保证金自由重新提交。因此诚实的用户不会因为自己那个保证金存储单元上的竞争而损失任何东西。
承保人#
以其抵押资金为一份凭证负责的一方。没有承保人就没有凭证。跳过不能是免费的,否则内存池会被淹没 — 但被跳过的凭证从未碰过发送方的余额,所以没有什么可以向发送方收取。承保人正是让每一次冲突都有一个归属者的东西。在 Era 0 中,唯一的模式是自保:发送方从一个未被占用的存储单元附上一小笔保证金。
存储单元#
一个槽位上的值 — 一个以大端序存放在 32 字节中的无符号 256 位整数。零就是不存在:一个从未被写过的槽位和一个被写成零的槽位是同一个槽位。这是一项共识要求,不是图省事:它让状态根成为状态的函数,而不是产生出该状态的那段历史的函数。
一次性地址(0x01)#
一个其签名权限会被它的第一次借记永久烧毁的地址。向一个新派生出来的一次性地址付款是零争用的快速路径,而每笔付款都派生一个全新的地址,正是让一笔付款与下一笔无法被关联起来的原因。代价是“花掉其中一部分”不是一个一次性地址能做的事 — 请看钱包规则 1。
持久地址(0x02)#
一个可重复使用的地址。它永远不会进入已花费注册表,因此它完全没有被恶意烧毁的可乘之机。商户、捐赠地址和挖矿收益支付必须使用这种地址;zycordd --payout 会拒绝其他任何类型。
已花费地址注册表#
由签名权限已被烧毁的一次性地址构成的、永久性的共识集合。已花费地址之下的存储单元值可以在回滚视界之后被剪除,但注册表条目永远不会 — 正是它阻止了地址被复活。每个地址约 33 字节,永远保留:这个协议诚实承认的尚未解决的问题,在结构上与每一种作废符集合设计共有。
有效 vs. 可应用#
两个被传统链混为一谈的谓词。有效是无状态的、可并行的,任何人仅凭凭证的字节就能核查。可应用是有状态的、串行的,只由在账本中的位置来裁定。两份有效的凭证可能为同一个槽位声明同一个输入值;其中至多有一份能是可应用的。
带守卫增量#
一种访问纪律:凭证对一个槽位断言一个谓词 — balance ≥ 10 — 而不把该值读入计算,并写入一个带符号的增量。对同一个槽位的任意多次带守卫的借记和贷记都是可交换的,所以只有在真正透支时才会发生跳过,而不会仅仅因为余额变了就跳过。这一条纪律就覆盖了转账、有供给上限的铸造、授权额度和金库份额。
纯增量#
一个不带守卫的带符号增量。它永远不会冲突,也永远不会跳过。打赏、计数器、累加器、奖励统计。
精确读取#
SLOAD 式的纪律:读取会把槽位的值送入计算,并把凭证钉死在这个值上。可以承载任意逻辑,会在热门槽位上发生冲突,是应用定序器的用武之地。
纪元信标#
一个保留槽位,协议每个纪元往里写一次。程序不得直接读取时间戳或高度这类环境值 — 那会让执行成为所声明读取之外的某种东西的函数 — 所以它们像读取任何其他槽位一样读取信标,最好带上一个范围守卫。它是工作量证明的输出,在 VRF 到来之前不适合高价值的抽奖。
纪元#
2,880 个区块 — 在 30 秒出块的情况下约为一天。补贴按这个单位逐级下调,串行容量目标按它移动,信标也按它刷新。
TTL#
一份凭证必须在此高度之前被提交才算有效。共识把它限定在 240 个区块(约两小时),正是这一点让已见集合可以被剪除。打包一份已见过或已过期的凭证会让区块无效 — 因此一个签名至多只能被计费一次,而且只能在其签署者通过签名所接受的位置上被计费。
串行 gas 与并行 gas#
手续费拆成两个市场:一个用于串行的状态变更,它是稀缺的;另一个用于并行的验证,它并不稀缺。因此一次签名核查不会与一次存储写入在同一场拍卖中竞价,正是这一点让繁重的密码学在设计上就是便宜的。
时代#
发布的一个阶段,由链上测得的阈值触发 — 区块高度和持续的质押量 — 绝不由日历日期或投票触发。Era 0 是挖矿和原生资产,而它内部的两个高度先后启用抵押(40,320),以及 cEVM、定序器和强制打包(80,640);Era 1 在已抵押质押量持续达到供应量的 1% 之后加入检查点最终性;Era 2 把提议权移交给一个质押委员会;Era S 加入机密支付,且只在审计报告发布之后。
RandomX#
工作量证明函数,为通用 CPU 做过优化,好让普通硬件保持竞争力。它是一个共识参数,不是一项设置:一个无法计算某网络 pow_engine 的二进制文件会拒绝启动,而不是回退。
国库#
协议地址自己的余额存储单元,从区块 0 起按每个区块补贴的 3% 计入。它在创世时没有密钥、没有地址、也没有法定人数,在 Era 2 之前无法被打开;到那时可以通过硬分叉钉定一套 5 选 3 的密钥。如果永远没有人公开现身来认领它,这些币就永远不会被发行。
状态根#
对某一高度上全部状态的承诺。节点启动时会重新计算它,若与存下来的那个不符便拒绝运行;它同时兼作生产环境中节点之间的差分守卫:两个实现从同一段区块序列得出不同的根,说明其中之一有缺陷。
每个术语在何处被规范性地定义#
本页是一份阅读辅助。具有约束力的定义在 规范文件与黄金向量里;推理过程在 白皮书里,而实现自身的词汇章节 在 docs/ARCHITECTURE.md 里。