UTxO花费

Understanding UTxO spending | Cardano Explorer (cexplorer.io)

Cardano 使用创新的扩展 UTxO 会计模型来支持多资产和智能合约。 它与银行或以太坊使用的基于账户的模型不同。 在本文中,我们将简要解释基于账户的模型和 UTxO 模型之间的区别。 本文的目的是详细解释用户如何花费 UTxO。

UTxO 和基于账户的模型的区别
基于账户的模型基于账户和余额的概念,类似于银行的运作方式。 以太坊就采用了这种模型。 用户拥有持有其代币余额的账户。 交易更新发送者和接收者帐户的余额。 这是取决于全局状态的原子操作。

扩展 UTxO 模型扩展了比特币使用的 UTxO 模型。 它基于未花费交易输出(UTxO)的概念。 UTxO 可以用作新交易的输入。 每笔(支出)交易都包含输入和输出。 交易消耗先前交易中未使用的输出,并产生可用作未来交易输入的新输出。

在UTxO模型中,资产以UTxO的形式存储在账本中,而不是作为账户余额。 地址的余额是通过将该地址控制的所有 UTxO 的值相加来计算的。 一个用户帐户可以包含多个地址。 基于账户的模型通常仅适用于一个地址。

每个 UTxO 只能使用一次,这意味着它只能用作一笔交易的输入。 一旦 UTxO 被用作输入,它就会被永远消耗。 创建一个新的 UTxO 作为交易的输出,它可以用作未来交易的输入。

通过将一个 UTxO 用作输入,可以创建更多 UTxO 作为输出。 每个新的 UTxO 都可以发送到不同的收件人(地址)。 例如,具有 100 ADA 的 UTxO 可用作具有 20 和 80 ADA 的两个新 UTxO 的输入。 带有 20 ADA 的 UTxO 可以发送到 Alice 的地址,带有 80 ADA 的 UTxO 可以发送到 Bob 的地址。 这样,交易就可以将输入的 UTxO 的值拆分并分发到不同的地址。

如果 Alice 有一个包含 100 ADA 的 UTxO 并且想要向 Bob 发送 80 ADA,则这是必要的。 20 ADA 必须返回到 Alice 的地址。

在 UTxO 模型中,交易是无状态的,这意味着它们不依赖于任何先前的历史记录或全局状态。 交易只需提供有效的输入、输出、费用和见证人即可有效。

见证人是证明一笔交易得到资金所有者授权的数据。 见证人可以是签名(对于密钥凭证)或脚本执行(对于脚本凭证)。 我们稍后再谈。

UTXO集合是Cardano网络中所有UTxO的集合。 它存储验证新交易所需的所有信息,而无需检查完整的区块链。 当创建新交易时,输入 UTXO 用于索取其持有的资金。

在基于账户的模型中,交易通过修改发送者和接收者账户的余额来更新分类账的全局状态。 交易是有状态的,这意味着它们取决于分类账的先前历史记录和全局状态。 交易可以从账户中花费任意数量的资金,只要有足够的余额即可。 交易会从发送者的账户余额中扣除代币,并将其记入接收者的账户余额中。 交易还可以执行智能合约,智能合约可以修改账本的状态或触发其他操作。

从 Shelley 地址花费 UTxO
Shelley 地址由标头和有效负载组成。 有效负载包含支付凭证和权益地址引用。 我们不会在本文中讨论质押。 我们将只专注于通过关键凭证(公钥/验证密钥)支出 UTxO。 所以我们只对支付凭证感兴趣。

在下图中,您可以看到基本的 Shelley 地址方案。

支付凭证是 Shelley 地址的一部分,用于标识谁拥有该地址中的资金。 支付凭证可以是密钥凭证(基于公钥/验证密钥)或脚本凭证(支出脚本的哈希值)。 单个 Shelley 地址上可以有多个 UTxO。

了解 UTxO 如何与地址关联非常重要。 必须确保可以从某个地址花费 UTxO,并且同一地址可以接收新的 UTxO。 经常使用这样的类比:UTxO 位于地址上,或者地址保存 UTxO。 UTxO 在发送者和接收者地址之间移动。 这个比喻很好,但有些简单化。

UTxO可以简单地描述为由标识符和值组成的结构。 该标识符是所谓的出点。 出点充当指向区块链中 UTxO 位置的指针。 出点由交易 ID 和创建 UTxO 的交易的输出索引组成。 该值是 UTxO 持有的硬币或代币数量s。

您可以在下图中看到 UTxO。

