探索UTxO模型的可扩展性选项


Exploring Scalability Options of the UTxO Model | Cardano Explorer (cexplorer.io)

UTxO 模型支持并行处理交易,这一功能对于实现高可扩展性和快速交易终结性至关重要。在本文中,我们将深入探讨各种改善网络共识的策略,这些策略可以提高网络吞吐量并加快交易终结性。在本文中,您将了解输入背书、分片以及如何防止双重支付攻击限制可扩展性。

UTxO 模型的基本特征
UTxO 是独立且不可变的对象。一旦 UTxO 作为交易的输出被创建,它就会保持不变,直到在新的交易中被使用。当它被使用时,它会被完全消耗,并创建一个新的 UTxO 作为新交易的输出。

该图说明了用户连续并行提交新交易的过程。每笔交易都唯一地指向 UTxO 集中的输入 UTxO,如指向红色 UTxO 的红色箭头所示。术语 STATE 1 表示在接受新块后在每个节点上出现的新全局状态。红色 UTxO 已从 UTxO 集中移除。UTxO 集已更新,添加了新形成的 UTxO,用指向绿色 UTxO 的绿色箭头表示。

UTxO 模型在交易验证期间管理全局状态方面至关重要。Cardano 中的全局状态由活跃的 UTxO 集合表示,也称为 UTxO 集。随着每个新块的添加,所有新创建的 UTxO 都纳入 UTxO 集。相反,交易消耗(花费)的 UTxO 将从 UTxO 集中移除。UTxO 可以被视为一次性实体。

网络中的每个节点都维护其各自的 UTxO 集。遵守共识的大多数节点都拥有相同的 UTxO 集(全局状态),因为它们保留了相同的区块链历史记录,包括最近附加的块。然而,由于网络数据传输延迟,全局状态不会同时在所有节点上发生瞬时变化,而是会略有延迟。可以假设,当区块生产者节点将新区块传播到网络中时,所有节点共享相同的全局状态(这意味着它们接收到最后一个区块并相应地更新全局状态)。

如何提高交易的最终性?
Cardano 采用类似于 Nakamoto 式共识的共识机制。这以区块的概率最终性为代表,因此交易也是如此。这意味着,如果交易包含在新区块(称为区块 1)中,则其确认计数为零。添加区块时,该区块可能不会在区块链中持续存在,因为它可能会被大约在同一时间创建的替代区块取代。随着区块 1 之外新区块的添加,区块在区块链中持续存在的保证不断升级。这通常被称为确认数量的增加。

在图片中,您可以看到在区块 0 之后,区块链出现了分叉。产生了两个备选的区块 1。在附加更多区块之后,上链占了上风。在上链中,有交易 TX 1。

Cardano 的交易最终性较低。Cardano 中的区块时间配置为 20 秒。这意味着如果您的交易需要 10 次确认,您将不得不等待大约 200 秒,即大约 3 分钟。

由于 UTxO 集合中的 UTxO 独立,交易的验证也是互斥的。每个节点都可以验证一个交易或一组交易。区块内交易的顺序无关紧要,因为它们不会相互影响。因此,节点不仅可以在收到交易后验证单个交易,还可以在将交易传播到网络之前以某种形式附加批准或投票。每个后续接收交易的节点也将观察先前接收交易的节点的批准。

在图片中,你可以看到 TX 1 交易如何逐渐收集到它所传播到的每个其他节点的批准。当节点 4 生成新块时,交易已经有 4 个批准。请注意,节点 4 是第一个修改其内存池的节点。节点 4 从交易 TX 1 中删除了旧的输入 UTxO(红色),并插入了新创建的 UTxO(绿色)。

在节点内存池中停留时间较长的交易通常会获得更多批准,并且可以在添加到块时获得更高的优先级。这已经是 Cardano 交易的一个特点,因为 Cardano 以先进先出的方式运作。至关重要的是,如果交易获得了网络中大多数节点的批准,即使区块链进行重组,它被丢弃的可能性也会降低。

达成共识的过程n 交易的纳入可以更快速地发生,并且独立于新区块的生成。

即使包含交易的区块只有几个确认(可能只有一个),网络节点之间也已经达成共识,认为交易应该是区块链的一部分。网络可以设计成最早获得大量批准的交易尽早纳入区块链。

然而,区块链的潜在重组对交易的最终性构成了挑战。尽管交易的批准数量很多,但理论上它可能会暂时从区块链中删除。如果链的一部分(区块链的最新区块)被替代版本替换,就会发生这种情况。这个新子链版本中的区块可能包含一组不同的交易。因此,增强交易的最终性涉及改变共识以防止区块链重组,或修改规则以反映交易批准的数​​量。

