作者 @msfew, @Shuyang
感谢 Jules de Smit, Sinka, 和 Guo Yu 的审核与评论.
我们的上一篇博客谈到了 zkWASM 以及为什么 zkWASM 是通用计算的最佳基础设施. zkWASM 的通用性和灵活性, 可以 100% 支持 Hyper Oracle 的索引和自动化协议中任何用户所定义的 zkGraph.
这篇博客介绍了 zkPoS 以及 zkPoS 是如何成为 Hyper Oracle 的去中心化协议中最重要的一块拼图. zkPoS 具有通过 ZK 为共识生成证明的能力, 可以实现 Hyper Oracle 索引和自动化协议的端到端去信任与安全性.
以太坊现在所采用的是 Gasper PoS 协议.
严格意义上来说, PoS 是以太坊 2.0 抗女巫攻击的机制 (限制谁可以参与区块生产过程). Gasper 是实际以太坊所使用的的 PoS 共识协议, 结合了 FFG Casper (finality gadget) 和 (a variation of) LMD-GHOST (fork choice rule).
就像 zk rollup 这个词比 validity rollup 这个词使用得更广泛一样, 在这篇文章中, 我们将把以太坊 2.0 的共识称为以太坊 PoS.
除此之外, 你也可以深入阅读 Vitalik 所写的以太坊 PoS 共识未来路线的文章: Paths toward single-slot finality.
现在我们可以深入了解以太坊 PoS 的实际概念.
一个给定的委员会中的每个验证者被映射到一组块中, 来验证每个纪元. 委员会则被 randao_mix 分配来验证区块.
从一个委员会到一个区块的证明包含一个代表投票的 bit-string 和一个聚合的签名 ( 我们将在后面的章节中讨论聚合签名的内容 ).
当一个检查点和上一个检查点之间的区块包含了至少 2/3 的总票数时, 该检查点就是有效的 (Justified). 一个合理的检查点在其连续的检查点 ( 也需要是有效的 ) 之后, 将被视为最终完成 (Finalized). 其他区块在最近的后续检查点被证明是合理的或被最终确定后, 就被认为是合理的或最终确定.
zkPoS Attestation 中的 Attestation ≠ Committee Attestation 中的 Attestation
为了避免混淆, 我们需要强调, 本节中的 “Attestation “本质上是对某一特定区块投票的表示, 与我们实现的全局状态的 zkPoS Attestation (ZK 证明 ) 不同.
在学习 zkPoS 之前, 我们需要了解区块链节点不同定义的一些基本知识.
在以太坊 PoS 的背景下, 区块链节点的一个比较简单的定义框架如下:
接下来我们将只关注轻客户端, 因为普通用户不会运行完整节点. 除了 “普通用户问题”, 移动端、浏览器和链上合约场景只可能运行轻客户端节点.
轻客户端也有不同类型. 它们可以被划分为不同用途的验证者 (Verifier).
需要注意的是, 共识验证者轻节点仍然需要在整个共识上信任其他节点. 既然它可以验证证明, 为什么不直接让它验证以太坊 PoS 整个共识的零知识证明呢?
在 Hyper Oracle 的愿景中, 我们的目标是实现端到端的 Trustless.
我们需要实现验证以太坊 PoS 整个共识的轻节点. 在以太坊路线图 The Verge 中, 它也被称为 “SNARK-based Light Client”.
zkPoS Attestation 的优点是:
ZK 化的轻客户端将验证我们的 zkPoS Attestation 的 ZKP. 它可以非常容易地在 Web App 或浏览器的插件中运行.
验证 zkPoS Attestation 将是使我们的 zkMiddleware 完全 ZK 化的重要基础. 它将使我们的 Meta App zkIndexing ( 基于 GraphQL 的 Trustless 索引和查询 ) 和 zkAutomation ( 基于 GraphQL Off-chain Source 的 Trustless Automation 和 Keeper) 能够访问和同步有效的区块头.
之后, 我们可以通过有效的区块头抓取 receipt, state, 和 transaction 根. 在 zkIndexing 中, 我们获取 receiptRoot, 然后获取收据的编码数据, 最后根据收据的原始数据用 RLP 解码获得合同事件.
以太坊 PoS 的算法非常复杂, 很难用一个简单的图表或一个段落来描述. 而且, 以 ZK 的方式实现它们需要大量的工程工作和架构设计 ( 就像 zkEVM). 因此, 为了实现 zkPoS, 有必要将这些组件分割开来, 逐一实践它们.
zkPoS 最优先的算法是 Block Attestation. 换句话说, 通过 Pairing 验证 BLS 签名是 zkPoS 最关键的部分. 我们将在后面的章节中详细介绍这部分内容.
简而言之, 对于 Hyper Oracle 的 zkPoS, 我们将实现以太坊 PoS 的如下算法.
几个纪元前的随机种子将决定每个区块的提议者.
这个算法的底层组件之一是洗牌算法, 它也将被在下一个逻辑中应用.
每个纪元, 通过随机种子和洗牌算法, 整个验证者集合被重新洗牌为不同的委员会.
验证者候选者: 任何节点存款 ≥32ETH 则可成为验证者候选人.
正式验证者: 在一个验证者候选者进入队列不少于 4 个纪元后, 它将被激活为正式验证者.
要离开验证器集并提取余额, 一个节点必须进入退出队列时间不少于 4 个纪元. 这种验证器的退出可以由自愿退出或因行为不端而被 Slashing 所触发.
特别是, 有效余额低于 16ETH 的验证器将被停用.
一个区块只有在该纪元的相应委员会成员有多数 (2/3) 赞成该区块的投票时才会被认证.
这是以集合签名和代表投票的 bit-string 的形式实现的, 其中当且仅当相应的验证人投票时, 每个 bit 都是 1.
要注意的是, 本文所列出的的变量和推理过程是最重要的组成部分, 但要完全证明一个区块还需要更多的内容. 例如, 随机性和有效余额 (effective balance) 不是可以通过简单的计算直接产生的.
随机性是指在每个区块中, 将签名 (randao_reveal) 与随机源 (randao_mix) 混合, 以确定之后的区块中的随机数.
验证者的有效余额需要不断更新, 余额不足的验证器将被视为无效.
由于以太坊现有的 PoS 共识的复杂性, 我们提供了这个总结上述逻辑的图表. 两列各代表了两个相邻区块的数据.
其中, 左边第一个区块是一个检查点. 该图包括从检查点块到其下一个块的状态转换的部分必要算法. 每个箭头都对应于至少一个对 zkPoS Attestation 的约束.
在这个图中, 为了方便理解, 我们省略了有效余额和表示索引是否有效的 Boolean 数组.
请注意:
在以太坊 PoS 协议中, 使用了基于 BLS12–381 椭圆曲线的 BLS 签名, 而不是基于 secp256k1 椭圆曲线的 ECDSA ( 用于用户交易签名 ).
以下是选择基于 BLS12–381 的 BLS 的一些理由:
1. 为什么是 BLS? BLS 具有 Pairing 的特殊属性.
2. 为什么要 Pairing? Pairing 允许签名被聚合.
3. 为什么要聚合? 尽管与 ECDSA 相比, 配对操作让 BLS 签名的验证变得更加资源密集和昂贵, 但其好处是:
4. 为什么用 BLS12–381? BLS12–381 是一个配对友好的椭圆曲线, 具有 128 位安全性.
为了验证 BLS 签名, 我们需要三个输入:
在我们前面讨论轻客户端的部分中, 我们知道我们最常见的场景是移动端、浏览器和链上. 在这些场景中, 进行验证计算, 包括聚合公钥和验证 BLS 签名 ( 带 Pairing 检查的椭圆曲线加法 ) 是昂贵的. 幸运的是, 验证 ZKP, 或者具体来说, 验证 zkPoS Attestation 是很便宜的.
使用 BLS12–381 曲线验证 BLS 签名是 zkPoS Attestation 的关键组件之一.
如此昂贵的验证所需的计算能力可以外包给 zkPoS Attestation prover. 一旦生成证明, 就不需要其他计算. 然后, 客户端只需要验证 ZKP. 就这么简单.
一个有趣的事实是 “BLS 签名” 中的 BLS 是 Boneh、Lynn 和 Shacham, 而 “BLS12–381” 的 BLS 是 Barreto、Lynn 和 Scott.
BLS12–381 中的 12 是曲线的嵌入度.
BLS12–381 中的 381 是表示曲线上坐标所需的位数.
BLS12–381 的曲线实际上是两条曲线: G1 和 G2. 除了深入研究这些曲线的数学部分, 一些 BLS 签名工程上的设计是:
两条曲线之间的椭圆曲线配对称为双线性映射. 本质上就是是我们映射 G1 X G2 → Gt. 你可以在 Vitalik 的帖子中了解更多信息.
以更简单的话来说, Pairing 是一种验证 BLS 签名所涉及到的特殊乘法. Pairing 是 zkPoS Attestation 的 BLS 签名的验证部分所必备的.
有许多关于 BLS12–381 Pairing 的开源实现. 它们可以作为 BLS 签名验证的重要组成部分.
另外, 还有一些用 ZK 语言实现的:
回顾一下, 我们需要用 ZK 语言来实现 Pairing, 因为我们将用我们的 zkPoS Attestation 来证明 PoS. BLS 签名验证是 zkPoS 证明的重要组成部分, 而 BLS12–381 的 Pairing 是 BLS 签名验证的基础.
如果你读了我们的关于 zkWASM 的上一篇文章, 你可能会想, 为什么我们不直接使用现有的实现? 下面是我们的思考过程:
circom-pairing 为 circom 中的 BLS12–381 曲线提供了一个很好的 Pairing PoC 实现. 在 Succinct Labs 的 Proof of Consensus trustless bridge 中, 它被用于 BLS 签名验证.
而我们不使用 circom-pairing 的原因是:
更简单地说, 如果我们必须使用 circom-pairing 进行 BLS 签名验证, 对我们来说, 一些缺点主要是:
具体区别如下:
我们最终的技术栈是, zkWASM 用于定制逻辑 (zkGraph), Halo2 Pairing 作为 Foreign 电路 (BLS 与 BLS12–381). 它同时满足了通用性 ( 对于用户定义的 zkGraph) 和性能 ( 对于整个 zk 系统 ).
我们很高兴我们有了自己的 Halo2 Pairing 库的实现 ( 可能是目前市面上第一个开源实现 ). Halo2 Pairing 将为 zkPoS Attestation 提供基础. 它是完全开源的, 你可以在这里看源码与提 PR. 下面是一些更详细的技术细节和 benchmark.
zkPoS 的另一个关键点是递归证明.
递归证明本质上是证明的证明 ( 证明 B 时验证证明 A). 我们的 Halo2 Pairing 也可能会在其中发挥作用, 因为 BLS12–381 是 “零知识证明曲线”.
一般来说,递归证明的主要优势如下:
当处理区块链共识时, 对递归证明的需求会变大.
I. PoW 和 PoS 的递归证明
对于一个 PoW 共识的网络: 从最高的区块开始, 我们将递归地检查它之前的哈希值、nonce 和难度, 直到到达我们定义的起始区块. 我们将在下一节中用公式演示该算法.
对于像以太坊这样具有 PoS 共识的网络: 情况会更复杂. 我们需要根据前一个区块的验证者集合和投票来检查每个区块的共识, 直到追溯到一个没有争议的历史区块 ( 如以太坊 PoS 信标链的创世区块 ).
II. PoW 递归证明的效果
下图展示了共识的递归证明在将更多信息压缩到单一证明中的效果, 以 PoW 为例.
III. 使用 / 不使用递归证明
如果没有递归证明, 我们最终会输出 O( 区块高度 ) 大小的证明来进行验证, 即每个块证明的公共输入和每个块的证明.
有了递归证明, 除了初始和最终状态的公共输入, 我们将有一个 O(1) 针对任何数量的块的证明, 即第一个和最后一个公共输入, 连同递归证明 pkr. 一个自然的问题是, 所有的中间公共输入都去哪儿了? 答案是, 它们已经成为 ZK argument 的 existential quantifiers, 因此被消除了. 简单来说, 更多的知识被递归证明压缩到了证明中.
IV. 递归证明对 Hyper Oracle 的效果
需要记住, 我们面对的是有更多计算和内存限制的 “轻客户端” ( 浏览器 ), 即使每个证明可以在恒定的时间内 ( 比如 1 或 2 秒 ) 验证. 如果区块和证明的数量加起来, 验证时间将非常长.
在 Hyper Oracle 的 zkAutomation 中, 可能有跨多块进行自动化操作的情况, 比如在套利策略或自动风险管理等场景下. 那么为了实现这样的应用, PoS 共识的递归证明是必须的.
为了便于表述和理解, 本节已被简化, 并不代表确切实现.
理论上, 对于两个连续区块的递归证明, PoW (PoS 的情况太复杂, 不能浓缩到一个共识 ) 的递归证明如下:
在将中间的公共变量 ( 即 h_1, pk_2, 和 preHash_2) 改为 Witness 后, 两个证明可以合并为一个证明, 如下图所示:
我们可以观察到, 公共输入只有 h_2、pk_1 和 preHash_1. 当有两个以上的区块时, 例如 n 个区块, 我们可以应用同样的技巧进行 n-1 次递归, 为 n 个区块最终生成一个证明, 同时只保留第一个 pk_1 和 preHash_1 的公共输入, 以及最后的区块哈希 h_n.
类似于这个 PoW 例子的递归证明的算法将被应用, 用于保证 Hyper Oracle 的 zkPoS Attestation 对任意区块数证明的简洁和恒定大小. 请注意, 在当前阶段, zkGraph 的定制逻辑不包括在这个递归证明中.
我们即将发布的黄皮书将提供更多关于 Hyper Oracle zkPoS Attestation 的规格和实施细节.
总而言之, zkPoS 是基于我们以下独特的技术栈:
Hyper Oracle 非常期待利用 zkPoS 实现端到端的无信任索引和自动化 Meta App, 以及通过我们的 zkMiddleware 使下一代应用程序做到真正去中心化.
Hyper Oracle 正在开发以数学作为共识的 Web3 通用中间件协议。Hyper Oracle 将用零知识证明技术构建下一代的索引、和自动化协议,以解决区块链领域的安全、计算完整性和性能方面的挑战,从而帮助任何去中心化应用实现端到端的去中心化与安全性。
LinkTree: https://linktr.ee/hyperoracle
Website: https://www.hyperoracle.io/
Demo: http://demo.hyperoracle.io/
Twitter: https://twitter.com/hyperoracle
Discord: https://discord.gg/MgyYbW9dQj
Medium: https://hyperoracle.medium.com/
GitHub: https://github.com/hyperoracle
【免责声明】市场有风险,投资需谨慎。本文不构成投资建议,用户应考虑本文中的任何意见、观点或结论是否符合其特定状况。据此投资,责任自负。