摘要

我们提出了一种新的 Layer-2 可扩展技术 “zkPorter”,可以将 zkRollup 和分片结合在一个高度可扩展且原子化可组合(atomically composable)的区块链网络中。

问题 #1:交易吞吐量 ≠ 可扩展性 ⚖️

交易吞吐量是用全网处理的总交易数量来度量的;而可扩展性是单个节点处理的交易数量。zkRollup 可以被认为是满足了安全性和有用性的 终极 Layer-2 扩展方案 。(编者注:见文末超链接《各以太坊 Layer 2 扩容方案的评估对比》)但是 zkRollup 相对于主网仅仅提供了约 100 倍的可扩展性提升,因为交易数据还是需要广播到所有全节点。有人可能会说,zkRollup 只是 线性提升了吞吐量,但并没有提供指数级的可扩展性

zkRollup 在 Eth1 上的处理速度可达 3000 TPS,但保守估计 —— 取决于 Eth2 实现的细节 —— 在分片化的 Eth2 上的处理速度至少是 20000 TPS。相比于 Visa 最高可达 24k TPS 的吞吐量 ,这已经是个巨大的成就了,但因为我们想要帮助今天还不能享受到银行服务的数十亿人,我们还要争取更多。

问题 #2:孤立的可扩展性是死胡同

DeFi 的崛起意味着可组合性(composability)是成功的关键。作为可以自由组合的 “ 货币积木 ”,DeFi 应用证明了把免信任的协议层层叠加可以解锁的潜在价值。如果一个项目只盯着自己的扩展方案,最终他们会发现自己孤立于由社区共享的、可组合的扩展机制所创造的安全性和网络效应之外。

介绍 zkPorter :tada:

在本文中,我们要演示一种新的、基于零知识证明的扩展方案,它有望能解决上述所有问题:zkPorter。

解释 zkPorter

zkPorter 是一个账户模式的、基于简洁的零知识证明来保障安全性的免信任型扩展协议。类似于 zk 家族的其它扩展方案(例如 zkRollup 和 Validum),zkPorter 中的计算可以指数级扩展: 任意多的交易 都可以用几乎 恒定的开销 来验证。每一笔交易都会由 Layer-1 上的智能合约来验证,所以 zkPorter 中的账户状态的正确性与 Layer-1 上的状态有同样的安全性保证。

另一方面,基于零知识证明的扩展方案仍不能直接解决数据可用性问题:如果状态数据变得不可用,资金就会被冻结。zkRollup 和 Validium 是用 不同的方法 来处理数据可用性问题的(编者注:见文末超链接《ZK rollup 与 Validium 对比》)。

zkPorter 使用了一个结合 zkRollup 理念和分片理念的混合方法来解决数据可用性问题。它可以支持 任意多数量的分片 ,每一个分片都有自己的数据可用性方案(由该分片的智能合约来定义)。同时,对分片的选择是在个体账户层面上控制的(The choice of the shard is controlled at individual account level)。

zkPorter 将对状态有效性和数据可用性的顾虑分离开来。状态有效性 —— 有效的状态转换才能发生 —— 由零知识证明工具来统一实现,这就能提供指数级的可扩展性,同时继承 Layer-1 的安全性保证。另一方面,数据可用性则委托给各分片自己解决,可以自由实验不同的解决方案。必要之处求联合,未决之事任自由(In necessariis unitas, in dubiis libertas)!

zkPorter 中的可组合性:打了激素的区块链互联网:pill:

同步的跨分片(或者说跨区块链)互操作性 公认是非常难的 (编者注:中译本见文末《区块链分片的理念与挑战,Part-1》)。这就是为什么现有的分配解决方案(Cosmos、Polkadot、Eth2)都选择了更简单的异步互操作性,用 交易收据 方法来实现。但是从同步模式转变成异步互操作性,会在协议交互和用户体验上产生许多令人头疼的麻烦,尤其是对那些对时间敏感的应用(即,Aave 的 15 秒闪电贷)。

那就让 zkPorter 来试试!zkPorter 里面的所有账户都共享同一个地址空间,而且可以通过运行在 zkPorter 中的基础分片 shard 0 上的 zkRollup 与其它账户互操作。一个对流量有很高要求 以及/或者 特定数据可用性需求的协议可以将自己的协议接口放在自己(在 zkPorter 中)的分片里面。其中的安全性、成本和吞吐量权衡,我们下文再说。