在下图中,您可以看到区块链的不必要的重组。上链中的 TX1 有 4 个批准和 1 个确认(BLOCK 2)。然而,最终,没有 TX 1 交易的下链占了上风。

通过在网络传播期间节点同意将其集成到区块链中,可以增强交易的最终性。这在 UTxO 模型中是可行的,因为交易的验证仅需要验证输入 UTxO 的存在(它们在 UTxO 集中的存在),表示它们是可以使用的。

在本文的下面,我们将展示如何在网络生成下一个块之前从理论上实现交易的更快最终性。

此外,可以通过加快网络内新附加块的共识来增强最终性。这可以通过节点在将块添加到区块链之前或之后不久对其进行投票来实现。

输入背书者
输入背书者是一项提高 Cardano 可扩展性的计划。这种改进可以看作是在将区块(共识区块)添加到区块链之前的一种投票形式。
a97a5ba20c796f134a4b752a1671fb5e

输入背书者使用 3 种类型的区块:输入区块 (IB)、背书区块 (EB) 和排名区块 (RB)。每种类型的区块将以不同的频率铸造。一些区块可能在同一时段铸造。输入区块将以最快的频率铸造。

输入背书者跟踪所有已提交的交易,并将这些交易捆绑到预先构建的区块中。输入背书者功能的主要目的是将交易选择与区块生产分开。

在此模型中,交易可以在进入内存池的过程中收集同意。这是因为输入背书者将并行性和并发性元素融入到共识中,同时保持区块链的线性。

输入背书者算法将促进在交易选择阶段准备大量交易,因为它允许网络中更多节点同时参与。背书节点验证并预先批准交易,这有助于减少排名区块生产者的计算负担和带宽需求,同时还增强了交易池的多样性和可用性。此外,它们通过提供可验证的背书证明来加快尚未纳入链的交易的确认。

输入背书节点的部署完全归功于 UTxO 模型,因为它允许节点独立验证交易。鉴于区块链是区块的线性序列,系统中需要保留的唯一线性是在排名区块的级别。区块内的交易序列(包括排名区块)无关紧要。有趣的是,排名区块不包含交易,而只是通过背书区块包含对它们的引用。

该图描绘了用户提交引用来自活动 UTxO 集(全局状态)的输入 UTxO(图示为红色 UTxO)的交易。这些交易经过并行验证,随后被纳入输入区块。节点可以同时背书这些输入区块。系统在将排名区块附加到区块链的共识最高层保持线性和最高级别的验证,从而防止双重支付攻击等。

随着每个新区块附加到区块链,全局状态也会发生变化。如上所述,已消耗的 UTxO 将从 UTxO 集中移除,同时将新的 UTxO(来自交易的绿色 UTxO)插入其中。

注意:上图仅显示 UTxO 的消耗,而不是将新的 UTxO 插入 UTxO 集。

再次保护双重支付攻击

防止双重支付攻击是限制交易可扩展性和并行处理的因素之一。验证交易的输入是全局状态。节点在其维护的当前全局状态的上下文中验证交易。

会计模型从根本上影响节点如何处理全局状态,以及它们在交易验证和可扩展性的并行化方面有哪些选择。

在 UTxO 模型的上下文中,当用户提交引用相同输入 UTxO 的两笔交易时,可能会发生双重支付攻击。这类似于试图花两次相同的钱。老练的攻击者可以通过不同的节点(即网络的不同位置)向网络提交交易。这意味着,两笔交易都将由某一组节点视为有效,直到另一笔花费相同输入 UTxO 的交易到达。这时就会发生冲突。

在理想情况下,尽早识别双重支付攻击。一笔交易将被纳入新区块,而另一笔交易将被驳回。包含的交易将影响全局状态。已消耗的 UTxO 将变得不可使用,从而使第二笔交易永久无效,因为它引用了已使用的 UTxO。

通过实施输入背书器,可以在输入块或背书块阶段检测到双重支付攻击。即使没有发生这种检测,节点在构建排名块期间也肯定会识别出攻击。

该图显示了一次尝试性的双重支付攻击。与交易 TX 2 相比,交易 TX 1 被放入不同的输入块中。随后,两笔交易都包含在单独的背书块中。在此阶段,网络可以识别冲突的交易并丢弃其中之一。但是,如果没有发生这种情况,冲突将在构建排名块期间得到解决。负责构建排名块的节点拥有检测冲突交易和解决问题的所有必要信息。

