ZYCORD 文档
简体中文
Zycord文档白皮书

Zycord:一个由自证明状态转换构成的点对点网络

这是一份未经审校的译文

本页由机器翻译,未经审校。凡与英文本有出入之处,以英文本所述的协议为准。英文原文见 zycord.com/docs/whitepaper/。

Zycord:一个由自证明状态转换构成的点对点网络。
The Simstoshi
2026 — v2.0
GPG:E724 39CE DD85 11F9 D607 550B 87FD 60D5 EB4A 0B29

摘要

Zycord 是一个账本,其唯一的交易是凭证:一个程序,连同它读取的状态和它写入的状态。有效性是凭证字节的纯函数,因此任何机器都能并行地验证它,不需要状态,不需要历史,也不需要信任。没有任何东西针对账本执行。链对凭证排序,并以一个确定性折叠提交它们:该折叠应用每一份其所声明的读取仍然成立的凭证,并跳过其余的。跳过是一个有价格的事件,向为该凭证缴存保证金的一方收费,而从不向第三方收费。合约按每个存储槽位声明访问是精确的、带守卫的还是可交换的,因此付款、铸造和打赏永远不会争用。一个其逻辑需要精确读取的合约会选择一个定序器:一项链下服务,它串行化该合约的流量,执行用户签名的意图,在几毫秒内确认它们,并把结果作为凭证发布。一条不需要定序器的强制路径保证任何用户仍然可以针对任何合约进行交易。手续费分为两个市场,一个用于稀缺的串行状态变更,一个用于并行验证,后者随每一个加入的核心而增长。每个节点都验证一切,既便宜又并行,而唯一的串行循环是一个在内存上的循环。链以工作量证明启动,并经由一段有界的权益爬坡期过渡到权益证明,在那里,原本用于挖掘哈希的计算转而用于验证凭证;验证规则不变。超越每个节点全面验证之后的东西,作为一个方向而非一项规范来阐述。

本文完整且自成一体。它取代 v1.0 [0];§15 说明二者的关系。发布、发行、时代以及完整的参数表见配套文档 Zycord:发布、时代与参数。

版本。下面的正文是本文的 v2.0,未经删节,本页随后附有 其配套文档,同样为 v2.0。两者都以 PDF 形式提供, 各附一份用项目密钥 E724 39CE DD85 11F9 D607 550B 87FD 60D5 EB4A 0B29 制作的分离签名: 本文 (签名)和 配套文档 (签名)。每一个版本都存档于 doi:10.5281/zenodo.22167489 之下,它解析到最新版本; 已被取代的 v1.0 是 doi:10.5281/zenodo.22167490。 配套文档以其自身的 doi:10.5281/zenodo.23383987 存档。

本文不是什么

白皮书是那份论证。它不是协议本身。凡本文与 规范性表述有出入之处,以规范性表述为准,而这处出入就是一个缺陷: 协议是那些参数文件和黄金向量, 对等层的各项要求则见于 线路规范。解释参考节点如何实现这一切的工程配套文档是 架构。

1. 引言#

一个区块链节点做三件毫无共同之处的工作:它传播数据,它验证计算,它变更状态。数据随带宽扩展。验证随核心数扩展,而且如果交易能够被独立核查,它就是易并行的。状态变更是唯一真正串行的资源:在某处,必须存在一份唯一的、权威的写入历史。

Zycord 把这三者分开。一笔交易变成一份凭证,携带它自己的输入和输出,因此验证它是其字节的纯函数,从不触及账本。链的工作缩减为对凭证排序,并在其上运行一个确定性折叠:一个由比较和加法构成的循环,对每份凭证恰好触碰状态一次。冲突不会让区块无效;它们导致个别凭证被跳过,而每一次跳过都向一个接受了该风险的一方收费。并发不是在运行时发现的;它由合约作者逐个槽位地声明。其谱系是执行-排序-验证 [3]、确定性排序 [4]、乐观并行执行 [5],以及把传播与排序分离 [6]。

有效性对每份凭证只运行一次,并行进行,早于任何区块的存在。折叠对每个区块只运行一次,按顺序进行,且从不执行。

本设计建立在两个世界之上,它们可以共用同一个可执行文件,但绝不能被混淆:

共识(链)构造(链下)
参与者矿工和每一个全节点定序器、钱包、任何参与者
角色排序、核查、提交执行合约、构建凭证
规则固定;仅做验证在设计上是自由的;由市场决定

共识规则只做验证。它们的目的在于:没有任何用户会在未经授权的情况下损失资金,没有任何人能扣减一个不归他控制的余额,也没有任何攻击者能耗尽、阻塞或拖慢网络。定序器如何运作、定序器之间如何通信以及它们收取什么费用,都在共识之外。链上的是结算:定序器的报酬随用户签名的意图一起传递,并且只在该凭证被应用时才支付。

以下各节定义凭证(§2)、折叠(§3)、带类型的状态访问(§4)、原生资产(§5)、虚拟机(§6)、定序器(§7)、强制路径(§8)、两个手续费市场(§9)、网络(§10)、权益证明(§11)、超越全面验证之路(§12)、已接受的风险(§13)、一致性(§14)以及与 v1.0 的关系(§15)。

2. 状态转换凭证#

凭证是唯一的交易类型。它采用 SSZ 编码,这给出唯一一种规范的字节编码;解码会强制规范形式,因此一份解码成功的凭证在构造上就是结构有效的,之后不再有任何规则重新核查其形状。

字段含义
ChainID该凭证所针对的网络
Seq保证金缴存者自己的排序计数器;在 fill 和强制凭证中为零
Program一个类型字节和一个主体:原生操作、机器调用、意图 fill、强制意图、注册
读取声明的输入:(slot, access, operand),按槽位排序,不得重复
写入声明的输出:(slot, op, value),按槽位排序,增量已预先求和
Sigs(public key, Ed25519 signature),按公钥排序
Deposit为该凭证负责的存储单元、预留的金额以及找零槽位
TTL该凭证可被提交的最后一个高度
FeeBid在两个 gas 市场中各自的一个上限和一个优先费

两个摘要回答两个问题。凭证 id 是签名列表为空时该凭证的哈希:它命名该凭证所授权的内容。实例字节哈希覆盖整个编码,包括签名:它命名一组字节。签名留在 id 之外,因为签名是随机化的;每一个 nonce 都会在同一个主体上产生另一个有效签名,而一个覆盖签名的 id 会让一份授权拥有无穷多个可计费的身份。id 是已见集合、折叠顺序以及所有去重的键。fill 和强制凭证以其意图的哈希作为 id(§7、§8);fill 的出价由其定序器的签名封定。实例字节哈希是区块的凭证根所承诺的对象,因此一个区块 id 决定了该区块所携带的字节。手续费出价位于 id 之内并被签名:位于 id 之外的出价,是任何处于传输途中的人都能改写的出价。每个签名所签的消息都绑定了链 id 和参数集的共识根,因此一份凭证无法在另一个网络上被重放。

有效性是无状态的。一份凭证在仅凭其字节就满足以下条件时是有效的:

  1. 它能被规范地解码,指明的是本链,并且每一个列表都在其上限之内;
  2. 每一个签名都能在严格 Ed25519(规范编码、无挠点的公钥)下通过验证,并且签名集合既是充分的,也是最小的;
  3. 针对所声明的读取重新执行该程序,恰好产出所声明的写入;
  4. 每一个需要授权的写入都有授权,并且保证金存储单元无条件地带有一个签名;
  5. 保证金是一个用户地址的原生余额存储单元,并且足以覆盖该凭证的最坏情形;
  6. 该凭证是自洽的:没有任何写入与对同一槽位的读取相矛盾,没有任何被扣款的一次性地址逃脱被标记为已花费,也没有任何值被写入一个已花费的地址;
  7. 它不写入任何协议存储单元;
  8. 它所指明的每一个地址都带有一个已定义的版本字节;
  9. 在定序器密钥非零的合约中,精确读取路径带有该密钥的签名(§7),强制凭证(§8)除外;
  10. 一次元数据写入要为它所覆盖的每一个存储单元声明一次精确读取,其值为构建该凭证时该存储单元所持有的值。

任何机器都能核查这一点:一个线程池、另一台计算机、一块 GPU,不需要数据库,也不需要同步。签名核查彼此独立,因此可以跨凭证批量进行。这就是其余一切所建立于其上的那条性质。

有效不足以执行。两份有效的凭证可能为同一个槽位声明同一个输入值;至多只有一份能生效。因此,交易有效性的经典概念被一分为二:有效(无状态、并行、任何人都可核查)和可应用(有状态、串行、只由在账本中的位置裁定)。一份无效凭证永远不会进入诚实的内存池,而一份被打包进区块的无效凭证会让该区块无效。

3. 作为一次折叠的账本#

一个区块由一个区块头、一份有序的凭证实例字节哈希列表以及凭证体本身组成。凭证体是链数据:只有当其凭证体可用时,区块才有效。区块的生产者不执行任何东西。它对已经看到通过验证的凭证排序,求解工作量证明 [13](或者在权益证明下,为它被抽中的时隙签名,§11),并携带在 TTL 窗口内见过的凭证 id 集合,因为把同一份打包两次会让区块无效。

链的状态是对有序凭证的一次折叠。对每一份凭证,按顺序,折叠预留保证金,针对当前状态核查每一项声明的读取,用带检查的算术暂存写入,然后提交或跳过:

  • APPLIED(已应用)— 每一项声明的读取都成立,于是写入落地,手续费按实际成本结算。
  • SKIPPED(已跳过)— 一项读取不再成立(STALE),一个增量会超出范围 [0, 2²⁵⁶)(OVERFLOW),或者一项写入落在一个已花费地址之下(SPENT)。不写入任何东西。从保证金中烧毁一笔固定的跳过费,其余部分退回。
  • FORCED_FAILED(强制失败)— 一份调用回滚或突破其界限的强制凭证(§8)。其付款方被扣款并烧毁,找零退回给用户,此外不写入任何东西,并且 id 被标记为已见。
  • DROPPED(已丢弃)— 该凭证根本无法被收费(保证金存储单元没有资金或已被花费),因此它被携带、被标记为已见,且不收费。它不给生产者带来任何收入,却占用其上限空间。处于同样情形的 fill 则会让区块无效(见下文),因为丢弃它会在无人获得报酬的情况下消耗掉用户的意图。

