了解Cardano的全球状态

Understanding Cardano’s Global State | Cardano Explorer (cexplorer.io)
区块链的历史可以看作是其全局状态。然而,为了验证新交易,节点只需要这段历史的一部分。随着每个区块的增加,区块链都会扩大,这使得在不断增长的环境中验证新交易变得效率低下。在本文中,我们将阐明如何从区块链的历史中形成用于验证新交易和构建新区块的全局状态。

区块链只是交易的历史
区块链可以看作是交易的历史。链中的每个区块都包含一个交易列表,随着每个新区块的增加,区块链的历史(以及全局状态)都会发生变化。

在下图中,您可以看到新添加到区块链的区块与全局状态变化之间的相关性。每个新添加的区块都代表一个状态转换。

网络共识是一种关键机制,可确保网络中的所有节点(诚实的大多数节点)都同意区块链的当前状态。共识允许网络安全地从一种状态转换到另一种状态。换句话说,在将新区块添加到区块链之前,所有节点必须同意其有效性。

为了使区块链正常运行,分布式网络的所有节点上的全局状态必须相同。这种一致性对于确保区块链的完整性和安全性以及促进进一步的状态变化是必不可少的。

所有网络节点向新状态的转换不会立即发生。由于网络延迟,这是一个渐进的过程,尽管很短暂。在 Cardano 网络中,向新状态的转换始于生成新块的节点,并在所有网络节点都收到此块时结束。如果该块有效并因此被所有节点接受,则会发生状态转换,同时伴随全局状态的变化。

事实上,全局状态的改变不仅仅反映了区块链历史的变化。验证后续区块的上下文也会发生变化。这个上下文不是区块链的完整历史,涵盖所有单个交易。相反,它是这个历史的一个子集,特别是 UTxO 的活动集,也可以是 UTxO 集。

在图片中,您可以看到每个附加到区块链的区块如何改变 UTxO 的活动集(用于验证新区块的全局状态)。随着 5 个新区块的添加,UTxO 集从一开始(状态 0)经历了 5 次连续变化。

分布式网络中的每个节点都独立运行,维护其唯一的区块链版本和一组活动的 UTxO。每当节点收到提议添加到区块链末端的新区块候选时,它都必须经过验证。此验证过程的输入是新区块和活动 UTxO 集。除了封装在区块头中的其他参数外,节点还需要验证区块内的所有交易。此验证的结果是节点独立决定是否将区块合并到其本地版本的区块链中。网络中的所有节点都执行相同的过程。

在图片中,您可以看到如何验证新的区块 6(应该是区块 5 之后的附加区块)。验证的输入是新区块和一组活动的 UTxO。验证的输出是验证器决定新区块是有效(并将附加到区块链的本地版本)还是无效。

UTxO 集
每次节点将新区块附加到其区块链的本地版本时,UTxO 集的本地版本也会发生变化。

UTxO 集包含所有已创建为交易输出并有可能在未来交易中使用的 UTxO。因此,它仅代表 Cardano 区块链整个历史中存在的所有 UTxO 的一小部分。

让我们在全局状态的背景下简要解释 UTxO。

UTxO 是独立且不可变的对象,只能使用一次。当它们被使用时,必须全部使用。UTxO 是一次性对象。

一旦 UTxO 作为交易的输出创建,它就会保持不变,直到它在新的交易中使用。当它被花费时,它会被完全消耗掉,并创建一个新的 UTxO 作为新交易的输出。

当交易提交时,它将一个或多个 UTxO 称为输入,旨在被花费。

当输入 UTxO 被消耗时,会导致创建一个新的 UTxO,或者可能是多个新的 UTxO。交易中输入 UTxO 的累计值必须等于所有输出 UTxO 的总值。

关于交易,验证者的工作是检查:

所有输入 UTxO 确实是当前 UTxO 集的一部分,即它们未被花费并且存在于账本中。
输入 UTxO 的总价值是消耗大于或等于输出 UTxO 的总价值,确保价值的保存。
交易由输入 UTxO 的所有者正确签名,确保只有合法所有者才能使用 UTxO。
区块链的历史记录可以看作是所有 UTxO(已使用和未使用)的图表。此图表提供了区块链上发生过的所有交易的完整、可审计历史记录。