观察发现,该系统促进了交易的并行处理,同时保持了确定性解决冲突和阻止双重支付攻击的能力。大多数交易都纳入排名区块,但有冲突的交易没有机会通过验证。

设想一种改进,交易的最终性不取决于区块排名级别的确认数量,而是取决于背书的数量。这意味着最终性大致与网络内交易传播的速度成正比。用户用于将交易提交给网络的节点必须知道背书的数量。这需要一种传播背书区块的机制。发起交易的节点将收到背书区块,并将观察其中对用户交易的批准数量。此信息可以通过钱包或区块链浏览器显示给用户。如果交易获得了假设的 51% 的股权批准,并且几乎可以肯定没有冲突交易,那么理论上可以认为交易是最终的。但是,交易只有在成为排名区块的一部分后才能实现最终确定性。

UTxO 模型和分片
分片是增强区块链可扩展性的关键技术。区块链网络被划分为较小的部分或子网络,称为“分片”。总计算和存储工作量被划分为分片。

分片是系统中并行的一种形式。每个分片独立运行,可以处理自己的一组交易。这种并行执行交易的方式提高了整个系统的效率和吞吐量。

每个分片都维护其全局状态的一部分。这称为本地状态。整个区块链的全局状态是所有这些本地状态的总和。

跨分片通信是分片的一个重要方面。它指的是不同分片之间交换交易或信息的过程。这一点至关重要,因为分片区块链网络的吞吐量受到跨分片通信的显著影响。

UTxO 模型比基于账户的模型更有利于分片。
ad2199b6c7a54d113db102ffedfb35fe

在 UTxO 模型中,交易是验证的基本单位。交易是一个可以同时由多方独立验证的实体。这些验证的结果总是相同的。Cardano 确定性地执行交易验证。多方可以并行验证交易l 和任何顺序,与区块无关,这意味着无论交易何时被纳入区块,也无论区块内交易的顺序如何。

相比之下,在以太坊的基于账户的模型中,区块是验证的主要单位。交易是相互依赖的。以太坊交易不能单独验证,而只能针对当前的全局状态进行验证。以太坊中的全局状态可以概念化为交易序列。交易验证的结果取决于其在此序列中的位置。

会计模型的差异显著影响了分片的实施。

简单地说,将 Cardano 网络视为一个分片。如果我们有 10 个分片,就相当于有 10 个 Cardano 网络并排运行。从理论上讲,这可以使网络吞吐量增加十倍。然而,在实践中,由于跨分片通信、确保数据一致性和安全性的需求、网络延迟和管理开销(如平衡分片之间的负载、管理节点加入和离开以及路由交易)等因素,情况可能并非如此。

对于使用 UTxO 模型的区块链,实现分片相对简单,因为全局状态自然允许并行性,并且可以在每个分片内独立验证交易。

UTxO 模型在跨分片通信方面有其优势,因为创建需要从两个分片验证的交易相对容易。

想象一个交易,它具有来自 SHARD 1 的全局状态的输入 UTxO,并在 SHARD 2 的全局状态中创建输出 UTxO。此交易将成为两个分片中区块链的一部分。这里的优点是验证可以与区块无关,即与交易在区块中的顺序无关。

在每个具有输入背书者的分片中,跨分片交易在提交后不久即可获得背书(批准)。交易将在分片 1 中提交,分片 1 将立即将其转发到分片 2。在两个分片中,交易将同时获得背书。在两个分片中,交易可能在很短的时间内获得 51% 的权益支持。需要有一种机制来在分片之间共享背书区块(与跨链交易相关的数据子集就足够了)。当每个分片将交易插入排名区块时,由于背书数量众多,给定分片可以高度确定地预期交易将被插入另一个分片的排名区块中。

理论上,分片 1 不必等待交易插入排名区块。当然,前提是存在一种机制(和激励措施),确保获得大多数权益的大量背书的交易始终进入下一个区块之一。

在图中,您可以看到交易 TX 1,它具有来自 SHARD 1 的输入 UTxO。交易的结果是 SHARD 2 中创建的输出 UTxO。可以说价值在分片之间转移。交易到达 SHARD 1 中的输入块。SHARD 1 将交易转发到 SHARD 2。TX 1 到达 SHARD 2 中的输入块。交易 TX 1 逐渐到达两个分片中的背书块,最后到达排名块。一旦交易插入排名块,给定分片中的本地状态就会发生变化。输入 UTxO 从 SHARD 1 的本地状态中移除。新的 UTxO 将在 SHARD 2 的本地状态中创建。