规范顺序。折叠把一个区块的凭证分为三类排序,不给生产者留任何裁量余地。首先是 fill(§7),每一份在它所在的每一条流水线都就绪时立即被取用,平局按 (sequencer key, contract, seq, id) 打破。然后是所有其他凭证,按 (deposit address, Seq, id) 排序。最后是强制凭证(§8),按 id 排序。每个节点都从相同的区块序列推导出相同的状态。

写入在任何一项落地之前都会被核查。对一个其权限已被烧毁的地址的入账会明确地失败,而不是让该存储单元复活;一个会溢出的增量会让整份凭证失败。永久的已花费地址注册表正是为此而存在的。

跳过是语义,不是失败。打包与应用是两个不同的事件。生产者绝不可能因为打包了一份结果过时的凭证而产出一个无效区块;该凭证被跳过,由保证金缴存者付费。读取是保证金缴存者选的,所以由保证金缴存者为它们负责。

一个签名,至多一次收费。已应用和已跳过的凭证都会被标记为已见。打包一份已见过或已过期的凭证,或者一份在任一市场中出价低于该区块基础费的凭证,都会让区块无效,因此没有生产者能够重新打包或故意拖延别人的凭证,以收割他们的保证金。TTL 由共识限定,因此已见集合始终可以被剪除。

无人可收费的情形会让区块无效。有些失败没有责任方:一份 fill,其定序器计数器顺序错乱、其 fence 计数器(§7)已经移动、其付款方已被花费,或其保证金无法预留;一份强制凭证,其读取不成立。打包这样一份凭证会让区块无效,而且不收取任何费用。区块的生产者是根据自己持有的状态构建该区块的,它是本可以知道这一点的一方。

每份凭证恰好触碰状态一次。折叠在一个热的键值工作集上执行比较、相加和写入:不执行代码,不验证签名,不重新执行,也不做椭圆曲线运算。所有这些都已在有效性核查期间并行完成。凭证 id 也在那时计算,并被带入折叠。

值相等,而非版本。可应用性比较的是所声明的读取值,而不是版本计数器。一个改变了又改回来的槽位仍然是可应用的,因此该系统发生跳过的频率严格低于基于版本的并发控制。

折叠自身的序言与尾声。在处理凭证之前,在纪元边界上,折叠写入信标存储单元(§4)。在处理凭证之后,它拆分区块补贴并轮转 coinbase 成熟期环(见配套文档),为手续费控制器记录已应用的 gas(§9),并在纪元边界上计算纪元状态根,该状态根必须与头部中的相等。它只在区块无效时返回错误;一份凭证的问题是一个结果,绝不是一个错误。

4. 存储单元与带类型的状态访问#

一个存储单元是槽位 (address, word) 上的值:一个 256 位无符号整数,以大端序存放在 32 个字节中。不存在的存储单元读作零。在存储单元之外,协议还维护一个已花费地址注册表,这是一个永久的集合,收录那些签名权限已被烧毁的一次性地址。

一个地址是 version ‖ blake3(tag ‖ version ‖ payload)[:31],协议地址除外,它是版本字节 0x00 后接全零:

版本类别谁能扣款
0x00协议只有折叠:纪元信标、基础费存储单元、成熟期环、国库存储单元、定序器计数器、权益存储单元
0x01一次性用户所有者的签名,并且扣款的凭证还必须把该地址标记为已花费;此后在它之下的每一次读取和写入都永远失败
0x02持久用户所有者的签名,可重复使用
0x03资产该资产不可变的权限存储单元
0x05合约没有任何人能凭密钥扣款:没有任何密钥会哈希成合约地址;由合约代码和折叠规则决定

一次性与持久之分是一项以地址中的一个位体现出来的钱包策略,而不是两本账 [7]。钱包默认为每一笔入账付款使用一个新的一次性地址,因此向一个新派生的地址付款就是零争用的快速路径,而一个已花费的存储单元,一旦花费它的区块被埋到回滚视界之下,就可以被压缩。谁想要一个账户,就使用持久版本。挖矿奖励应当进入持久地址:共识接受两种地址作为收款地址,但一次性地址在被花费的那一刻会烧毁它所持有的每一笔奖励,节点正是因此拒绝一次性地址。

并行性正是来自带类型的访问。一个只支持精确读取的折叠会把每一个热门合约都串行化:一千份触碰同一个池的凭证只会得到一次应用和 999 次跳过。取而代之的是,一项读取声明它如何约束一个存储单元,一项写入声明它对该存储单元做什么:

读取写入
EXACT — 该值被钉定并参与计算;当该存储单元变动时就会过时SET — 覆盖写入
GUARD_GE, GUARD_LE, GUARD_EQ — 对该存储单元的一个谓词,不向计算返回任何东西DELTA_ADD, DELTA_SUB — 一个带符号的变化量,在整数上核查
MARK_SPENT — 烧毁一个一次性地址

只有 EXACT 会过时。对同一个槽位的任意多次带守卫的借记和贷记都是可交换的:它们以任意顺序应用,只有当守卫真的失败(一次真正的透支)时才会发生跳过,而不是仅仅因为余额变了。每份凭证对每个槽位只用一种纪律:设置和增量不会在同一个槽位上共存。让该模型保持健全的规则是带守卫的值永远不流入计算:断言不返回任何东西,增量不读取任何东西,因此重新执行仍然是所声明的精确读取的纯函数。这单一的纪律就覆盖了转账、有供给上限的铸造、授权额度、打赏和金库份额,它们占链上写入的绝大多数。其谱系是托管事务、事务性增强和 CRDT [8][9][10];Zycord 让可交换性成为节点之间的并发契约。

一次性存储单元。一个从未在链上出现过的地址处于状态 ∅;第一次写入把它移到已存储;由其密钥签名、把它标记为已花费的那份凭证把它移到已花费,永久如此。记录这次花费的注册表条目永远不会被压缩:正是它阻止该地址被复活。

零就是不存在。一个从未被写入的槽位和一个被写成零的槽位是同一个槽位:写入零就会删除该存储单元。这是一项共识要求。它让守卫或精确读取可以指定 0,而不必询问该槽位是否存在,并且让状态根成为状态的函数,而不是产生出该状态的那段历史的函数。

纪元信标。程序不得直接读取环境值。协议把开启当前纪元的区块头的高度,以及自机器时代起该区块头的时间,每个纪元一次写入保留的存储单元,程序像读取任何其他槽位一样读取它们。这在不带来逐区块过时的情况下提供了时间感知;两个值在整个纪元内都保持不变,在 mainnet 上为一天:在工作量证明下为 2,880 个区块,在权益证明下为 17,280 个(§11)。

5. 无需机器的资产#

发布时代先需要一个经济,然后才需要一台计算机。Zycord 从区块 0 起就以凭证操作的形式提供原生资产,不涉及任何虚拟机:

  • TRANSFER — 在一份凭证中至多 32 次 (asset, from, to, amount) 转移,受其读写上限约束,每一次都是一个守卫 balance ≥ Δ 配上两个增量。指向纯增量或新一次性存储单元的入账就是打赏,因此打赏不需要自己的操作码。合约地址只能被记入原生币,且永远不能是预编译合约的地址(§6),因为没有任何东西能从那里把价值取出。
  • ISSUE — 在一个只写一次的存储单元中创建一个带供给上限的资产 id。
  • MINT — 带守卫:minted + Δ ≤ cap。
  • RETIRE — 烧毁至多 64 个一次性地址,每一个都由其所有者授权,并在该凭证的上限之内,不转移价值:没有读取,只有一次把每个存储单元标记为已花费的纯写入。真正意义上的花费在转账内部自动发生。注销是压缩与隐私的原语:收款方在一个一次性地址完成其用途后将其抹除。

一个在一个区块里收到一万笔打赏的主播,给折叠带来的成本是一万次可交换的加法:零冲突,零跳过,没有定序器,没有机器。原生币的供给时间表和每一种已发行资产的上限都住在这里,由 §3 的带检查算术强制执行。

一笔付款是这样结算的。发送方的钱包挑选一个它持有的一次性存储单元,对它声明一个守卫,对它扣款,把它标记为已花费,向收款方的新一次性地址入账,并把找零发往它自己的一个新一次性地址。两份经由两个不同节点竞相花费同一个一次性存储单元的凭证都是有效的;恰好其中一份被应用,另一份被跳过,并向它所指明的保证金收费。

6. 机器:cEVM#

Zycord 运行一个虚拟机,即 cEVM,它是以太坊虚拟机 [2] 的一种为凭证改造的方言。这一选择是刻意的:本项目的新颖性预算花在了状态、并发和经济模型上,而机器应当是系统中最为人熟悉的部分。Solidity、它的编译器、审计者和工具都可以沿用。该方言的全部分歧就是一份清单:若干移除、两项重新绑定、六项新增以及四项重新定价。

存储是声明的,而不是发现的。一份凭证携带其执行所消耗的读取和所产生的写入,有效性把它们与一次重新执行相比较。有四个操作码族能触及存储单元:精确纪律下的 SLOAD 和 SSTORE,以及可交换纪律下的断言族和增量族。一个被调用的帧至多可以向声明集合添加 16 个条目,因此被调用方无法耗尽其调用方所需的上限;会超出这一数量的那个条目会中止该帧,而不影响其他帧。

新增,使用任何 EVM 分叉都从未分配过的字节:SASSERTGE 0x21、SASSERTLE 0x22、SASSERTEQ 0x23、SDELTAADD 0x24、SDELTASUB 0x25、SETSEQ 0x26。谓词和符号在操作码中,绝不在栈上。守卫不返回任何东西,因此没有分支能依赖于它是否成立;增量的净值在整数上计算,绝不对 2²⁵⁶ 取模。SETSEQ(key) 设置其上下文正在执行的那个合约的定序器存储单元,且不设置任何其他合约的;为零或格式错误的密钥是一次派生失败,会让整份凭证无效。

重新绑定:NUMBER 和 TIMESTAMP 通过对纪元信标存储单元的精确读取作答,因此两者在整个纪元内都保持不变,而一个移植过来的、用 block.timestamp 作截止期限的合约,是在依据一个可能已过时长达 24 小时的时间做判断。