zkPorter 让任意数量的协议都可以平滑地互操作。单笔原子交易可以在不同的 zkPorter 分片上调用任意数量的智能合约。不仅如此,分片内的交易将可以 访问整个 zkPorter 的状态 —— 包括其它分片上的数据。这一特性可被用于(例如)读取来自某个信息输入机制的信息。

你可以把 zkPorter 模式想象成打了 zk 激素的区块链互联网。

zkPorter 分片:安全性与开销 :money_with_wings:

zkPorter 的 Shard 0 就是一个 zkRollup,有完整的数据可用性和以太坊的安全性保证。Shard 0 会成 zkPorter 内部运行的分片中最贵的一个,交易成本大约是主网交易的 1/100。

Shard 0 以外的分片会在自己的智能合约中定义自己的数据可用性方案。这些其它分片,牺牲了链上数据可用性,换来了进一步的 10~100 倍的交易成本节约和吞吐量提升。zkPorter 会引入一个可选的验证者机制,我们称之为 “zkPorter 卫士”,它让协议可以邀请协议的利益相关者作为协议分片的数据可用性保证人而参与进来。使用卫士机制的分片会运行一种权益证明共识机制,因此,只要 1/3 的参与验证者保持诚实,该分片的用户就能随时带着自己的数据退出。

各协议可以自由选择自己的数据可用性方案,可以包括 zkPorter 卫士,也可以不使用这种机制。协议所选数据可用性方案的效率就会影响到所在分片的吞吐量和交易成本。

分片 吞吐量 安全性 交易成本
zkRollup 分片 3k TPS 通过 zkRollup 实现与 Layer-1 等同的安全性 约为 0.01 美元(当 Gas Price 为 100 Gwei 时)
卫士分片 10k~20k TPS 上限为 2/3 的zkSync 卫士押金 约为 0.01 美元
X 协议分片 基于协议的复杂性 由 X 协议的验证者保证安全性

灵活的数据可用性就是 zk Porter 的核心设计目标。允许了各协议自行设计方案,zkPorter 就能支持非常多不同的方案,可以适应每个人的需要。安全假设以受信任的中心化参与者作为保证人的应用可以实现权威证明共识机制。而带有治理代币的应用可以实现自己的权益证明共识机制来保护自己的分片 —— 只不过要避免让分片内的资金体量超过已锁定的验证者押金体量。 纠删码 (erasure coding)机制可以用于证明验证者没有删除数据。比如,考虑到比特币网络相对比较简单、交易数量也低,一个 zkPorter 分片的验证者完全可以在他们的分片内创造一个比特币实现,运行基于工作量证明的中本聪共识。所有这些都可以与 zkPorter 的卫士验证者设置相结合,也都可以与之独立运行。

zkPorter 在一开始设计时就把扩展当成目标。zkPorter 协议将每一个分片的数据可用性和有效性开销降低到了一个很低的水平。增加新分片的边际成本比起在基础的 zkRollup 上包含嵌套数据所引起的成本是对数级别的。这就让 zkPorter 可以高效地扩展到支持数亿个账户。

最后,用户的隐私可以得到零知识证明技术的保护。使用一个 zkRollup 作为 zkPorter 的基本元素有一个内在的优势,就是状态转换的有效性是可以被证明的,而且可以不用公开这些交易的内容。

架构

究其实,zkPorter 很像 zkRollup 和 Validium。一个放在 Layer-1 上的智能合约托管着资金、保存着一份对账户状态默克尔根的记录。实际状态数据由 zkPorter 验证者和各分片的数据保证人保存在链下:我们也管它叫 “状态树”。

一个分片的智能合约定义了自己的状态转换规则。当一个 zkPorter 区块被接受的时候,该块会引起一次状态转换:一笔在 Layer-1 上的交易会把默克尔根替换成新值。这笔交易必须验证用于证明新值有效的零知识证明:即,要验证该区块中的每一笔交易都是有效的。

在 zkPorter 中,每个分片的账户都必须存储状态树的一棵独立的子树中。此外,每一个分片子树都必须包含关于自身分片类型的信息,并引用定义其状态可用性策略的智能合约账户。

假设一个分片的类型是 zkRollup,那么该分片中每一笔改变账户状态的交易都必须把对状态的更改作为 Layer-1 的 calldata 发布出来(就跟一个 zkRollup 一样)。

所有会同时修改两个及以上分片状态的交易都必须用 zkRollup 模式来执行。

而所有其它仅会影响特定一个分片内账户的交易都可以用正常的分片模式来执行(我们称之为“分片交易”)。如果一个区块包含了分片 S 内的一些分片交易,那必须遵循下述规则:

  1. 分片 S 子树的根哈希必须公开一次,作为 calldata 放到 Layer-1 上。这是为了让所有其它分片的用户能够重构自己的状态
  2. 该分片配套的智能合约必须被调用来执行额外的要求(例如:验证分片共识参与者的签名)