UTxO 模型提供了多种好处,包括它适用于输入背书者和分片。上述示例说明了这两种技术的集成。一旦输入背书到位,分片就有可能增强 Cardano 的可扩展性。但是,输入背书必须加快交易的最终性,以防止跨分片通信缓慢并确保全局状态的完整性。

为什么在以太坊中实现分片很困难?
以太坊采用基于账户的模型,其中每个账户都有一个关联状态。以太坊的全局状态本质上是所有账户及其当前资产余额的数据库。随着每个新区块的出现,系统的状态会根据该区块内的交易进行更新。

通过检查发送方的余额是否有足够的资金来处理交易。如果成功,发送方的余额会减少,而接收方的余额会增加。然后,以太坊虚拟机 (EVM) 根据当前状态和交易计算出新状态,这将成为下一笔交易的基础。区块链状态的不断演变意味着交易顺序对于验证至关重要。

每笔交易都可能改变任何账户的状态,其结果可能取决于其处理顺序。为了保持一致性并防止双重支付,全局状态在每次验证期间都会“锁定”,一次只允许处理一笔交易。这种锁定机制对于系统完整性至关重要,可防止同时进行的交易导致不一致或双重支付。

交易输入是账户余额,这是一种共享资源。这意味着交易提交时的余额可能与验证时的余额不同,这使得交易输入具有不确定性,这与 UTxO 模型不同。

在以太坊中,余额是持久实体,可以随时通过交易进行修改,但两笔交易不能同时修改同一余额。

在图片中,您可以看到用户如何提交 5 笔交易。交易可以并行提交。请注意,多笔交易会调整同一余额。例如,TX 1 和 TX 2 从同一余额中减去一个值。交易 TX 3 和 TX 4 为同一余额增加了价值。 STATE 1 到 STATE 4 表示交易的顺序处理,因此全局状态的逐步更新。全局状态由相同的余额组成,即永久对象,其状态可以通过交易连续多次更改。
d48c4eed33aca6394ea57f053205d27d

想象一下,如果一笔交易必须同时更改 SHARD 1 中的一个余额和 SHARD 2 中的另一个余额,跨分片通信会变得多么复杂。以太坊区块中的交易顺序在验证结果中起着重要作用。在 EVM 的当前实现中,两个分片都需要将交易包含在区块中,并将有关验证结果的信息传递给对方。在 SHARD 1 中,交易验证成功,金额从余额中扣除,而在 SHARD 2 中,交易验证失败,即金额不会记入余额,这是没有意义的。跨分片通信严重限制了在每个分片中构建区块的能力。

在图片中,您可以看到交易 TX 1,它在提交后插入到内存池中。然后将其从内存池插入到块 1 中。交易 TX 1 的验证会更改分片 1 中的当前本地状态。但是,分片 1 需要知道分片 2 中的验证结果。因此,分片 1 与分片 2 通信有关块 2(分片 2)中交易验证的结果。因此,分片 2 必须将交易 TX 1 插入到块 2 中并执行验证。然后它可以将验证结果传达给分片 1。请注意,分片 1 必须知道分片 2 中的验证结果,然后才能将另一笔交易添加到其块 1。

实际上,提供的示例是分片的简化(天真)实现。它突出了以太坊团队在使用当前共识机制实现分片时面临的重大挑战。

在基于账户的区块链中,在跨分片通信期间保持交易原子性是一项复杂的任务。确保交易完全执行或根本不执行对于维护系统的完整性至关重要。

已经提出了各种策略和协议来解决此问题,包括两阶段提交协议。然而,这些解决方案也存在权衡和复杂性。值得注意的是,几个项目已经使用基于帐户的模型在区块链中成功实现了分片。

结论
改变共识机制只是增强网络可扩展性的一种方法。可扩展性也可以通过第二层解决方案、分层架构或提高效率来提高。例如,Plutus V2 比其前身 Plutus V1 更高效,从而节省了区块空间。这种效率允许每个区块进行更多交易,从而增加网络吞吐量。然而,输入背书者可以提供比单独提高效率更显著的可扩展性改进。

Cardano 社区的一些成员认为,重点应该更多地放在通过 ZK 加密而不是输入背书者来增强可扩展性上。Cardano 将通过 Chang 硬分叉整合 ZK 加密。由于 Cardano 的确定性,构建不需要序列器的 ZK 汇总将是可行的。

UTxO 模型非常适合输入背书者或分片,因为由一次性对象组成的全局状态具有很好的可并行性。即使在分片的情况下,网络中的多个节点也可以并行独立地验证交易。