移除(13 个):BLOCKHASH、COINBASE、PREVRANDAO、GASLIMIT、BLOBHASH [14]、BLOBBASEFEE、SLOTNUM 没有所指对象;GASPRICE 和 BASEFEE 指向逐区块的存储单元,对它们的精确读取在构造上就是过时的;BALANCE 和 SELFBALANCE 会强制对原生余额进行精确读取;ORIGIN 没有可指称的发送者;SELFDESTRUCT 会让代码哈希存储单元回到零。

重新定价:SLOAD 和 SSTORE 统一按热访问成本计价;冷访问附加费在所有地方都被删除;KECCAK256 提高到 720 gas 加每个字 144,这是对照本机器自身的实现测得的,也是唯一一项提高收费的重新定价。断言和增量操作码的成本与 SLOAD 相同,均为热访问的金额。

预编译合约是一个由五个组成的封闭集合:sha256、identity、modexp、ed25519_verify 和 blake3。

两个计量器。串行 gas 由所声明的读取数、写入数和注册表条目数推导得出,从不由机器测量。并行计量器是解释器所计数的东西,它对照的是凭证以派生单位声明的预算;在深度 0 超出该预算会让凭证无效。

代码随凭证一起传递。合约代码住在一个只写一次的代码哈希存储单元中,因此不存在重新部署,而一次部署就是一次目标为零的调用。运行时映像由凭证携带,并通过对代码哈希存储单元的一次声明的精确读取来解析,绝不仅凭地址。一个 blob 至多 24,576 字节。

合约的记录由五个存储单元组成:代码哈希、部署者、定序器密钥、管理员和 fence 计数器(§7)。管理员存储单元持有一个地址;零表示部署者就是管理员,而 32 个字节的 0xff 表示该角色已被放弃,且不可逆转。管理员通过一份注册凭证设置定序器密钥,并通过一份设置管理员凭证移交或放弃该角色;两者都声明对部署者存储单元和管理员存储单元的精确读取,因此来自已被替换或已放弃角色的管理员的凭证会被跳过。合约代码从不设置管理员;它用 SETSEQ 移动它自己的定序器,工厂创建的合约也正是这样获得定序器的。

标准库。一个代币、一个打赏罐和一个托管合约,以增量优先的方式编写,在激活机器的那个区块中预部署在已知地址上,同时预部署的还有它们所调用的增量包装器。一个避开了被移除的操作码和预编译合约的以太坊移植合约,从第一天起就能以全精确模式正确运行,如果它是热点合约,就由定序器串行化;并行性是按槽位选择启用的,通常只需一个小小的差异修改,把余额映射从 load/store 改为 assert/delta。

7. 定序器#

带守卫增量消解了付款的争用。剩下的是热点状态上的精确读取逻辑,例如订单簿、自动做市商:在那里,两个针对同一个存储单元构建凭证的诚实用户仍然会产生一次跳过,而那些读取状态以决定写入什么的合约无法以任意顺序被应用。协议的答案是让合约选择它自己的串行化者。

绑定。每个合约的记录(§6)都持有一把定序器密钥。密钥非零的合约是定序的:一份凭证只有带着该密钥的签名,才能对其存储单元进行精确读取、相等守卫或设置。密钥为零的合约是开放的:任何人都可以用自己的凭证走它的精确路径,而该合约只受其代码保护。该密钥由部署者在部署时设置,之后由管理员设置,或由合约自己的代码通过 SETSEQ 设置,治理机制正是这样在没有管理员的情况下更换定序器的。绑定可以指定任何密钥;一把无人服务的密钥不是共识错误,只是该合约在有人为其服务或强制路径(§8)改变它之前无法使用。带守卫增量可交换且从不受限,因此一个定序代币仍然接受来自任何人的每一笔转账。

定序器目录。定序器用一份目录凭证通告其服务在何处应答:它的密钥和一个 1 到 256 字节的可打印 ASCII 字符串,通常是一个 URL,从一个持久地址通告。除非续期,该条目在通告凭证的 TTL 之后 90 天到期,而一份撤回凭证会立即将其移除。共识存储这个字符串,但从不解释它。定序器目录是发现,而不是授权:钱包读取它以得知该向谁请求。

意图。用户不针对定序合约构建凭证。用户签署一个意图:目标与 calldata、一份并行预算、一个 nonce、一个从 NotBefore 到 TTL 的窗口(TTL − NotBefore 至多 8 个区块)、定序器的持久地址、一组对结果的界限、应付给定序器的款项、应付给任何联合定序器的款项、为所有这些出资的一次性付款方,以及找零输出。界限是对该调用所写入的某个存储单元的谓词:final-at-least、final-at-most、delta-at-least 或 delta-at-most,且至少有一个界限必须指定该调用所写入的槽位。意图就是用户的全部授权;定序器无法改变它做什么,只能改变何时做。

Fill。定序器在它自己对状态的视图之上执行意图,该视图即链顶加上它已经构建的每一份 fill,并把结果作为一份 fill 发布:这是一份凭证,其程序就是该意图,其保证金来自定序器自己的持久余额,其 id 是该意图的哈希,因此同一个意图的两份 fill 共享同一个 id,并且只有一份能被收费。定序器只在活性上受信任,绝不在安全性上受信任:如果它在输入上撒谎,该 fill 就会在规范折叠中被直接跳过,而这个谎言耗费的是定序器的保证金,而不是用户的资金。

回执。定序器在几毫秒内答复一个已签名的意图,远早于区块的出现:它执行该意图,签署 fill,并把 fill,或一份写明意图 id、流水线 seq 和结果的签名回执,返回给钱包。这是一种预确认。它是定序器的承诺,而不是链的承诺;在 fill 被应用时它才成为最终的。因为每一份回执都是签名的,所以不当行为就是证据:同一把密钥签出的两份回执,如果把同一个 seq 给了不同的意图,或者给同一个意图不同的结果,就构成任何人都能从字节核查的证明。共识不惩罚这种行为。市场会惩罚。回执的格式、价格、身份和声誉都在链下,按设计不受约束,因此用户可以在更便宜的定序器、公开身份的定序器或匿名的定序器之间选择,并离开被抓到双重签名的那一个。

流水线。链为每一对 (sequencer key, contract) 记录最后一个已应用的 seq。一份 fill 为它所在的每一条流水线声明一个 seq,并且只有当计数器停在 seq − 1 时才能进入;计数器只在 fill 被应用时前进。因此,一份被跳过的 fill 会让其计数器停留在原处:在它后面构建的 fill 无法进入,定序器从同一个编号重新构建。同一个 seq 上的两份 fill:折叠顺序中的第一份进入,第二份无法进入。定序器的流水线按它签署的顺序提交,无论生产者以什么顺序收到它,而混合了多个定序器流水线的生产者对结果毫无选择余地。

fence 计数器。每个合约在其记录中保有一个计数器 fid。一份 fill 声明它进行精确读取或设置的每个合约的 fid;不匹配意味着该 fill 无法进入。当一份被应用的强制凭证(§8)设置了该合约的某个存储单元时,以及当该合约的定序器存储单元被写入时,该计数器加一。读取或增量不会推进它:读取不改变任何东西,而增量与 fill 所守卫或施加增量的任何东西都可交换。一份对他人以增量移动的存储单元进行精确读取的 fill,像任何凭证一样为该读取负责,如果该存储单元变动了,其定序器就要支付跳过的费用。这就是强制路径和定序器更换如何使建立在它们所绕过的状态之上的每一份 fill 失效,且不向任何人收费:定序器看到 fence 移动,重新构建并重新发布,只损失延迟。

联合定序。一次跨越绑定到不同定序器的合约的调用,会作为一份 fill 落到链上,它携带其精确路径所触及的每一个定序器的签名,受凭证 16 个签名的上限约束,每个签名都计入区块的签名上限和并行 gas,每个定序器在自己的流水线中各有一个 seq,并各自获得意图为其指定的款项。协调,即谁来牵头、如何进行预留、各自收费多少,都在链下,按设计不受约束;链看到的是一份凭证,按构造即是原子的。一份从未被发布的联合 fill 只会阻塞它所在的那些流水线;一旦其窗口过去,每个签署者都会重新使用它所签的编号。

谁为跳过付费。当一份 fill 进入,而某项读取过时或某项写入溢出时,不写入任何东西,不付给任何人,由出错的一方支付跳过费:由按凭证顺序第一个失败的读取或写入来决定,如果该合约在 fill 的精确路径上且链的记录与之一致,账单就交给为该合约声明了自己的那个定序器;在其他所有情况下,账单交给牵头者,即 fill 所指明的保证金所属的定序器。每个列出的定序器在 fill 的位置上都有一笔预留,正是为此而设。用户从不为跳过付费。用户付给每个定序器的款项只在 fill 被应用时结算。

定序器是什么。一台由应用团队运行的普通服务器,采用它所偏好的任何机制:单个进程、一个 rollup、一个联盟。它最先看到其应用的订单流,因此天然就是该应用可提取价值的所在;本设计把这一点明确化,让应用获取该价值,而不是让它泄漏给区块生产者,同时强制路径约束了由此隐含的权力。重型合约变得可行,密码学、一个游戏的全部逻辑、一个合约中的整个系统,因为重型执行在构造时于链下进行,而链并行地核查它。构造是一个竞争性市场:更便宜或更可靠的定序器会吸引用户,而每一个提供构造服务的节点都在增加容量。

8. 强制路径:打包即应用#

一个唯一的门就是它那个定序器的合约,一旦定序器审查、过度收费或消失,它就是一座牢笼。因此每个用户都有一条不需要任何人许可的慢速路径。

用户签署一个开放意图:一个与 §7 中完全相同的意图,没有指定定序器,也没有联合定序器,由用户自己的一次性付款方出资,并把它转发到网络。它在内存池中作为意图而不是凭证传播。区块生产者持有完整状态,并已经结算了该区块的每一份普通凭证,它计算区块末尾的状态,针对该状态按意图 id 的顺序执行它所选择的开放意图,并把由此产生的强制凭证作为该区块的最后几份凭证追加上去。强制凭证的 id 是其意图的哈希,与 fill 的 id 一样。打包即应用:没有队列、租约、配额或截止期限。一份所声明的读取在其被放置位置的状态下不成立的强制凭证,根本不能进入该区块;它是生产者构建的,所以生产者是本可以知道这一点的一方。