案例分析 :briefcase:

我准备用 4 个案例来展示 zkPorter 的潜能,演示它是如何无缝组合不同的应用、同时扩展交易量来满足每个应用的需要的。

案例 1:Reddit 社区积分

2020 年 6 月,Reddit 启动了 The Great Reddit Scaling Bake-Off 计划,让各个社区有机会通过一个社区积分系统来主持自己的子论坛(subreddit),也让各 Layer-2 方案能一展身手。显然,社区积分系统的解决方案必须是安全的、去中心化的和易用的,同时还能保持与其它第三方应用(钱包、合约)的互操作性,还有,能处理数以十万计的交易。社区积分可以用 zkPorter 来实现,有三种不同的方式。

选项 1:运行在 zkSync 上(zkPorter shard 0)

为让 社区积分 连接到以太坊主网,Reddit 可以直接在 zkSync 上使用现有的 zkRollup 功能。zkSync 在 Eth1 上可达到 3000 TPS。假设所有 5 亿 Reddit 月活用户都踊跃参与。再假设平均每个用户在每个月里要发送一笔铸币交易、一笔销毁交易(支付订阅费用)和两笔转账,则社区积分系统要求的平均负载是:

5 亿 × 4 /(30×24×60×60) 约等于 700 TPS

这只占 zkRollup 当前吞吐量的 1/4。

选项 2:放到一个 Reddit 专属的分片上,由 zkPorter 卫士来验证

若有意提高交易吞吐量的弹性并降低用户的使用成本,Reddit 可以将 Reddit 交易从基础分片下放到一个 Reddit 专属的分片上。Reddit 可以自己选择向用户提供数据可用性保证的方案。最简单的办法就是现有的 zkSync 卫士实现,向用户提供由权益证明实现的数据可用性保证。我们会建议 Reddit 除了使用卫士模板,还要把数据存储在 Reddit 的服务器里。在这种模式下,即使卫士遭受 2/3 多数攻击, Reddit 也能应付下来,这样用户就高枕无忧了。相应地,用户的数据也不会因 Reddit 服务器出错、被攻击而倾覆。

选项 3:放到一个 Reddit 专属分片上,使用专属的数据可用性策略

第三种方法是, Reddit 可以选择最大化交易吞吐量、最小化用户成本,就是将 Reddit 社区放到一个专属分片上,同时使用一个定制化的数据可用性方案,而不用卫士机制。一种基于权益证明共识的可行方案是,基于社区驱动的数据可用性,再加上 2/3 的多签名机制(two-third multisignature)。

设想一种可能的方案实现:Reddit 和 Reddit 的用户会发送签名来见证每一个状态转换的有效性。 Reddit 可以,比如说,占据 1/3 的总签名权重,把 2/3 分发给用户。再加上一个签名权重的 2/3 多数机制(A combined two thirds in signature weight),足以保证 Reddit 分片上的状态转换是有效的。可以激励用户发布关于自己所见无效转换的证明,比如扣减该无效状态转换的发布者的押金。

交易成本在这种方案中会变成仅覆盖零知识证明的生成所需的成本(在当前是每笔交易千分之一美元,在将来还将指数级下降)

互操作性

在所有这些场景中,Reddit 社区积分的持有者都能够:

  1. 容易地与其它分片上的智能合约互动,比如使用部署在 zkSync 上的 DeFi 协议(Curve on zkSync、Compound on zkSync,等等)来 交易/出借/贷款
  2. 把他们的社区积分转移给一个 zkRollup 分片上的用户(以获得最大的安全性)
  3. 快速取出他们的代币到以太坊主网上,与 zkSync 以外的智能合约互动

案例 2:智能钱包/密码学货币银行(Argent、Dharma、MyKey,等等)

智能钱包就是用智能合约来实现的钱包,可以帮助用户获得隐私功能和互操作功能(举个例子,可以无缝对接 Layer-2 扩展方案)。一些智能钱包比如 Argent ,甚至在引导新用户的过程中会选择性地为用户补贴一定比例的交易手续费。以当前的 Gas Price (75 Gwei)和 以太坊价格 (320 美元)来算,一笔交易就是 0.5 美元。智能钱包可以使用智能合约调用 zkRollup 函数来降低整体的 Gas 开销。

这里提供一种可能的实现方案,分 3 个简单的步骤。