在下图中,您可以看到交易如何使用 UTxO。输出 UTxO(绿色)在新交易中成为输入 UTxO(红色)。所有尚未使用的 UTxO(蓝色)代表验证新交易所需的全局状态子集。所有蓝色 UTxO 都可以成为交易输入,即被使用。绿色 UTxO 已被使用,因此无法再次使用。

区块链的当前状态是验证新区块(新区块中的新交易)所必需的,可以通过所有未使用的 UTxO 的集合来描述。这些被纳入 UTxO 集。

因此,要验证新交易,无需了解区块链的完整历史记录(或将其保存在活动内存中)。相反,只需要未使用 UTxO 的活动集(所有蓝色 UTxO)。但是,获取活动 UTxO 集通常涉及处理区块链的整个历史记录,从创世区块开始。

重要的是要注意,活动 UTxO 集还包括过去创建的 UTxO,即在先前状态下创建的 UTxO。

在图中的每个状态下,都会生成一个区块。在新状态 N+5 中,包含来自状态 N+2、N+3 和 N+4 的 UTxO 的 UTxO 集将用于交易验证。在状态 N+5 下生成的新区块中,有交易 14 试图花费来自交易 10 的 UTxO,交易 15 试图花费来自交易 11 的 UTxO。

在状态 N+5 下,区块链中已添加新区块。因此,也创建了新的 UTxO,并将其插入到 UTxO 的活动集中。在同一个状态转换中,所有已使用的 UTxO 都已从活动 UTxO 集中移除。

在图中,您可以看到 UTxO 集,它由所有未使用的 UTxO 组成,无论状态之间如何转换。

用户不断提交新交易,其中一些交易可能同时提交。网络的目标是处理所有交易,这意味着它旨在将有效交易纳入区块链。区块链中添加新区块标志着全局状态的转变。

新交易引用 UTxO 集中的 UTxO。该集合中的 UTxO 用作所有交易的输入,并代表将新区块附加到区块链时将发生的变化的一部分。所有作为新添加区块中交易输入的 UTxO 都将从 UTxO 集合中删除。

新添加区块中的每个交易都包含一个或多个新 UTxO,这些新 UTxO 被纳入 UTxO 集合。这是变化的另一部分。

当新区块附加到区块链时,节点会同时从 UTxO 集合中删除已使用的 UTxO,并将新创建的 UTxO 引入其中。

该图描绘了 UTxO 集合中的转换。在 STATE 0 中,您可以观察到将合并到后续区块中的六笔交易。红色 UTxO 是用作交易输入的 UTxO,这意味着它们将被使用。绿色 UTxO 是将被创建的 UTxO。STATE 1 表示添加新区块后的状态。红色 UTxO 已从 UTxO 集中移除,绿色 UTxO 已添加。因此,UTxO 集中的所有 UTxO 均可使用。将新添加的绿色 UTxO 视为蓝色。

图中的交易指的是在 STATE 0 中构建并提交给网络的区块。在 STATE 1 中,它已添加到区块链中。在 STATE 1 中已创建一个新区块,该区块未显示在图中。您可以想象引用 UTxO 集中的 UTxO 的新交易。

结论
事实上,每个 UTxO 只能使用一次,这是阻止双重支付攻击的基本规则。一旦 UTxO 被使用,它就不能被重新用作另一笔交易的输入。在区块验证期间,验证者可以直接确认所有 UTxO 输入都是唯一的并且存在于 UTxO 集中。 UTxO 模型的架构与交易验证过程相结合,简化了区块验证器识别和避免潜在双重支付攻击的任务。这是区块链技术的主要安全功能之一。

由一次性对象组成的 UTxO 集具有优势,因为它有助于在网络内实现高水平的并行化。交易的验证彼此独立,反映了 UTxO 的独立使用。另一个好处是能够在本地验证交易,而无需等待重新提交,确保它们也将通过网络验证。本地验证和网络验证都依赖于相同的输入 UTxO。在本地验证和网络验证之间的时间段内,在交易被纳入区块之前,输入 UTxO 保持不变。因此,交易应该没有理由失败。