
ZK Compression 主题演讲:Breakpoint 2024
以下内容概述了 Breakpoint 2024 大会上的 ZK Compression 主题演讲和问答环节,并总结了其中的要点。演讲由 Light Protocol 联合创始人 Swen Schaeferjohann 和 Helius 联合创始人 Nicolas Pennie 主讲,探讨了 ZK Compression 是什么、如何运作,以及最重要的一点:为什么它对 Solana 的未来至关重要。
下载演示幻灯片。
ZK Compression:归零
开发者在使用 Solana 时很快就会发现,尽管计算成本相对较低,但数据存储成本很高。例如,假设 SOL 的价格为 150 美元,创建 1,000 个代币账户的成本约为 300 美元,而创建 100 万个账户则需要 30 万美元。由于这些成本会随 SOL 价格上涨,将应用扩展到庞大的用户群体在经济上难以承受。此外,状态增长也是所有有状态区块链面临的挑战。创建新账户后,必须支付租金才能维持这些账户,成本高昂。目前,Solana 已有超过 5 亿个账户,每天新增约 100 万个账户。
ZK Compression 通过以下方式解决这些问题:
- 将账户成本降低一千倍
- 解决状态增长问题
- 为 Solana 上的 ZK 计算奠定基础
状态压缩 + ZK
要理解 ZK Compression,我们首先需要拆解状态压缩。它主要包括五个关键阶段:
- 数百万个账户 → “指纹”
- 在链上存储指纹
- 在 Solana 账本中存储账户历史记录
- 使用索引器缓存最新的账户状态
- 通过链上“指纹”验证压缩账户的状态
首先,我们压缩数百万个 Solana 账户,并将它们哈希为一个紧凑的“指纹”。该指纹存储在链上账户中,而完整的底层账户数据仍可通过 Solana 账本访问。为了确保这些链下账户有效,我们使用证明器机制,通过链上指纹验证其完整性。该流程的最后一步使用零知识 SNARK,为负责验证这些账户完整性的证明系统提供支持。
为什么选择 ZK Compression?
多项关键特性让 ZK Compression 成为理想的状态压缩解决方案。例如,压缩账户的行为与标准 Solana 账户相似,因此开发者可以继续使用现有技能和开发方法,学习门槛很低。这降低了上手难度,让开发者能够轻松采用 ZK Compression。
索引器公开的 API 与现有 RPC 调用高度一致。例如,getAccountInfo 方法可直接映射到 getCompressedAccount,而且这种一一映射关系覆盖整个 RPC API。这种一致性简化了 ZK Compression 与现有 Solana 工具和工作流的集成。
压缩 PDA
该系统的一项关键特性是支持压缩的程序派生地址(PDA)。PDA 是确定性账户地址,可使用特定的程序地址和种子稳定推导出来。压缩 PDA 有助于消除竞态条件、地址冲突,以及为相同程序地址与种子组合意外创建多个账户等问题。这项增强功能是从现有 SPL 账户压缩系统迁移到 ZK Compression 的主要原因之一。
在全面支持 ZK Compression 后,它将对 Solana 产生重大影响。PDA 和程序组合能力让开发者可以构建涉及多个程序和不同 PDA 的复杂架构,其体验与构建传统应用时熟悉的开发方式一致。实现这些功能所需的成本仅为以往的一小部分,账户费用最多可降低一千倍。如此大幅的成本下降将解锁过去因成本过高而无法实现的新用例。
可组合性改进
一切都直接在 Solana 上运行——它既不是 L2,也不是 validium。Solana 账本会自动提供数据可用性,确保执行过程可验证且完全可组合。
零知识证明将证明大小缩减为固定的 128 字节,为每笔交易中的其他操作释放更多空间,从而简化组合并为额外活动提供更大的灵活性。无论一笔交易中更新、读取或写入多少个账户,也无论需要证明多少项包含或排除关系,证明大小都保持不变。这一点至关重要,因为 Solana 的交易大小本身很小(1.2 KB)。为了实现快速证明,状态 Merkle 树需要使用不同的哈希函数,因此我们无法使用原有的 SPL 账户压缩程序。
解压缩
另一项关键特性是解压缩。它可以避免锁定,并让“常规”账户与压缩账户无缝互操作。任何 Solana 账户都可以被压缩,从而收回租金成本。你也可以随时解压缩账户,在两种形式之间轻松切换。例如,如果你需要兑换某个压缩代币,只需将其解压缩,然后通过 Jupiter 执行兑换即可。
解压缩让热状态与冷状态之间可以无缝切换。例如,如果你正在开发一款包含各种压缩卡牌和物品的游戏,可以在战斗期间解压缩它们,以便快速变更状态;战斗结束后再重新压缩,保存生命值变化等最终结果。在单个 slot 内,同一棵树的并发操作存在一些限制。如果需要在一个区块内多次更新同一账户,应避免使用压缩。在这种情况下,最好永久解压缩该账户,让它作为常规链上账户运行。例如,AMM 池账户更适合采用这种方式,因为其状态需要频繁更新。该系统足够灵活,可以在同一笔交易中同时与压缩和解压缩账户交互。
这一完全通用的解决方案不局限于单个程序、业务逻辑或应用。Solana 账户可以低成本压缩,并获得内置索引支持。它完全开源、可用于生产环境,并能适配各种用例。
压缩代币
除非交易所和 DeFi 平台明确支持,否则压缩代币无法直接与它们兼容。不过,这个问题很容易解决:只需将压缩代币解压缩为标准 SPL 代币,即可像普通代币一样用于 DeFi 和交易所。这种灵活性确保不存在锁定,用户可以根据需要在压缩代币与普通代币之间切换。压缩代币适合交互频率较低的冷应用,而普通代币账户更适合热状态或频繁使用的资产。该系统的一项主要优势是可以将冷状态数据移入压缩存储,在保留所有优势的同时更高效地管理状态,从而解决状态增长问题。
在首个版本中,我们推出了压缩代币。它使用的工具与任何支持压缩的应用相同。压缩代币程序与 Solana 代币程序完全一致,可提供相同的用户体验,同时将成本降低一千倍。代币扩展预计将于 2025 年初上线。
借助解压缩等功能,你可以大规模空投代币,并在需要参与 DeFi 活动时快速解压缩。零知识(ZK)证明通常被视为高成本计算的终极方案,但我们对流程进行了优化,使转账方式与标准 SPL 代币转账相似,并将证明时间缩短至毫秒级。这将生产级消费端 ZK 推向前沿,大幅降低代币账户的管理成本。
ZK Compression 如何运作?
整个系统包含五个主要组件:
- 状态树森林
- Light System Program
- Compressed Token Program
- Forester 节点
- 索引器(Photon)
状态树森林
首先是状态 Merkle 树,我们称其为“状态 Merkle 树森林”。该结构可为一组账户创建唯一的加密指纹,并将其存储在链上。例如,如果有四个账户,可以通过递归哈希将它们组成一个 Merkle 树结构。
顶部最终生成的 32 字节哈希为所有账户的底层数据完整性提供加密保证。通过将账户状态与状态根进行比较,可以轻松验证任意账户的状态是否属于这棵 Merkle 树。这里使用“森林”一词,是因为系统中存在多棵 Merkle 树,每棵树都有自己的根。
与现有 SPL 账户压缩方案对比
相比现有 SPL 账户压缩程序,ZK Compression 的一项重大增强是能够证明某个状态属于指定的 Merkle 树,同时确保生成的证明符合 Solana 的交易大小限制。通过管理地址树,我们可以证明指定地址的唯一性。地址树与状态 Merkle 树类似,但增加了一项功能:证明某个叶节点包含在树中时,还能证明特定数字范围不在其中。这样便能使用小得多的 Merkle 树处理 248 位地址空间,并确保地址的唯一性。
可以针对 N 棵树证明 M 个账户,同时将证明大小固定为 128 字节,因此能很好地适配 Solana 1.2kb 的交易大小限制。在链下进行的证明生成比现有 SPL 账户压缩程序成本更高。不过,链上进行的证明验证成本保持不变,而且在大多数情况下通常比现有压缩程序更低。
Light System Program 与 Compressed Token Program
该协议涉及两个关键程序。Light System Program 是一个链上合约,与 Solana System Program 相对应。它与 Merkle 树交互,执行标准 Solana 账户模型,并验证 PDA 的唯一性。Compressed Token Program 复现了 SPL 代币程序,并在压缩账户模型中强制采用 SPL 数据布局。
Forester 节点
Forester 节点负责管理这片轻量树森林。更新压缩账户时,新的账户状态会追加到树中,而旧状态会被归零或置空。
这种方法会产生两项关键影响。首先,任何状态更新都会导致根发生变化,因为修改会沿着倒置的 Merkle 树向上传播至顶部。其次,树会逐渐填满并最终达到容量上限,这时就需要轻量树森林发挥作用。
Forester 节点负责维护状态根。它们会异步更新状态根,并处理已满状态树的滚动更新。任何人都可以无许可地为自己的状态树运行 Forester 节点,其运行方式与 RPC 类似,因此每个人都能管理自己的状态更新。作为应用开发者,你自身就有维护压缩状态的需求,这会形成一种自然激励,促使你妥善管理状态树。你既可以运行自己的节点进行自托管,也可以付费让服务提供商代为处理。
Photon
Photon 索引器是一种开源解决方案,用于跟踪和管理区块链上与压缩账户相关的更新、创建、变更及其他事件。它会监听链上活动并缓存这些账户的当前状态。此外,它还会生成可用于验证或数据变更的加密证明。
可用于生产环境的 Photon 索引器整合了从早期压缩版本中获得的经验,并进行了重大改进。无论你是独立开发者、企业还是 RPC 提供商,它都致力于提供易用且便于访问的体验。
本地开发流程已大幅简化。它提供一个一键式 CLI 工具,可以与你的本地环境无缝集成。此外还有一个面向开发者的浏览器,提供可视化界面,用于查看压缩账户、跟踪其变化并检查交易历史记录。
Photon 每天生成快照,从而加快开发和部署速度。开发者无需从创世区块开始重新索引,而是可以从快照启动,将引导和启动时间缩短至 15 分钟以内。这些快照还增强了可复制性,确保即使某个 RPC 提供商停止支持压缩,你也能轻松获取快照并独立运行索引器。快照最大限度地降低了数据丢失风险,并可存储在 FileCoin 等去中心化解决方案中。
Photon 允许你只索引一部分数据,从而显著降低硬件要求并缩小数据库规模。只需一条 CLI 命令,即可使用 SQLite 完成此操作。如果你是 RPC 提供商,也可以选择索引完整数据集。任何 Helius 套餐都可使用 Photon,你也可以独立运行它,或请求其他提供商提供这项服务。
由开发者打造,为开发者服务
我们完全专注于开发者,并在积极推进三项专门用于改善开发者体验的重大改进。
面向压缩的 Web3.js
该 SDK 的使用方式与 Solana web3.js 类似,但全面支持压缩。要发起压缩代币转账,首先需要获取你的压缩代币账户,然后使用这些账户从 RPC 或专用证明器节点获取有效性证明。之后,你可以像使用 SPL 代币程序一样构建指令,指定要发送的内容、数量、铸币地址和接收方,从而创建一笔常规 Solana 交易。
完整的本地开发环境
我们提供一个测试验证节点,其中预配置了本地开发所需的一切,包括所有必要程序、Photon 索引器和本地证明器节点。这为开发者提供了更精简的设置流程。
Anchor 宏
对于熟悉使用 Anchor 开发 Solana 程序的人,我们的目标是让压缩账户的使用体验像常规账户一样顺畅。如果你以前编写过 Anchor 程序,会立刻认出这种熟悉的开发体验。Anchor 宏目前仍在开发中。
Airship
Airship 提供了一款简单且经济高效的大规模代币空投工具,让开发者现在就能利用 ZK Compression。它同时提供用户界面和 CLI,并且完全开源,因此开发者可以对其进行 fork 和修改,以满足自己的需求。随着越来越多的开发者空投压缩代币,生态系统将开始在各种应用中采用它们。不过,如果希望立即转换,开发者也可以立刻解压缩这些代币,因此 Airship 如今也可作为常规代币的开箱即用空投工具。
该工具自动支持向 Solana Mobile 持有者、特定代币持有者或 NFT 系列持有者空投。如果你已经生成了接收方名单,也可以导入 CSV 文件,并指定要空投的代币和数量。如果遇到互联网连接中断等问题,CLI 和用户界面都允许你从上次保存的状态恢复空投。这对于大型空投尤其有用,因为向大量地址分发代币可能需要 30 到 45 分钟。
应用的全新设计空间
ZK Compression 只在活跃验证节点的内存中存储所有账户最终的根哈希,从而解决状态增长问题。这种方法能有效缓解状态增长。此外,ZK Compression 还为应用开辟了新的设计可能性。以下只是其中几个潜在用例:
- SPL 代币压缩器
- 10 亿种 meme 币
- 面向 Twitter 帖子的预测市场
- DePin 网络节点的标识符 PDA
- 可验证的奖励计算与分发
- 信任最小化桥
- ZK 身份协议
文档中还提供了更多创意。
ZK Compression 现已在主网和 devnet 上线!你可以先阅读我们的文档并完成其中的示例。此外,我们还在举办一场奖金最高达 45,000 美元的黑客松。
如果你想更深入地了解 ZK,可以阅读我们此前发布的 Helius 博客文章,深入了解零知识证明的基础知识及其在 Solana 上的应用。
相关文章
订阅 Helius
及时了解 Solana 开发的最新动态,并在我们发布新内容时收到更新


