一条链只有 KB 级?Mina 用递归 SNARK 折叠全链历史 图 1
一条链只有 KB 级?Mina 用递归 SNARK 折叠全链历史 · 图 1

一条运行多年的区块链可以只有十几 KB 大。Mina 协议做的事情听起来违反直觉:把从创世块到最新块的全部历史,折叠成一条固定大小的零知识证明。官方白皮书把这种设计叫 succinct blockchain(简明区块链),核心是递归 SNARK——每个新区块不仅证明自己这几笔交易合法,还顺便证明”上一块附带的那条证明”本身合法。链条因此不再是一串需要重放的账本,而是一条不断被重新证明的密码学断言。

递归证明怎么折叠历史

朴素想法是给每个块重新生成一条”从创世到现在全部有效”的证明,但证明开销会随历史增长而不可承受。Mina 的做法来自增量可计算 SNARK:第 i 块的证明只验证第 i-1 块证明的有效性加上本块交易的合法性。验证一条新证明等于验证整条链,而计算新证明的成本只与本块新增的交易量相关。白皮书记载,实现中的状态证明只有 864 字节、验证耗时约 200 毫秒——这个量级让手机直接完成全量验证成为设计目标,而不是宣传修辞。

谁来产生证明

机制示意(图片由 Agnes 生成,非产品界面或链上数据图)

折叠不是白做的,工作被拆给两种角色。出块者按权益证明(基于 Ouroboros Praos 改造的 Ouroboros Samasika)中标后,从交易池和 SNARK 工作池里挑选交易与待办证明,构造下一状态并生成新的递归证明;专职的 SNARK 工作者则预先为若干笔交易生成交易级证明供打包。另一个容易被忽略的细节是两份账本的分工:链上证明绑定的是”snarked ledger”——落后若干块的已证明账本;最新状态(staged ledger)由出块者显式执行交易得到,其保证依赖出块者的诚实执行而非那条证明。读 Mina 的区块结构时,这个差别决定了”已证明”和”最新”之间的那段信任空隙。

共识也要迁就简明性

白皮书专门解释了一个常被跳过的约束:普通权益证明选链时往往要回看分叉点附近的历史,这与”不存历史”的简明目标直接冲突。Mina 为此设计了对应的链选择与长程攻击防护——无法照搬 Ouroboros Genesis 的方案,因为那要求节点能任意回取历史。工程上的替代是密度类参数与检查点机制配合常量 k(文档示例中为 290)界定终局性窗口:其上叠加足够多区块后,反转概率才低到可忽略。这类”为了保住固定大小而对共识做的改造”是评估简明链时最该看的地方——省下的存储成本被转嫁到了证明计算和参数假设上。

边界与代价

固定大小的好处对所有角色对称地成立:轻客户端秒级同步、全验证不再依赖带宽。但链条变短不等于工作消失。出块者与 SNARK 工作者仍要维护完整账本数据;证明系统需要可信初始化参数的管理与其演化;被证明的账本落后于最新账本的那段窗口内,依赖的是出块者诚实执行交易。2021 年那篇技术分析给出的另一笔体积账也值得引用:按实现实测,一条链状态加上验证密钥约十一 KB 量级,官方”约 22KB”的说法反而保守。数字会变,结构不变:Mina 把存储压力换成了计算与信任结构,验证便宜的代价是让证明生产成为专职角色。

小结

递归 SNARK 给扩容提供的不是”更快的执行”,而是”更便宜的验证”。它适合的场景——移动设备自证、跨链轻验证、低带宽环境——都建立在同一件事上:历史可以被证明,而不必被重放。读这类方案时的检验问题也统一:哪部分状态被证明覆盖、哪部分依赖执行者诚实、证明系统自身假设是什么。本文只解释协议机制,不构成任何投资建议。