按构造有界。一个区块至多携带 16 份强制凭证,每份至多声明 4,000 个派生单位的并行预算(200,000 机器 gas)。合约提供的每一个退出操作,即提取、取消、注销、转账,都必须符合这个预算;给合约作者的规则是提取要符合强制预算。在满载时,强制路径占用创世并行上限的三分之一,普通流量保有其余部分。

失败的调用照样落地。一份调用回滚、突破其界限或耗尽 gas 的强制凭证以其失败形式 FORCED_FAILED 进入:其付款方被扣款并烧毁,找零退回给用户,id 被标记为已见,此外不写入任何东西。只有当针对所声明的读取重新执行该调用确实失败时,有效性才接受失败形式。正是这一点让该路径能抵御滥用:一个转发不可能成功的开放意图的攻击者要为每一个意图付费,而一个意图合理的用户不会被他们饿死,因为生产者为它所打包的东西获得报酬,并且偏好盈余。

fence。一份被应用并设置了某个合约存储单元的强制凭证,会推进该合约的 fence 计数器(§7),因此建立在它所改变的状态之上的每一份 fill 都无法进入。一份只读取定序合约(精确读取或通过守卫)、或只在其中移动增量的强制凭证,不会触动 fence,以失败形式落地的强制凭证也不会;待处理的 fill 照样进入,只有对该强制凭证所移动的存储单元进行了精确读取的那一份会被跳过(§7)。定序器损失的是延迟,仅此而已,而一个在热点合约上每个区块强制一笔交易的用户,每次都要支付强制价格。

报酬。意图的报酬按该区块的基础费覆盖该凭证的手续费;基础费部分被烧毁,其余部分并入生产者的小费。生产者得到的就是定序器本会得到的。

没有状态会被遗弃。一个其定序器已经消失的合约,经由其增量方法保持存活,这些方法不需要定序器;也经由强制路径保持存活,其用户通过它提取,而它自己的代码或管理员也可以通过它调用 SETSEQ 或一次注册,把它绑定到一个新的定序器。审查被反转:它让审查者付出代价,即失去的手续费和绕开它的用户,而网络不付出任何代价。没有任何运营者对安全性起承重作用。

9. 两个市场:串行 gas 与并行 gas#

一条链消耗着三种可扩展性等级不同的资源,即数据、验证和变更,而把它们放在一个市场里定价,就意味着一次签名核查会与一次存储写入同台竞价。Zycord 把手续费拆成两个独立的市场,每个市场都有自己的目标、上限和基础费,保存在共识状态中:

市场计量对象创世价格
串行 gas折叠工作:读取、写入、已花费地址注册表插入、已见集合插入每次读取 100,每次写入 200,每次注册表插入 500,每次已见插入 100
并行 gas验证工作:签名、字节、派生单位每个签名 200,每字节 2,每个派生单位 50

串行 gas 为状态变更定价,这是稀缺资源,是每个节点都按顺序运行的那一个循环。并行 gas 为验证定价,验证能力随每一个加入网络的核心和 GPU 而增长,其上限被设得高而便宜。其结果是一个以不变式形式表述的设计目标:繁重的密码学不会冲击网络,这是由经济构造保证的。一份核查一个大型证明但只写两个槽位的凭证,几乎所有费用都在便宜的市场中支付。

两个市场都具有 EIP-1559 的形态 [12],各自使用自己的单位:基础费被烧毁,优先费支付给生产者,这只发生在被应用的凭证上,且仅限于它们。被跳过的凭证,其费用全额烧毁,不付给任何人。这是经济模型中起承重作用的规则。倘若跳过会带来小费,那么选择区块内容的一方就会因为安排别人的失败而获得报酬。烧毁把这一点反转过来:跳过消耗上限空间却不产出任何东西,因此一个追求收入最大化的生产者就是在追求应用最大化,并会主动避免引发跳过。

只有已应用的 gas 才推动基础费。每个区块统计三个量:已打包的 gas(每一份凭证,无论其结果如何)约束各项上限;已应用的 gas(只有被应用的部分)推动基础费;区块字节数约束字节上限。跳过是一次失败的使用链的尝试,而不是对链的需求的证据;如果已打包的 gas 推动手续费,捣乱者就可以以固定的跳过费用自相冲突的凭证填满区块,并以恒定成本把所有人挤出市场。

串行上限是弹性的。串行目标 T 自区块 0 起就是共识状态,而不是常量,并由一个纪元控制器调节:

  • 在一个区块内,软上限是 2T,硬限制是 4T。在两者之间突发的生产者会丧失其自身收入(部分补贴加上该区块的手续费)中按二次方计算的一部分,而绝不会是任何其他人的份额。
  • 跨纪元地,T 跟随需求:取该纪元已应用 gas 下中位数的两倍,钳制在 T − T/1024 与 T + T/512 之间,以创世值为下限,以创世容量为封顶(见配套文档)。当健康闸门表明网络不健康时,增长被暂缓:被引用的竞争头部超过该纪元区块的 2%。
  • 凭证数、签名数和字节上限从其创世值起随 T 缩放,直至静态容量(2²⁵ 份凭证,8 MB)。

被跳过的凭证烧掉其费用,不登记任何东西,因此提高上限的唯一方法是赢得应用:持续的、无冲突的、烧掉基础费的使用。强行推动增长让攻击者付出的代价,恰好等于自然采用让其他所有人付出的代价。并行市场完全不需要这种考虑:它的目标和上限被固定为串行目标和上限的一个常数倍 3×,即 3T 和 6T,并继承其增长。其谱系是 Monero 的惩罚中位数 [15] 和自适应限制方面的工作 [16]。

构造利差。同一个并行市场为定序器的整形工作付费:一个把许多笔交易聚合进一份凭证的定序器,为它支付一个并行出价,并在意图内部按笔向其用户收费。

10. 网络#

凭证体是链数据。一个区块的凭证体必须可获取,该区块才有效,因此状态总是可以仅凭链本身重建,没有任何运营者,包括定序器在内,会成为数据托管方。凭证比经典交易更大,因为它们携带自己的读取和写入;缓解措施是结构性的:fill 会消去内部写入,已花费的一次性存储单元一旦被埋到回滚视界之下就会被压缩,而节点可以剪除低于它向对等节点通告的某个下限的凭证体。

传输。TCP,然后是 TLS 1.3,对等节点身份为自签名证书中的 Ed25519 密钥:通道被绑定到一个密钥,除此之外不作任何声称。每条消息都有一个 5 字节的帧头,即长度和类型,并且在任何分配之前,长度都要对照该类型自己的上限进行核查。较新版本新增的类型会在一个较小的上限内被读取并丢弃,而不是关闭连接。

类型角色
hello协议版本、网络 id(即创世 id,它承诺了每一个参数)、高度、工作量、监听地址、能力、凭证体下限
certificategossip 传播
block-announce一个头部加上有序的实例字节哈希
get-block / block / block-unavailable以 4 MiB 分块传送的凭证体,或不提供它的原因
get-headers / headers头部优先同步
get-peers / peers地址交换
service-card一则服务公告,按能力区分
open-intent一个用于强制路径的开放意图,发往宣告了该能力的对等节点

中继以哈希优先。凭证彼此独立地以 gossip 方式传播,并在到达时以无状态、并行的方式进行有效性核查。中继节点不需要状态就能限制过滤垃圾信息的成本:无状态有效性可以从字节核查,而持有状态的节点还会拒绝一份其保证金无法覆盖的凭证。中继处理的是实例字节,而不是 id:一份签名失败的凭证只让那一个实例字节付出代价,而不会针对该 id 记录任何东西,因为同一份授权的后来的实例字节可能是好的。区块以区块头加上针对内存池的哈希列表的形式中继 [11],因此传播延迟不随区块内容扩展,而接收方会在获取任何凭证体之前验证区块头的工作量。

同步按经过验证的工作量来选择。正在追赶的节点更偏好其区块头确实证明了最多工作量的对等节点,而不是声称高度最高的对等节点。区块头在获取凭证体之前作为一条链被验证;一条竞争分支只有在回滚视界内连接上、并且比它所替换的链承载更多工作量(在权益证明下,是更多时隙,§11)时才会被采纳。固定检查点嵌入在发行版中,且只在区块至少已有一个纪元之久时才被接受,它们会拒绝一条相矛盾的链,无论其多重,作为发布时代抵御历史改写的一道防线;运营者可以通过标志添加一个固定点。

对等节点会被评分,按身份计:一条无效消息扣 20 分,一次协议违规扣 50 分,一个未提供的凭证体扣 10 分,一次过量请求扣 5 分;一条有用的消息得 1 分;对等节点在 −100 分时被封禁。昂贵的核查,即密钥纪元和工作量证明计算,按对等节点设定预算,并在区块被证明有用时返还,因此攻击者无法让节点在那些毫无结果的公告上空耗工作。

引用。一个头部可以引用至多四个在其父区块高度上的近期竞争头部,不获报酬:引用需要真实的工作量证明,而压制这个信号则需要几乎每一个生产者都省略它。被引用的分叉率就是手续费控制器(§9)所读取的健康信号。

节点接口。读取通过 HTTP 提供,默认绑定到 localhost;提交凭证、开放意图和已签名的服务卡片是仅有的写入。读取按客户端限速,并有一个信任令牌,用于豁免运营者自己的工具。一个采用常见 CPU 矿工所使用方言的 Stratum 端点,让节点可以用外部软件挖矿。

11. 权益证明#

本节规定区块生产从工作量证明转入权益的那个时代的共识。§2 至 §10 的规则保持不变,除非本节另有说明;时间表和每一个取值都在配套文档中。标记为待定的常量由该时代的发行版确定。

改变的是什么。两件事。生产下一个区块的权利,工作量证明以之换取哈希,现在改为按权益抽取;出块间隔从 30 秒降至 5 秒。其余一切保持不变:§2 的每一条有效性规则都由每个节点、对每一份凭证、根据字节进行核查;折叠相同;两个 gas 市场相同;区块中的一份无效凭证会让该区块无效。§10 的引用规则保持不变,以被引用区块头的时隙签名代替其工作量。这个时代所打开的表面就是一个权益证明的表面,没有别的。