新的 UTxO 通过交易创建。 交易消耗输入 UTxO 并创建新的 UTxO。 当卡尔达诺网络处理交易时,会创建具有所需目标地址和值(代币或代币数量)的新(输出)UTxO。 一旦输入UTxO被消耗,就不能被第二次消耗。

交易的输入是UTxO,但从技术上讲,它是在区块链中标识UTxO的出点(参考)。 出点由之前的交易 ID 和创建 UTxO 的交易的输出索引组成。 通过提供出点,交易索取 UTxO 中的资金,并可以将它们用作新交易的输入。

输入的UTxO基本上指的是必须提供见证的地址(当前所有者的地址)。 这是因为outpoint指向了UTxO在区块链中的位置,而UTxO有一个目的地址。 目标地址有一个支付凭证,可以是密钥凭证,也可以是脚本凭证,用于标识谁拥有该地址中的资金。 交易必须为目的地址的支付凭证提供有效见证,才能花费 UTxO。

花费 UTxO 基本上会导致创建一个新的 UTxO(或多个 UTxO),该新的 UTxO 将与新的目标地址相关联。 使用 UTxO 作为输入的交易还必须提供一个或多个指定目标地址和新 UTxO 值的输出。 然后,新的 UTxO 与目标地址的支付凭证相关联,这意味着只有凭证的所有者才能在未来的交易中使用它们。

交易并不直接包含 UTxO 的原始地址,而是通过输入 UTxO 的出点间接包含。 每个出点由一个事务 ID 和创建 UTxO 的事务的输出索引组成。 网络必须验证当前所有者可以使用输入的 UTxO。 如果验证通过,则可以创建新的 UTxO(并与新的目标地址关联)。

在下图中,您可以看到简化的 Cardano 交易,其中包含一个输入 UTxO 和两个输出。

输入字段包含对交易正在花费的 UTxO 的引用列表。 在我们的例子中,只有一个输入 UTxO。

输出字段包含交易将资金发送到的地址和值对的列表。 每对由一个目标地址和一个值组成。 在我们的例子中,有两个输出。

输入的总价值必须等于或大于输出和费用的总价值。

费用字段包含用户为处理交易而向网络支付的 ADA 金额。

见证人字段包含一组见证人,证明交易是由资金(输入 UTxO)所有者或行动参与者授权的。 交易必须为每个输入地址(或铸币策略 ID、提款奖励帐户或证书作者的凭证)提供见证人。 在我们的例子中,只有一个输入 UTxO,因此验证只需要一名见证人。

让我们看一个示例,其中 Alice 向 Bob 发送 800 ADA。 在输入中,使用具有 1000 ADA 的 UTxO。 处理交易的费用为 1 ADA。 Alice 需要将 199 ADA 取回她的地址。 因此,交易有两个输出。

Alice 向 Bob 的地址发送 800 ADA,该地址具有基于 Bob 公钥的密钥凭证。 Alice 的交易创建了第一个 UTxO,以 Bob 的地址为目的地,以 800 ADA 为值。 它还创建第二个 UTxO,以 Alice 的地址作为目的地,以 199 ADA 作为值。

在下图中,您可以看到两笔交易和两个地址。 左边是之前的一笔交易,Alice 过去通过该交易用 1000 ADA 从其他人那里获得了 UTxO。 该 UTxO 用作 Alice 创建的第二笔交易的输入。 接下来,您会看到 Alice 的地址和 Bob 的地址,它们用作 Alice 交易中的目标地址。

爱丽丝的交易必须包括见证人才能允许输入被花费。 输入 UTxO 引用 Alice 的地址(通过之前的交易),其中包含支付凭证(蓝色箭头)。 Alice 必须在她的交易中插入一个见证人(私钥签名)。 这由图中的红色箭头指示。

将从输入 UTxO 创建两个新输出。 资金(1000 ADA)将被分配到多个地址(我们忽略费用)。 第一个输出包含 Alice 的目标地址和值 199 ADA。 第二个输出包含 Bob 的目标地址和值 800 ADA。 图中,黄色箭头表示资金分布,绿色箭头表示目标地址。

一旦交易由卡尔达诺网络结算(并最终确定),鲍勃就可以使用他的私钥来花费 800 ADA 来自他的地址。 Alice 可以使用她的(相同的)私钥来花费交易处理后留给她的 199 ADA。

结论
乍一看,与基于账户的模型相比,UTxO 模型可能显得有些复杂,但它有很多优点,特别是在可扩展性和安全性方面。 下次我们将描述如何通过验证器脚本花费 UTxO。