步骤 1:zkRollup 分片

智能钱包的账户可以迁移到一个 zkRollup 解决方案(比如 zkSync )上。zkSync 内部的钱包之间的转账是很便宜的,虽然从 zkSync 发送到主网的交易会稍微贵一点,而且耗时也更久(约 5~10 分钟才能确定)。

步骤 2:zkSync 卫士 + 钱包运营者分片

在引入足够多的新用户之后,在 zkRollup 上运营的成本可能会让钱包运营者考虑开启一个专属分片。在上文的 Reddit 部分中,我们就详细讲解过这种方案:把用户基础迁移到一个独立的、由 zkSync 卫士(在 Reddit 的案例中是社区成员,在这里可以是 协议的参与者 )和钱包运营者来保证其数据可用性。只要钱包运营者或者 zkSync 卫士中的大部分没有被攻破,分片就是安全的。这一选项也为钱包运营者的灵活手续费分享方案打开了可能性。

步骤 3:钱包 DAO 分片

到了某一刻,钱包的用户基础可能会变得非常大,达到钱包需要迁移到一个由治理代币来治理的分片上。这个分片仍会是 zkSync 网络的一部分,而且可以用 zkRollup 模式访问所有其它分片上的服务。

隐私考虑

还需进一步说明的是:隐私功能在上述任一步中都很容易实现。没有零知识证明,就很难实现隐私性。但 zkRollup 的好处就在于,账户可以即时获得隐私性、大幅降低参与网络的费用,而且无需牺牲安全性和去中心化。

案例 3:DeFi 协议和 DEX(Loopring、IDEX、Curve、Coumpound,等等)

预见到了未来会出现的吞吐量瓶颈,多个主流的 DeFi 应用(例如 IDEX 和 Loopring)都投资于部署自己的可扩展性解决方案。这是很聪明的一步,因为这一方面给了他们在 Gas Price 高企时候的竞争优势,另一方面也给了他们对可扩展性技术/牺牲的更深刻理解。

不仅如此,对于渴望支持高频交易的去中心化交易所来说,单笔交易的费用必须尽可能小,因为吃下一个单需要非常高的交易数量。

不过,这一方法面前横亘着两大问题:

  1. 孤立的可扩展性缺乏 可组合性 ,或者说 网络效应
  2. 随着零知识证明技术的潜力完全展现,越来越多人意识到,零知识证明是大规模普及的关键。与此同时,ZKP 领域的创新速度很快,以至于要跟上节奏必须有自己专门的研究开发团队。但是,如果不能很好地审计和实现复杂的密码学算法,等待他们的可能是严重的安全漏洞。密码学领域的黄金法则还是对的: 不要闭门造车搞一套只有你自己知道的密码学

zkPorter 就解决了这个问题。DeFi 协议可以建立在先进的可扩展性技术和强大的网络效应上,同时控制交易成本。要拥有这些,一个协议可以在 zkPorter 内创建一个自己的分片,用协议代币持有者的共识来保护它。这也为灵活的手续费共享(或者说手续费补贴)提供了机会。

案例 4:微交易(Brave、Livepeer、Storj,等等)

需要处理大量低价值转账(微交易)的协议可以实现一个类似于 Validum 的分片(就是一个让多个参与者的简单多签名来保证数据可用性的分片),让交易手续费低到弥补零知识证明的生成成本即可(当前是每笔交易 0.001 美元左右,预计在未来还将大幅降低)。

如此整合微交易平台,则用户还可以在余额超过一定额度之后自动将余额转移到一个 zkRollup 分片中。

前进的道路

zkPorter 将作为 zkSync 路线图的一部分而初步实现。

对于这一愿景,接下来我们要做的有:

  • 为 zkSync 提供对 通用的智能合约 的支持
  • 实现一种多验证者的共识机制
  • 分发 zkSync 代币来启动卫士保护型分片

zkSync 已经上线以太坊主网,现在就可以使用免准入的 zkRollup 模式了。我们相信它的吞吐量对于满足以太坊社区接下来两年内(也就是迁移到以太坊 2.0 之前的这段时间)的需要是足够的了。不过,我们欢迎大家讨论和实现定制化的分配解决方案、缔结密切的合作伙伴关系。

请在这里联系我们

提醒

zkSync 现在还没有发行过代币,暂时也没有销售和分发计划。请警惕骗局。

(完)

原文链接: https://medium.com/matter-labs/zkporter-composable-scalability-in-l2-beyond-zkrollup-2a30c4d69a75

作者:Alex Gluchowski

翻译:阿剑

相关文章