计算去了哪里。工作量证明矿工把计算花在哈希上,哈希买来的是安全性,别无他物。这个时代的生产者把同样的计算花在验证上:核查签名、重新执行程序、派生凭证,并行地进行,然后才对它们排序。网络所付费的工作变成了网络所需要的工作。一台普通计算机每个区块验证数以千计的凭证;核心更多的生产者能随交易量增长而跟上。并行验证把上限置于远高于串行循环所消耗的水平之上;在那之外的东西见 §12。

权益。参与者通过一项原生操作 BOND 质押原生币,它把余额从一个持久地址转入一个与该地址绑定的权益存储单元。权益存储单元是协议存储单元:凭证授权这次转移,而由折叠执行写入,正如它对定序器计数器所做的那样。该地址的密钥就是签署区块的密钥。一份权益在质押一个纪元之后才变为活跃,因此权益无法被成串地创建和废弃;UNBOND 在一段长于回滚视界的延迟之后退回余额。最低额由配套文档规定。一把密钥,一份权益。

抽取。区块占据固定间隔的时隙。对每个时隙,从该纪元开启时活跃的权益集合中抽取一个生产者,概率与权益成正比,所用种子由链在上一个纪元中固定并写入信标存储单元(§4);该种子必须不能被固定它的那些区块的生产者所操纵。区块头携带时隙和被抽中生产者的签名,以代替工作量证明;由另一把密钥签名的、或在其时隙之外的区块头是无效的。没有区块的时隙保持为空,下一个被抽中的生产者在它所知道的最后一个区块上构建。抽取是在纪元开启之前就已固定的状态的函数,因此每个节点都能独自推导出它,除区块本身之外不交换任何共识消息。其谱系是 Ouroboros 的时隙领导者抽签 [17] 和 Solana 的每纪元领导者时间表 [21];如果针对已知生产者的拒绝服务成为问题,像 Praos 那样 [18] 把领导者隐藏在可验证随机函数 [31] 之后就是替代方案。

链的选择。§10 按经过验证的工作量来选择,而这个时代按长度来选择:在各条有效链中,选择占据最多时隙的那条 [17];在两条等长的链之间,选择分叉之后第一个区块位于较早时隙的那条。§10 的回滚视界和固定检查点保留下来,它们是抵御用此后已解除质押的密钥进行改写的防线:加入网络的节点接受其发行版所固定的历史,任何更长的链都不能与之相矛盾。

奖励。区块补贴和优先费归被抽中的生产者,正如它们曾归矿工一样,经由同一个成熟期环;被烧毁的部分仍然被烧毁。参与者的预期收入与其权益成正比,而获取它的成本是验证它所打包的凭证。无效区块会被拒绝,并且不向签署它的人支付任何东西。

双重签名。只有一种过错会在共识中受到惩罚:同一把密钥为同一个时隙签署的两个区块头。与一份无效凭证一样,它是一个单消息证明,任何人都能从字节核查。一份举报凭证携带这两个区块头;折叠烧毁签署者自己的质押,把该密钥移出活跃集合,并向举报者支付一个待定的比例。举报在该权益的退出完成之前都会被接受。没有任何其他行为会在共识中受到惩罚,而生产者的任何行为都触及不到其他任何人的币。先例是以太坊信标链上的提议者罚没 [19]。

权益池。权益池是接受委托的权益。任何持久地址都可以质押,并通过一项原生操作 DELEGATE,把它的质押指向一个权益池的密钥;只做委托的质押的最低额小于用于生产的质押。余额从不离开委托者,委托者在同样的退出延迟下改投或解除质押。权益池在抽取中的权重是它自己的质押加上委托给它的数额。权益池所生产区块的奖励由折叠每个纪元拆分一次,不在逐区块路径上进行,在权益池(按其注册时声明的抽成比例)与其委托者(按权益比例)之间拆分。在双重签名时,权益池自己的质押被烧毁,其委托退回给其委托者。权益池内部如何分担验证是权益池自己的事:每个成员验证它收到的那一份,一份凭证可以交给不止一个成员,而运营者汇总答复、组装区块并用被抽中的密钥签名。所有这些都属于构造,在共识之外,按设计不受约束(§1):链看到的是一张委托表、一个由一把密钥签名的区块头,以及一个其凭证会被每个全节点再次验证的区块。小节点贡献它拥有的核心;只有币的持有者贡献权益。其谱系是 Cardano 的权益池 [20],它们同样从不罚没委托者。

权益爬坡期。该时代分三步进入,每一步都是一条共识规则。

  1. 质押。接受 BOND、UNBOND 和 DELEGATE。工作量证明继续生产每一个区块,并获得全部的生产者份额。
  2. 权益爬坡期,历时 90 个纪元。每个区块仍然是挖出来的,并带有为其高度抽中的权益的签名,该签名位于区块头中、工作量证明原像之外;区块 id 覆盖它,因此一个已签名的区块和它的未签名副本是两个区块,而在工作量相等时,已签名的那个胜出。链的选择仍然按工作量,而同一高度上的两个签名不构成双重签名。生产者的补贴份额在矿工和质押者之间划分:计数器 k 从 1 开始,每有一个纪元通过闸门就加一,质押者获得 k/180,因此直到切换为止,工作量都至少保留一半。一个不带签名而被携带的区块是有效的,且不付给任何人:其生产者的补贴份额和其优先费被烧毁,因此矿工把质押者排除在外得不到任何好处,质押者缺席也得不到任何好处。当一个纪元中至少 90% 的区块带有签名,并且活跃权益(包括委托在内)至少持有供应量的 10% 时,该纪元通过闸门。当活跃权益在 30 个纪元内达到供应量的 10% 时,或者最迟在配套文档所确定的那个纪元,以届时存在的任何权益,权益爬坡期开始。在权益于生产中、在 90 个纪元里为十个区块中的九个签名之前,没有任何区块单靠权益生产。先例是 Decred 的混合机制,其中挖出的区块携带权益投票,补贴在两者之间拆分 [22];以及合并(the Merge),其中权益在接管区块生产之前运行了自己的链将近两年 [23]。
  3. 切换。在第 90 个通过闸门的纪元之后的那个纪元的第一个区块是时隙 0:工作量证明结束,间隔变为 5 秒,纪元变为 17,280 个时隙。一个纪元支付的补贴不变;每个区块支付六分之一,空时隙不支付任何东西。每区块上限(§9),连同其下限与封顶值,以及强制路径的数量(§8),都除以六并向下取整,使得在切换的那一刻每天的容量相同,纪元控制器从那里继续。每一个以区块计数来度量时间的常量(成熟期、最大 TTL、意图窗口、回滚视界、中位时间窗口、目录条目的有效期)都乘以六,而在切换之前设定的成熟期或 TTL 会在切换区块处被换算。

最终性。与工作量证明下一样,区块按深度达到最终。金融服务应当等待 10 分钟:120 个区块,而工作量证明要求的是 20 个。早于一个纪元的区块可以被固定为检查点。

常量值
时隙间隔5 s
切换后的纪元17,280 个时隙(一天)
权益爬坡期长度90 个通过闸门的纪元;质押者的比例 k/180
权益爬坡期闸门该纪元 90% 的区块带有签名;活跃权益 ≥ 供应量的 10%
从质押到参与之间的延迟1 个纪元
退出延迟待定;长于回滚视界
被烧毁的质押中支付给举报者的比例待定;低于 50%
抽取函数与种子来源待定
最低权益池抽成比例待定
最低委托额待定;低于最低质押额

12. 超越全面验证#

在工作量证明时代和权益证明时代,每个节点都验证每一份凭证。计算不是限制:验证是并行的,而 §9 的上限在时代边界处被重新固定,直至凭证列表的结构宽度,即每个区块 2²⁵ 份。在撞上那堵墙之前构成限制的是数据:接收每一个凭证体的带宽,以及保存每一个凭证体和已花费注册表每一个条目的存储。本节说明关于超越这一点的道路已知些什么,并把它留给后来的某个时代,在每日交易量接近一个普通节点所能验证的量时按需激活。它是一个方向,而不是一项规范:这些问题有多种解法,各有不同的权衡;网络在很长时间内无需其中任何一种就能满足它将遇到的每一项需求;而为遥远的未来做详细准备,并不比为走这条路的人留下路标更有价值。之前的一切都不改变。作为字节函数的有效性、折叠、带类型的访问、两个市场、定序器和强制路径都保持原样。改变的只是由谁来验证每一份凭证。

凭证所允许的。在重新执行型的链中,即以太坊、Solana 以及从它们派生的链,每个验证者都针对全局状态执行每一笔交易,验证继承了状态的限制,而历史上的答案一直是更大的机器,也就是说更少的节点。节点内部的并行执行,配合像 Solana 那样声明的访问列表 [21],让每台机器更快,却不改变谁需要这样一台机器。Cardano 走得更近:在扩展 UTXO 模型中,验证是确定性的和局部的 [24],但脚本在每个节点上运行,共享状态会发生争用,该模型通过把串行化推给链下的批处理者来解决这一问题,而链并不承认这些批处理者。Rollup,无论是乐观型还是有效性型 [25][26],把执行从基础链上移走,让基础链负责验证:这是正确的分工,代价是第二层、一座跨链桥、一个其强制路径要在一段延迟之后等待的单一定序器,以及,视类型而定,一周的交互式争议期,或者一个成本比执行高出几个数量级的证明者。一份 Zycord 凭证就是一个 rollup 批次,基础链根据其自身的字节核查它,且从不针对其状态执行它,正因如此它不需要第二层:没有跨链桥,因为只有一个状态;没有争议,因为一份无效凭证就是它自己的欺诈证明,只需一条消息;没有证明者,因为验证的成本就是执行的成本;定序器是按合约设置的,强制路径在下一个区块落地,而处于不同定序器之下的两个合约可以在一份原子凭证中组合(§7),两个 rollup 则需要一座跨链桥。至于以分片作为增长答案的地方,即以太坊最初的路线、Near [27]、平行链 [28],分片对状态进行分区,并在分区之间丧失原子性;而 Zycord 的分区,当它到来时,分区的是验证而不是状态:状态仍是一个,折叠仍是一个,每一份凭证仍是原子的,因为当有效性是字节的函数时,由谁来验证一份凭证是一个自由选择。

抽样验证。有了已质押的权益,验证一份凭证的责任可以抽取给权益的一个子集,而不是落在所有权益身上。一份凭证带着其委员会的见证进入区块;任何节点仍然可以自由地验证任何东西;一份无效凭证仍然是它自己的欺诈证明,一条消息,不需要状态,也不需要交互式博弈 [29];而该时代所增加的是罚没作出见证的一方。委员会的规模、见证的形式、挑战窗口,以及在一份被作废的凭证之上已应用的东西会怎样,都是那个时代的规范,并保持待定。其效果是把曲线反转:容量随每一个加入的节点增长,因为每个节点验证的份额更小,而委员会随集合一起增长。

验证锥。收到一份凭证的人不需要整条链就能信任它。读取是声明的,因此它所依赖的凭证集合可以从链上枚举出来:对于每一个被读取的存储单元,是自上一个纪元状态根以来写入它的那些凭证,以及这些凭证所依赖的凭证,依此递归。这个锥,从字节重新验证,并锚定在区块头所承诺的一个纪元根上(§3),就是对接收方所关心之事的完整验证,在几秒钟内、以网络时间完成,不需要电路,也不需要特殊证明。一家接收存款的交易所验证的是该存款的锥,而不是整个网络;在抽样验证下,剩下的就是等待重组和挑战窗口过去,而这正是它今天已经在做的。证明一个存储单元在纪元根上持有某个给定值的证明,是这需要的唯一一种新对象,其形式待定;其谱系是简化支付验证 [1]。

存储。网络已经在做的:已花费的一次性存储单元在回滚视界之后被压缩(§4),节点剪除低于它所通告的下限的凭证体(§10)。仍作为研究课题保留的:按纪元划分的已花费注册表,其中一次性地址会过期,注册表会关闭;以累加器代替注册表 [30];以及由一部分节点保存旧的凭证体,以纪元根作为保证,确保被保存的就是被花费的。

带宽。两条路线。第一条是设计中已有的拓扑:钱包、定序器、生产者。一份 fill 不必泛洪整个网络;它从定序器发往生产者,其他所有人收到哈希,正如中继已经对区块所做的那样(§10)。第二条是把凭证的头部与其主体分开。头部是折叠所触及的东西:id、读取、写入、保证金和出价。主体是验证所消耗的东西:程序、calldata、签名。在抽样验证下,生产者只需要它被抽中验证的那些凭证的主体,以及所有其他凭证的头部,其带宽下降几个数量级。区块继续承诺整个实例字节的哈希,而凭证体继续是链数据,由验证过它们的人和归档它们的人提供;当并非每个节点都持有它们时,如何保证其可用性,是该时代在存在之前必须回答的问题 [29]。

13. 已接受的风险#

以下是各项规则所带来的、按其现状被接受的后果。每一项要么是有界的,要么落在选择了它的一方身上;没有一项能让任何人拿走第三方的原生价值。

  1. 一个其定序器、管理员以及能更换定序器的代码全都已经消失的合约,只能通过强制路径离开:缓慢且更贵,但仍然存活。
  2. 在空区块下,两个基础费都停在 7,高于其下限 1:低于 8 时,向下的步长舍入为零。移动这个停留点需要在时代边界上进行一次参数变更。
  3. 在一个热点合约上大约一个区块的付费手续费骚扰:生产者把自己的强制凭证放在某个用户的强制凭证周围,其影响受该用户的界限约束;以及每个区块一份强制凭证,迫使定序器重建其流水线。
  4. 一个开放合约,即定序器密钥为零的合约,只受其代码保护,而针对它的凭证的作者要为自己的跳过付费:读取是作者选的。
  5. 一种非原生资产,若由烧毁某个一次性地址的那份凭证之外的任何人记入该地址,就会被这次烧毁冻结,因为烧毁只转移原生余额以及该凭证所写入的存储单元。在烧毁一个地址之前核查其资产余额是一条钱包规则,而不是协议规则。
  6. 一份只移动增量的凭证不会推进 fence(§7);在它之前构建的、对它所移动的存储单元进行精确读取的 fill,会在后来的区块中被跳过,费用由定序器承担。定序器避免这一点的办法是:不对其合约允许任何人以增量移动的存储单元进行精确读取。
  7. 对强制路径执行者的残余骚扰:一个拥有许多付款方的攻击者,可以中继那些没有任何凭证能够承载的开放意图,例如付款方余额不足以支付报酬的意图。仅仅回滚或突破其界限的调用不在此列:它以其失败形式落地并付费(§8)。每一个无法承载的意图让执行者付出一次构建的代价;之后该副本被逐出并隔离,而同一付款方上的替换意图必须支付严格更多的费用。
  8. 联合签署者不锁定任何存储单元。它所签署的联合 fill 会在其流水线中占据一个位置,直到该 fill 被携带或其窗口过去(§7)。未被及时携带的联合 fill 可能与这些存储单元上的其他 fill 相遇;无论哪一份第二个进入折叠,都会被跳过,费用由它自己的保证金缴存者承担。
  9. 在开放合约上,保证金地址排序最靠前的凭证会赢得精确读取上的竞争,而地址可以低成本地暴力生成;一个拥有争用激烈的精确状态的合约会选择一个定序器,由其流水线来确定顺序。
  10. 在一个开放合约的精确路径上的普通调用,会把该合约的定序器存储单元声明为精确的零。如果在该凭证落地之前该合约获得了一个密钥,这项读取就过时了,该调用被跳过,并向调用者收费;钱包会在构建这样的调用之前发出警告。
  11. 跳过费是固定的,因此当基础费很高时,一次跳过的成本低于一次应用;尝试同一份凭证的多个变体很便宜,而每个节点都要验证其中的每一个。
  12. 高吞吐量下的带宽和存储是一个已声明的开放问题,而不是一个已解决的问题:凭证体是链数据,每个节点都携带每一个字节,一次机器调用携带它所运行的代码,而已花费注册表每发生一次一次性花费就增长一个条目。道路见 §12。
  13. 在权益证明(§11)下,链的安全性就是一个常规权益证明的安全性:其代价就是聚集抽取权重多数所需的代价,委托也计算在内。权益爬坡期在其截止时间以届时存在的任何权益开始,而闸门的作用是防止切换在没有活跃权益持有供应量十分之一的情况下完成;十分之一的权益缺席就会使其暂停。权益池的双重签名只让它自己的质押受损,无论有多少委托给它;委托者在知晓这一点的情况下选择权益池。用此后已解除质押的密钥进行的长程改写,只靠固定检查点(§10)来阻止,而加入的节点是从其发行版中接受这些检查点的,并不从链上推导它们。

14. 一致性#

规则是架构规范,黄金向量就是协议,而凡是其中任意两者有出入之处,以更精确的一方为准,而这处出入就是一个缺陷。协议存放在一个公开的 spec/ 目录中:参数文件、链 id 登记册、固定检查点、预部署库的映像以及三个向量语料库:

  • 折叠向量:(pre-state, block) → (post-state | invalid, outcomes, fees);一个无效向量记录它所违反的那一条规则;
  • 派生向量:(program, declared reads and writes, deposit) → (reads, writes, artifact, parallel gas),或者在到达机器之前就拒绝该凭证的那条规则;
  • 难度向量:(parameters, headers) → next target,附带对一个候选区块头的裁决;在权益证明下,为 (stake set, seed, slot) → drawn key。

向量是生成出来的,绝不手工编辑。重新生成会驱动参考折叠,把结果在其中重放,然后把提交的 JSON 再通过第二个刻意朴素、与第一个不共享任何代码的折叠重放一遍;第二个折叠不认同的重新生成即为失败。改变一个现有向量的重新生成就是一次共识变更,并按共识变更来审查。一个实现在能复现创世 id 并通过这些向量时即为一致的;它于是是一个对等实现,而不是一个分叉。

15. 与 v1.0 的关系#

本文完整取代 v1.0 [0]。凡两者有出入之处,本文就是协议,且 v1.0 不应与之对照阅读。核心论点不变:自证明的凭证、一个从不执行的折叠、带类型的状态访问,以及两个手续费市场。下面的变更是在实现该设计的过程中发现的;每一项都去除了共识表面以及若干类错误。

v1.0本文
§5,有承保的凭证与承保人每一份凭证都指明一个为它负责的保证金存储单元(§2、§3)。合约通过已签名的意图和定序器 fill 来提供服务(§7)。
§6,定序器联署与租约意图、fill、回执、流水线、fence 计数器以及联合定序(§7)。
§7,带租约和延迟的强制队列强制路径:生产者在区块末尾执行开放意图,打包即应用(§8)。
§9,欺诈证明与抽样权益证明(§11);超越全面验证之路,作为一个方向(§12)。
§10,cEVM 草图完整的方言(§6)。
§12,机密支付不属于本规范。后来的某个时代可以依据其自己的规范来承载它们。
§13–§14,参数、发布、时代、国库、发行配套文档,以其为准。
§15,测量数据不再重述;它们描述的是 v1.0 的参考实现。

16. 结论#

Zycord 对凭证排序,而不是执行交易:有效性由任何人、在任何地方、并行地、仅凭字节核查;状态由一个只做比较和相加的折叠推进;冲突被跳过、被定价,并向选择了它们的一方收费;并发是声明的而不是发现的;应用由定序器在几毫秒内确认,这些定序器在活性上受信任,在安全性上从不受信任;一条强制路径让每一个合约都可触达;以及一种共识,一旦币分发出去,就把它的计算花在验证上而不是哈希上。验证借助网络并不拥有的硬件横向扩展。提交仍然是串行的,而且几乎免费。

参考文献#

[0] The Simstoshi. Zycord: A Peer-to-Peer Network of Self-Certifying State Transitions, v1.0. 2026. 已被本文取代。
[1] S. Nakamoto. Bitcoin: A Peer-to-Peer Electronic Cash System. 2008.
[2] V. Buterin. Ethereum: A Next-Generation Smart Contract and Decentralized Application Platform. 2013.
[3] E. Androulaki et al. Hyperledger Fabric: A Distributed Operating System for Permissioned Blockchains. EuroSys 2018.
[4] A. Thomson et al. Calvin: Fast Distributed Transactions for Partitioned Database Systems. SIGMOD 2012.
[5] R. Gelashvili et al. Block-STM: Scaling Blockchain Execution by Turning Ordering Curse to a Performance Blessing. 2022.
[6] G. Danezis et al. Narwhal and Tusk: A DAG-based Mempool and Efficient BFT Consensus. EuroSys 2022.
[7] J. Zahnentferner. Chimeric Ledgers: Translating and Unifying UTXO-based and Account-based Cryptocurrencies. IACR ePrint 2018/262.
[8] P. E. O'Neil. The Escrow Transactional Method. ACM TODS, 1986.
[9] M. Herlihy, E. Koskinen. Transactional Boosting: A Methodology for Highly-Concurrent Transactional Objects. PPoPP 2008.
[10] M. Shapiro et al. Conflict-free Replicated Data Types. SSS 2011.
[11] M. Corallo. BIP 152: Compact Block Relay. 2016.
[12] EIP-1559: Fee Market Change for the ETH 1.0 Chain. Ethereum Improvement Proposals, 2019.
[13] tevador et al. RandomX: Proof-of-Work Algorithm Optimized for General-Purpose CPUs. 2019.
[14] EIP-4844: Shard Blob Transactions. Ethereum Improvement Proposals, 2022.
[15] Monero: Dynamic Block Weight and Penalty. Monero Research Lab documentation.
[16] bitcoincashautist. CHIP-2023-04: Adaptive Blocksize Limit Algorithm for Bitcoin Cash. 2023.
[17] A. Kiayias, A. Russell, B. David, R. Oliynykov. Ouroboros: A Provably Secure Proof-of-Stake Blockchain Protocol. CRYPTO 2017.
[18] B. David, P. Gaži, A. Kiayias, A. Russell. Ouroboros Praos: An Adaptively-Secure, Semi-Synchronous Proof-of-Stake Blockchain. EUROCRYPT 2018.
[19] Ethereum Foundation. Ethereum Consensus Specifications: The Beacon Chain(提议者罚没)。 2020.
[20] L. Brünjes, A. Kiayias, E. Koutsoupias, A.-P. Stouka. Reward Sharing Schemes for Stake Pools. IEEE EuroS&P 2020.
[21] A. Yakovenko. Solana: A New Architecture for a High Performance Blockchain. 2017.
[22] Decred Documentation: Proof-of-Stake. docs.decred.org.
[23] Ethereum Foundation. The Merge. ethereum.org, 2022.
[24] M. M. T. Chakravarty, J. Chapman, K. MacKenzie, O. Melkonian, M. Peyton Jones, P. Wadler. The Extended UTXO Model. Financial Cryptography Workshops 2020.
[25] H. Kalodner, S. Goldfeder, X. Chen, S. M. Weinberg, E. W. Felten. Arbitrum: Scalable, Private Smart Contracts. USENIX Security 2018.
[26] V. Buterin. An Incomplete Guide to Rollups. 2021.
[27] A. Skidanov, I. Polosukhin. Nightshade: Near Protocol Sharding Design. 2019.
[28] G. Wood. Polkadot: Vision for a Heterogeneous Multi-Chain Framework. 2016.
[29] M. Al-Bassam, A. Sonnino, V. Buterin. Fraud and Data Availability Proofs: Maximising Light Client Security and Scaling Blockchains with Dishonest Majorities. 2018.
[30] D. Boneh, B. Bünz, B. Fisch. Batching Techniques for Accumulators with Applications to IOPs and Stateless Blockchains. CRYPTO 2019.
[31] S. Micali, M. Rabin, S. Vadhan. Verifiable Random Functions. FOCS 1999.

Zycord:发布、时代与参数#

The Simstoshi
2026 — v2.0
GPG:E724 39CE DD85 11F9 D607 550B 87FD 60D5 EB4A 0B29

本文档是 Zycord: A Peer-to-Peer Network of Self-Certifying State Transitions v2.0(以下称“该论文”)的配套文档。该论文定义各项机制。本文档说明 mainnet 是如何发布的、币是如何发行的、哪个时代激活了什么,以及每一个参数的取值。它完整取代 v1.0 论文的 §13 和 §14;凡两者有出入之处,以本文档为准。

1. 发布#

Mainnet 创世:2026-10-07 00:00 UTC(1791331200),链 id 1。

  • 在工作量证明下每 30 秒一个区块;从切换到权益证明起每 5 秒一个区块(§6)。工作量证明:RandomX v2,可用 CPU 挖矿。难度:在 90 个区块的窗口上使用 LWMA。
  • 区块 0 不包含任何凭证、任何地址或任何密钥。区块 0 之前不存在任何币。创世区块可以从公开的源代码复现。
  • 没有投资者轮次,也没有管理员密钥。没有任何代码路径能让任何密钥暂停、升级、铸造、审查或重组。

发布承诺。参数集携带一个对秘密发布消息的承诺。区块 1 必须在其区块头中打开该承诺,因此只有该消息的持有者才能产出区块 1,其他任何人都无法在一条早于所宣布创世开始的链上积累工作量;发行爬坡期让任何抢跑都几乎毫无价值。从区块 2 起,任何矿工都可以构建。

链 id 记录在一个登记册中。该登记册连同每个现行网络所携带的创世 id,被嵌入每一个二进制文件中,并在启动时被核查:节点拒绝已退役的 id,也拒绝会让某个已记录的 id 得到不同创世区块的参数集。节点拒绝以网络所声明的工作量引擎之外的引擎启动。

2. 发行#

补贴平滑地衰减至永久尾部。速率在为期一天的纪元内保持不变,并在每个纪元边界处按基于四个常量的精确整数算术递减:

E(0) = E0
E(n) = max(tail, E(n−1) − floor(E(n−1) / Q))

其中 E0 = 每个区块 21 ZCD,Q = 1054,tail = 每个区块 0.33 ZCD,按 30 秒的工作量证明间隔计。速率大约每两年减半。没有浮点数,也没有表格。创世区块不支付 coinbase。尾部始于纪元 4,376,约第 12 年,届时按时间表已发行 61,836,900.03 ZCD:即时间表总和 62,744,838.47,减去发布爬坡期和创世区块。这些数字就是递推式所产出的结果,无论它是什么;没有任何节点计算过封闭形式。一个 ZCD 等于 100,000,000 drops。

缓慢的开端。最初的 86,400 个区块(30 天)是一段发行爬坡期:区块 h 支付 E(30) · h / 86,400,即爬坡期结束时所在纪元的速率,向下取整,因此奖励从接近零沿直线升至时间表的水平。爬坡期所扣留的部分,约 907,917 ZCD,永远不会补发。

间隔的改变。从切换到权益证明(§6)起,纪元为 17,280 个时隙,每个区块的补贴为 E(n)/6,以 drops 为单位向下取整;递推式不变。一天满时隙所支付的数额在两种间隔下相同:创世曲线上每个区块 21 ZCD 等于每个 5 秒区块 3.5,而 0.33 的尾部等于 0.055。尾部始于同一个纪元 4,376。取整每个纪元扣留不到千分之一 ZCD,且永远不会补发。

尾部为保障当前时代安全的人付费,而不征用手续费市场。与之相抵的是两个市场的基础费烧毁和每一份被跳过凭证的烧毁(论文 §9),因此净发行是尾部减去烧毁,在负载下可以为负。作为供应量的一部分,尾部趋于零。

3. 补贴拆分#

每一笔区块补贴都自区块 0 起由共识按 94 / 3 / 3 拆分。该拆分只适用于补贴,从不适用于手续费,并且对每个区块都相同。在权益证明爬坡期(§6)中,生产者的 94% 本身在矿工与被抽中的质押者之间,按爬坡期已达到的比例划分。

份额接收方截至
94%该区块的生产者,经过 2 小时的成熟期(工作量证明下 240 个区块,权益证明下 1,440 个)始终
3%创始人的持久地址,直接入账,没有成熟期纪元 1,095(三年)
3%国库存储单元始终;从纪元 1,095 起它还会拿走创始人的 3%

没有预挖:该拆分是一条适用于每一个被挖出区块的规则,而不是在创世时的一次分配。在其三年期间,创始人的份额合计不到尾部之前供给量的 2%。一个突破软上限(论文 §9)的生产者只从它自己的份额中丧失收入;国库和创始人的份额从未经削减的补贴中提取。

4. 国库#

国库存储单元是协议地址的原生余额。没有任何密钥哈希成它,没有任何凭证能从中扣款,创世也没有指定任何法定人数。它从区块 1 起累积,而本发行版根本不带任何动用途径。动用途径由一次升级来定义,不早于高度 259,200(约 2027年1月5日),其签署者由社区而不是由创始人选出。在那之前,该存储单元是一个任何人都可以审计、没有人能触碰的公开整数。

5. 管理职责:最初三年(提案)#

状态。本节是一个供社区审议的方向。在 §4 的国库升级固定一组密钥之前,其中没有任何内容是共识规则,而细节只在该方向被接受之后才会被规定。

国库收到什么。第 1 年约 533,000 ZCD,第 2 年约 396,000,第 3 年约 280,000:总计约 121 万。从第 4 年起,它还会拿走创始人的 3%(§3),当年合计约 396,000。这些能买到什么取决于一个无人知晓的价格,而一个清淡的市场无法吸收大额卖出,因此该计划必须在低端价格下也能运作:

ZCD 价格国库,第 1 年一个席位(8%)基础设施(20%)
US$ 0.01US$ 5,300US$ 430US$ 1,100
US$ 0.05US$ 27,000US$ 2,100US$ 5,300
US$ 0.50US$ 267,000US$ 21,000US$ 53,000
US$ 20US$ 1,070 万US$ 853,000(未计上限)US$ 210 万

因此,下面的每一个金额都是国库流入的一个份额,绝不是一个以美元或 ZCD 计的数字。

五个席位。席位先于其担任者被定义。每个席位都有一份公开的章程:它的职责、它的交付成果、它如何汇报以及它的报酬。任何人都可以申请。无论谁担任该席位,都依章程履职,如同依合同履职。

席位职权
首席开发者协议及其发行版。首任担任者:创始人。
审查开发者对每一项共识变更进行独立审查。
矿工一名活跃的矿工;代表区块生产者发言。
社区渠道、文档、支持和新用户引导。
公开代表一名身份公开的人;负责交易所、合作关系以及代表项目签署的协议。

决策。

  • 一笔支出需要 5 人中的 3 人同意。
  • 更换担任者、轮换密钥、动用储备金或修改章程需要 5 人中的 4 人同意,并在生效前公示 7 天。
  • 任期为一年,可以续任。候选资格公示 30 天。首批五位担任者就是节点运营者所采用的那次升级所固定的那组密钥;之后的硬分叉可以重新固定它。

报酬是参与,不是薪水。一个席位的份额以锁定状态累积,每六个月释放一次,前提是一份公开的报告以及其他 4 位担任者中 3 位的投票。没有任何担任者对其自身报酬的释放进行投票。未被释放的部分回到储备金。席位报酬由章程固定,不由支出投票来设定。每个席位设有一个上限,按释放当日的市场价格衡量,任何超出部分都转入储备金。

预算,以流入份额计。

份额用途规则
40%五个席位,每个 8%锁定,按上文所述每六个月释放一次
20%基础设施凭公开的收据按成本报销
25%黑客松、活动和悬赏按提案,5 人中 3 人同意,交付后支付
15%储备金仅限 5 人中 4 人同意

基础设施拥有第一优先权:节点、种子节点、浏览器和构建服务器目前每月花费约 US$ 500。报销按支付当天的市场价格换算。该份额在第 1 年每 ZCD 约 US$ 0.06、第 2 年 US$ 0.08、第 3 年 US$ 0.11 的价格下能覆盖这项成本;低于此价格时,差额无息结转,并在份额允许时支付。

创始人。创始人那 3% 的补贴(§3)是对直到发布时以及发布当时所做工作的回报。它与首席开发者席位相互独立,该席位与其他任何席位一样,按持续进行的工作获得报酬。创始人持有五把密钥中的一把,并且不对该席位报酬的释放进行投票。

共识强制执行的内容。一旦该升级落地:5 人中 3 人的支出,以及带延迟的 5 人中 4 人的轮换。本节中其余一切都是规范准则。强制执行一项准则的,是每一笔支出都是一份普通凭证,公开可见,并且仅凭链本身就能统计。

待定。每个席位的上限。公开代表进行签署所依据的法律形式。在机器激活之后,六个月的锁定是否由标准库中的一个托管合约来强制执行。

6. 时代#

时代是编译进公开发行版的高度常量。一个低于某道关口、却携带了该关口所启用程序的区块是无效的,而这项高度核查是区分各个时代的唯一东西,Era 2 的权益爬坡期和切换除外,它们由高度界限内的状态触发。新的时代可以增加规则和记录类型;它永远不会改变一个现有区块在其激活高度以下的含义。

时代激活于存在什么
0 — 挖矿与支付区块 0中本聪规则下的工作量证明;原生资产(论文 §5);一次性地址与持久地址;两个手续费市场;补贴拆分;国库累积,处于封存状态
1 — 机器高度 80,640(28 个纪元,约一个月)cEVM 与标准库(论文 §6);带定序器和管理员的合约记录;意图、fill 与联合定序(论文 §7);定序器目录;强制路径(论文 §8)
2 — 权益证明质押:纪元 182(高度 524,160,2027年4月7日)。权益爬坡期:活跃权益 ≥ 供应量的 10% 并持续 30 个纪元,最迟在纪元 273(2027年7月7日)。切换:爬坡期完成之后那个纪元的第一个区块;如果闸门从不使其暂停,最迟在纪元 363(2027年10月5日)BOND、UNBOND 和 DELEGATE;在权益爬坡期内,挖出的区块由被抽中的质押者联合签署;从切换起,由权益单独生产的 5 秒时隙,工作量证明退役(论文 §11)
S — 机密支付在独立审计和一个对抗性的公共 testnet 之后隐藏金额与一次性地址

Era 2 和 Era S 各自以硬分叉方式作为其自己的发行版交付,附带一份规范、一个对抗性的开发网络和审查。Era 2 按高度开启质押,按权益开始其权益爬坡期并设有截止时间,并在权益爬坡期完成时切换:切换最早可能发生在纪元 303(第 10 个月),而对开始时间设定的截止保证了权益爬坡期在第 9 个月末之前已经开始。就 10% 的阈值而言,权益是包含其委托在内的活跃权益,供应量是已发行的币,两者都按纪元开启时计。闸门可以让切换暂停到纪元 363 之后;它做不到的是阻止其开始。

权益。最低质押额为 1,000 ZCD,一份权益在质押一个纪元之后参与。只做委托的质押有更小的最低额,由该时代的发行版确定,且从不离开委托者的保管。最低额以 ZCD 而不是以美元计,因为没有任何规则能读取价格;它在时代边界处随区块上限的增长而修订。

Era 0 被刻意做得很小,而 Era 1 被缩减到设计所需的程度:没有管理员密钥,就没有暂停按钮,因此每一行共识代码都是一行可能让网络无法挽救地死掉的代码。不可达的共识代码就是无法审计的共识代码,不予交付。一个没有证明其价值配得上其复杂度的时代永远不会被触发。

这一过渡之所以可行,是因为折叠并不关心由谁排序:Era 2 改变的是区块头上是谁的签名。

Era 1 关口。关口区块把该时代编译进来的常量写入协议存储单元,因此从那时起状态根就承诺了它们。在关口之后的前 240 个区块里,一份运行 SETSEQ 的凭证必须携带一个至少超出关口 240 个区块的 TTL,并等待它进入范围。

Era 2 与度量时间的高度。切换之后,高度推进的速度快六倍。每一个实际上是时长的创世常量(创始人份额的结束、coinbase 成熟期、最大 TTL、意图窗口、回滚深度、中位时间窗口、目录条目的有效期),都被 Era 2 按其所度量的单位读取:高度 3,153,600 是 1,095 个 2,880 区块的纪元,而该时代在纪元 1,095 结束创始人份额。创世参数表不变,因为共识根遍历每一个参数,移动其中一个就会移动每个现行网络的创世 id;该时代的常量是编译进来的,就像 Era 1 的一样。

7. 参数#

参数集在创世时冻结,在编译时嵌入每一个二进制文件,并且只能通过硬分叉改变。它的共识根进入每一个签名。zcd params 打印一个构建版本中编译进来的值;zcd genesis 打印网络、链 id、参数哈希、创世 id 和状态根。

参数mainnet 取值
链 id1
创世时间1791331200(2026-10-07 00:00 UTC)
出块间隔30 s
纪元2,880 个区块
工作量引擎RandomX v2
难度窗口90 个区块,LWMA
创世补贴21 ZCD
尾部补贴0.33 ZCD
衰减除数每纪元 1054
发行爬坡期86,400 个区块
生产者 / 创始人 / 国库94% / 3% / 3%
创始人份额结束高度 3,153,600(Era 2 将其读作纪元 1,095)
coinbase 成熟期240 个区块
最大 TTL240 个区块
跳过费1,000,000 drops
每份凭证的最大读取数 / 写入数 / 签名数64 / 64 / 16
每次转账的转移数32
每份凭证的退役地址数64
串行 gas 目标1,600,000
串行目标封顶值5,120,000
并行 gas 比率3×:并行目标 3T,上限 6T
每区块凭证数创世时 4,000
每区块签名数创世时 6,000
区块字节数创世时 2.5 MB,容量 8 MB
上限增长 / 衰减除数512 / 1024
健康闸门被引用的竞争头部占 2%
初始基础费,串行 / 并行1000 / 10
基础费步长每区块 1/8
每区块引用数4
回滚深度1,024 个区块
未来时间上限180 s
中位时间区块数11
Era 1(h1_vm)80,640
为权益证明保留的高度1,576,800(在创世时冻结;没有任何规则读取它)

Era 1 的常量是编译进来的,而不是参数,因为共识根遍历每一个参数,增加一个就会移动每个现行网络的创世 id。

常量(Era 1)值
意图窗口(TTL − NotBefore)至多 8 个区块
每区块强制凭证数16
每份凭证的强制并行预算4,000 个派生单位(200,000 机器 gas)
目录条目的有效期259,200 个区块(约 90 天)
每份 fill 的签署者数至多 16

Era 2 的常量出于同样的原因是编译进来的。

常量(Era 2)值
质押开启纪元 182
权益爬坡期开始活跃权益 ≥ 供应量的 10% 并持续 30 个纪元;最迟在纪元 273
权益爬坡期长度90 个通过闸门的纪元;k 从 1 开始,每通过一个纪元就增加,质押者的比例为 k/180
权益爬坡期闸门该纪元 90% 的区块带有签名,且活跃权益 ≥ 供应量的 10%
权益爬坡期内未签名的区块有效;其生产者的补贴份额和其优先费被烧毁;在工作量相等时,已签名的区块胜出
切换后的时隙间隔5 s
切换后的纪元17,280 个时隙
切换后每个区块的补贴E(n)/6,以 drops 为单位向下取整(创世曲线上为 3.5 ZCD;尾部为 0.055);空时隙不支付任何东西
切换后的 coinbase 成熟期与最大 TTL1,440 个区块;高于切换高度 S 的成熟期、TTL 或目录到期高度 x 变为 S + 6·(x − S)
切换后的意图窗口至多 48 个区块
切换后的中位时间区块数67
切换后的回滚深度6,144 个区块
切换后目录条目的有效期1,555,200 个区块
切换后的每区块上限串行目标、其下限及其封顶值除以 6,向下取整;凭证、签名和字节上限像创世时一样跟随 T,其封顶值除以 6
切换后每区块的强制凭证数2
建议的最终性等待切换前 20 个区块,切换后 120 个(10 分钟)
创始人份额结束纪元 1,095
最低质押额1,000 ZCD
从质押到参与之间的延迟1 个纪元
最低委托额待定;低于最低质押额
退出延迟待定;长于当时有效时代的回滚视界
被烧毁的质押中支付给举报者的比例待定;低于 50%
最低权益池抽成比例待定
抽取函数与种子来源待定