Home 扩展的UTxO模型
Post
Cancel

扩展的UTxO模型

序言

区块链是状态机 —— 它们跟踪状态(例如,每个钱包持有多少比特币)和状态随时间的变化。

每笔交易(因此每一个区块)都会改变区块链的状态。在区块链中跟踪和管理状态的两种最流行的方法是: 未使用的交易输出(UTxO)模型和Account(账户)模型。

UTxO模型是由比特币开创的,可以直观地认为是类似现金的(下面将进一步详述),而账户模型是由以太坊推广的,可以直观地认为是类似银行账户的。与所有工程和设计决策一样,UTxO和账户模型需要权衡取舍。 例如,账户模型比UTxO模型具有更多的表达能力,但具有更差的确定性(当底层区块链使用账户模型时,交易更有可能失败)。

支持Cardano项目的科学和研究机构IOHK的团队已经创新了一种新的状态管理系统,他们称之为扩展的UTxO模型(eUTxO)。eUTxO模型是UTxO模型和账户模型的综合,它结合了账户模型的表达能力和UTxO模型的隐私性、安全性、并发性和确定性。

很多 文章 比较 比特币的UTxO 模型 以太坊的帐户模型 但很少有文章将这种比较扩展到eUTxO模型。本文将快速介绍UTxOAccount模型的基础知识,并尝试彻底解释eUTxO模型。

UTxO模型

首先,让我们为比特币开创的UTxO模型建立一些直觉。请记住,UTxO代表未使用/未花费的交易输出。让我们从一个基于上述直觉的例子开始,即UTxO模型类似于现金。

假设Alice有一张100美元的钞票,她需要付给Bob 3美元。 Alice将她的100美元钞票交给Bob,然后Bob将返还给Alice97美元。

在此示例中,Alice以价值100美元的未花费交易输出(UTxO)开始。然后,她在一笔交易中(花费/消费)了该输出(100美元的钞票),从而产生了2个新的未花费交易输出(UTxOs),一个为3美元(由Bob拥有),另一个为97美元(由Alice拥有)。现在请注意,原来的100美元的UTxO不能再次(消费/花费)。

每个UTxO只能使用一次,并且可以生成一个或多个新的UTxOsUTxO模型中的每笔交易都会接收一个UTxOs输入列表,消费它们,并创建一个新的UTxOs列表,这些新的UTxOs可以稍后在新的交易中(使用/花费)。 UTxO的另一个值得注意的特性是,交易的输入值必须始终等于输出值(减去区块链为处理交易而收取的任何费用)。

UTxO模型具有很好的并发性,因为状态是本地的(与下面描述的Account模型的全局状态相比)。这种本地状态的概念源自这样一个事实: UTxO特定于每个钱包。如果AliceCharlie进行交易,这不可能影响Bob的交易能力,因为Alice无法消费BobUTxOs。账户模型中并非如此,我们将在下一节中详细说明。因为AliceBob进行的交易之间没有任何依赖关系,所以他们的交易可以更有效地并行化。

有人认为UTxO模型具有更好的隐私属性,但我还不相信。据称,UTxO模型具有更好的隐私性,因为用户可以为每笔交易使用新钱包,并在收到他们发起的交易的零钱时(即: Alice在上面的示例中获得了97美元的零钱)。虽然Account模型没有change(找零)的概念,但用户也可以选择为Account模型中的每笔交易创建一个新钱包。在为每笔交易创建新钱包时,UTxO模型的一个好处是,分布在多个钱包中的价值可以比在账户模型中更容易地(整合/合并)。UTxO模型中的整合理论上可以在单个交易中完成,因为可以一次消耗所有UTxO并创建单个输出(但是块大小的实际限制将限制这一点,例如,一次最多消耗6个UTxO)。

UTxO模型的一个缺点是交易的大小。在UTxO模型中,每笔交易都指定一个输入列表和一个输出列表。这意味着一些有很多输入和输出的交易可能会变得非常大。

帐户模型中的交易较小,这将在下文更详细地描述。另一个很大的缺点是模型的概念困难 - 大多数人比UTxO模型更容易理解和概念化帐户模型,这意味着用户和开发人员都有更大的错误空间。 UTxO模型的最后一个问题是它的智能合约能力有限。比特币对多重签名、时间锁定交易和P2SH等智能合约的支持有限。但是,比特币UTxO模型不支持图灵完备的脚本。

Account模型

UTxO模型相比,账户模型可以直观地被认为类似于银行账户。账户模型中的交易指定debits(借方)和credits(贷方),而不是消费和创建UTxO。让我们再次假设Alice有100美元并想向Bob发送3美元,尽管这次钱不是现金形式,而是存在银行账户中。为了让Alice将这笔钱汇给Bob,她要求她的银行从她的账户中debit(借记)3美元,并在Bob的账户中credit(贷记)3美元。请注意这里没有change(找零)的概念,以及银行如何管理这些credits(贷方)和debits(借方)。

我们在上面提到了UTxO模型对于大多数用户来说是如何不那么直观的,希望这个例子能说明为什么会这样。从概念上来说,用”未花费的交易输出”来思考是很困难的,但从贷方和借方的角度来看却很容易。我们还提到了当有很多的输入和输出时,UTxO模型中的交易如何变得非常大。账户模型中的交易更简单、更小,因为每笔交易都指定了一个简单的贷记/借记方案 —— “向Bob发送 x ETH“。

UTxO模型相比,账户模型更具表现力。账户模型支持区块链上的long lived(长期)合约,可以为生态系统中的每个账户保留自己的状态。UTxO模型支持长期合约,但UTxO模型的原语不允许图灵完备的表达能力。例如,Alice可以在账户模型区块链上编写智能合约,该合约发行代币并充当银行跟踪持有代币的每个钱包,并在代币持有人使用代币进行交易时执行借记和贷记。

智能合约充当银行管理和调解交易的想法极大影响了账户模型的并发属性。由于存在中央中介(充当银行的智能合约)的概念,AliceCharlie进行的交易可能会影响到Bob的交易能力。

作为一个人为的例子,智能合约可能有一个条款,如果所有账户余额小于10,则阻止任何人进行交易。假设Alice的余额为11,Bob的余额为5。还假设AliceBob都想向Charlie发送2个硬币。如果Alice的交易首先执行,Bob的交易将失败,因为Alice的余额为9Bob的余额为5,Charlie的余额为2,这种分配违反了智能合约的”所有余额必须为10或更多”的条件。但是,如果Bob的交易先执行,它会成功,因为Alice将拥有超过10个硬币(当前还是11)。Bob的第一笔交易成功不会影响Alice的交易能力,因为仍然会有一个人(Alice)的余额大于10。这展示了Alice的交易如何影响Bob的交易能力(与UTxO模型相反),这意味着账户模型中的交易不能像UTxO模型那样有效地并行化。账户模型中的交易顺序远比UTxO模型重要。

账户模型的另一个后果是它使多代币交易比eUTxO模型更困难(我们将在下一节中详细说明)。 如果Alice有10个AliceCoin和10个BobCoin,并且想将每个硬币中的5个发送给Bob,她通常会通过2次单独的交易来做到这一点,一笔交易发送5AliceCoin,另一笔交易发送5BobCoin。 发生这种情况是因为AliceCoinBobCoin都由独立的智能合约管理,并且它们都彼此独立地管理代币余额。必须独立联系每个合约以执行适当的借贷,通常在两个单独的交易中.

但是,可以在账户模型中编写第三个智能合约,该合约在执行时会向AliceCoinBobCoin智能合约发出正确的请求。 Alice理论上可以与AliceAndBobCoinWrapper合约进行交互,该合约将执行对AliceCoinBobCoin合约的适当调用,但这种范例有几个缺点,例如安全性(Alice必须授予AliceAndBobCoinWrapper合约与她的代币交互的权限)、费用(可能这种情况下,使用包装合同比向各自的智能合同发出两个独立的交易更昂贵)、确定性(当合约变得更复杂时更有可能发生故障)和全面性(如果Alice有第三或第四个想要发送的硬币怎么办?)。

eUTxO模型

扩展的UTxO模型旨在将账户模型中的智能合约的表现力与UTxO模型的确定性和可并行性结合起来。 eUTxO模型具有与UTxO模型相同的类似现金的直觉,但在构建交易时可以更好地控制如何消耗输入。可以在Cardano开发人员文档中找到eUTxO模型的快速摘要,并且可以在IOHK博客上找到介绍该想法及其形式属性的完整科学论文。除了这两个,IOHK在他们的博客上发表了一篇论文,将eUTxO模型与账户模型进行了比较,但这篇论文在数学上非常密集。IOHK教育总监Lars Brujnes的这段视频很好地概述了UTxO模型、账户模型和eUTxO模型。

它是如何工作的

让我们首先回顾一下UTxO模型的一些更深层的机制。 每个UTxO都有3个字段: 一个表示UTxO的”大小”的value、一个帐户的公钥(已授权可以花费该utxo)和一个验证器函数v,它接受一个我们称为redeemer的参数p。 当一个交易试图消费一个UTxO时,它必须提供一个redeemer,使得v(value, p)=true。通常,此redeemer是由钱包私钥签名的交易的哈希值。

验证者将(大约)检查交易是否由与UTxO中的公钥对应的私钥签署,确保UTxO只能由授权钱包使用。 可以使用更复杂的validators(验证器)和redeemers,但它们仍然无法提供完整的智能合约功能。 使用这种轻量级模型可以执行的脚本类型是有限的。

eUTxO模型通过几个关键机制扩展了这个模型:

  1. 每个UTxO都会有一个称为datum的额外字段d,它可以持有任意数据(用于跟踪一系列交易中的嵌入状态)
  2. 除了redeemer之外,每笔交易tx的完整信息都会传递给验证者(用于称为合约连续性的概念)
  3. validator(验证器)可以有任意逻辑

eUTxO模型中,为了消耗UTxO,必须满足v(value, p, d, tx)=true。这意味着UTxOvalidator(验证器)必须批准交易tx可以消费带有redeemer pdatum dvalue

请记住,可以将区块链视为状态机。我们可以用同样的方式来思考一系列连续的交易。每笔交易都可以演化出一个嵌入在区块链这个更大的状态机中的状态机。为了使一系列交易连续,它们必须强制执行相同的约束。 该datum使一系列连续的交易能够管理它们自己的状态。将完整交易tx传递给validator(验证器)使验证器能够强制交易的输出使用相同的合约代码。

示例

让我们通过一个示例来说明eUTxO模型如何为datumvalidator(验证器)和合约连续性的概念建立更多的直觉。 让我们来看看n-of-m多重签名合约。多重签名合约是一个”具有m个授权人但只需要n个授权人进行签署就可以执行合约”的合约. 假设AliceBob想付钱给Charlie做一些工作。而Charlie想知道AliceBob有足够的钱付给他。 在Charlie完成之前,AliceBob不想支付工作费用。他们三人可以签订2-of-3多重签名合同,该合同将持有用于支付Charlie的资金。 这使Charlie能够确认AliceBob拥有足够的资金,同时也让AliceBob控制资金,直到工作完成。 为了进行支付,3人中的任何2人都可以签署合同以释放托管资金。 下面是一个状态转换图,取自eUTxO论文,它概述了多重签名合约的行为方式:

Holding状态是尚未提出付款的情况。从这个状态,合约可以通过Propose函数转换到Collect 状态。一旦进入Collect状态,就有三种可能的转换: 通过Add函数返回Collect,通过Pay函数返回Holding,通过Cancel函数返回Holding

Transaction消费的UTxORedeemer产生的UTxODatum
创建合约  a{}
Propose(提议)付钱给CharlieaPropose(100, Charlie, 10)bCollecting((100, Charlie, 10), {})
Charlie签署多签bAdd(sig_charlie)cCollecting((100, Charlie, 10), {sig_charlie})
Alice签署多签cAdd(sig_alice)dCollecting((100, Charlie, 10), {sig_charlie, sig_alice})
Charlie完成付款dPaye{}

上面的表格总结了一系列潜在的交易,这些交易使用了上面所示的多签智能合约状态机。下面我将对这些交易进行描述和阐述。

AliceBobCharlie达成协议,例如向Charlie支付100 ADA时,他们可以启动合约,合约将以Holding状态开始(此时datum为空)。AliceBobCharlie的签名被写入到合约代码中,n的值(等于2)也是如此。此合约启动的结果将是一个UTxO,我们将其称为UTxO a,它有一个强制执行有效状态转换的验证器、我们刚刚解释的空的datum以及最终支付给Charlie的值。

一旦Charlie认为他已经完成了工作,就可以使用redeemer Propose(100, Charlie, 10)来消费UTxO a,这意味着Charlie提议在时间10之前向自己支付所有100 ADA。这将创建一个新的UTxO,我们称之为b,它有一个值近似Collecting((100, Charlie, 10), {})datum,这意味着Charlie正试图在时间10之前收集100ADA,但还没有人提交签名。UTxO b将具有与UTxO相同的验证器(这是合约的连续性)。

Charlie现在可以使用redeemer Add(sig_charlie)提交一个消耗UTxO b的新交易。由于Charlie是该合约的授权消费者,这将创建一个新的UTxO c,其datumCollecting((100, Charlie, 10),{sig_charlie}). 现在datum表明三个签名者中的一个已授权向Charlie发送100 ADA.

如果Charlie现在尝试用redeemer Pay来消费UTxO c(因为他很贪婪并且想要他的钱),那么交易将会失败,因为验证器将看到在需要2个签名时却只存在1个签名。同样,如果Charlie尝试重新添加他的签名以满足2个签名阈值,他只会浪费他的钱,因为合同会确保不会多次添加相同的签名。Charlie也可以在生成UTxO c时尝试更改验证器,但如果他尝试这样做,UTxO b的验证器会看到这一点并拒绝交易(请记住,在消费以前的输出时,整个交易都会传递给验证器,包括输出)。

现在,AliceBob都可以提交带有他们签名的交易来推进状态图。 假设Alice提交了一笔交易,使用redeemer Add(sig_alice)来消费UTxO c。这将创建一个新的UTxO d,其datumCollecting((100, Charlie, 10), {sig_charlie, sig_alice})。像以前一样,UTxO d将具有与UTxO c相同的验证器。

现在,Charlie可以使用redeemer Pay提交消费UTxO d的交易,以完成对自己的付款。之所以会发生这种情况,是因为redeemer Pay的唯一条件是有足够多的授权签名已经签署了合同,在本例子中,AliceCharlie都已经成功签署了合同。

如果付款未在时间10之前完成,那么任何人都可以通过使用redeemer Cancel来提交交易以取消付款。这会将合约转换回具有一个空的redeemerHolding状态。然后可以再次开始proposal(提议)过程。

eUTxO的特性

eUTxO模型保留了UTxO模型的许多相同属性,例如可扩展性、确定性、隐私性,同时将脚本功能扩展为图灵完备。eUTxO模型的一个有趣方面是它可能从根本上比帐户模型更具表现力。

这在IOHK博客上的论文中说:

尽管translations(翻译/转换)暗示了accounting(会计/账户)等价性,但命题2和Sec的translation(翻译)表明,5.2表明通常需要创建多个基于帐户的交易来模拟单个基于UTXO的交易的效果。这一点很重要: 虽然单个基于UTXO的交易中的所有价值转移都是以原子方式同时处理的,但不能保证相应的基于账户的交易也是如此, 从理论上讲,他们的执行之间可能存在很大的时间差距。

这篇论文文不讨论eUTxO模型,但与介绍eUTxO模型的论文相结合时,可以合理地得出结论,eUTxO模型至少与帐户模型一样具有表现力(并且可能更具表现力)。

这种表现力的一个例子可以在Cardano上开发的现实世界实用程序中找到。一项名为DripDropz的服务允许生态系统中的参与者从单一界面领取可供他们使用的空投。

这在账户模型中是不可能的(我不确定这一点,但我从未见过这样的工具用于基于账户的区块链)。DripDropz能够在一次交易中向3个不同的参与者发送超过10种不同的资产。这意味着多达30个独特的资产(没有两个参与者索取相同的空投)在一次交易中被转移。

这在账户模型中基本上是不可能的。有可能构建可以执行类似事情的包装合约,但这些包装合同将受到组合爆炸的影响,以涵盖所有可能的资产索赔组合。

eUTxO模型比Account模型更易于静态分析和形式验证。这是因为eUTxO模型中的状态是局部的(即:绑定到每个地址),而不是全局的。由于帐户模型的全局状态,对帐户模型中给定的智能合约进行形式化分析需要对给定智能合约与之交互的每个合约进行建模。

例如, 智能合约a调用智能合约b调用智能合约cb仍在等待c完成时回调智能合约b的形式化分析将非常困难(特别是如果状态可以在各种智能合约调用之间改变).我在形式分析方面的背景不够深入,无法详细描述为什么这很难分析。

但是,请记住,要使任何交易在eUTxO模型中有效,必须满足以下条件: v(value, p, d, tx)=true。验证器是纯函数 —— 它们是幂等的并且没有副作用。尽管datum可以从一个UTxO更改为下一个,但将其视为产生新状态更为合理,因为”旧”UTxO上的datum不能再被消耗。当进行交易时,旧datum实际上被丢弃,并在其位置上创建了一个新datum。纯函数特别适用于形式化和静态分析.

我们已经多次讨论过帐户模型中的交易必须如何串行完成(因为存在全局状态,智能合约可以相互交互,改变全局状态)。

我们还将其与常规UTxO模型进行了比较,该模型支持更多并行处理,因为不共享相同输入(使用相同UTxO)的交易彼此完全独立。这也适用于eUTxO模型。不消耗相同输入的交易可以并行处理。这为朴素的第1层处理能力提供了显着的性能改进,但也使分片在未来更容易实现。 对于绝大多数(也许是全部?)区块链,每个节点和矿工/验证者处理每一笔交易,与分片模式相比,这相对低效和昂贵。分片通过分割区块链的状态,使每个分片负责区块链的一小部分,从而降低节点和矿工/验证器的数据存储和处理需求。由于帐户模型的全局状态,与UTxO模型相比,使用帐户模型进行分片相对更加困难。

例如,以太坊有一个相当复杂的分片路线图,该路线图将于2023年发布(但根据之前估计的及时性,该路线图可能会推迟很久)。Cardano目前没有详细的分片路线图,但该项目的Basho阶段(我们目前正在进行)将使用侧链进行分片解决方案。Milkomeda是一个由DcSpark开发的侧链,目前在主网上处于测试阶段。

如前所述,UTxO模型不如账户模型直观。这意味着制作智能合约的开发人员可能会在使用eUTxO模型时遇到困难。除了开发人员遇到困难之外,用户在与eUTxO链上的智能合约交互时可能很难概念化他们在做什么。 不可否认,这两个事实都会减缓eUTxO模型的采用。但是,由于我们在上面已经表明,eUTxO模型至少与帐户模型一样具有表达能力,因此有一条清晰的帐户模型兼容性路径。事实上,有几个项目正在筹备中,这将使开发人员从帐户模型迁移到eUTxO模型变得更加容易: Milkomeda(EVM侧链)、IELE(将为Mamba提供动力)和Avoum(使开发人员能够直接为eUTxO模型编写基于帐户的智能合约)。 一个有益的观察是,曾几何时,在从单核计算到多核计算的过渡期间,编写利用多核的代码很困难,但最终构建了新的工具和抽象,从而显着降低了新的多核范式的复杂性.从基于账户的区块链到基于eUTxO的区块链的过渡(如果发生的话)也是如此 —— 将构建和发现简化开发过程的工具和抽象。

结论

Extended UTxO模型是IOHK的一项新创新,IOHKCardano区块链背后的科学和工程公司。eUTxO模型结合了智能合约在账户模型中的表现力和UTxO模型的可并行性和确定性。IOHK的研究表明,eUTxO模型实际上可能比账户模型更具表现力,这要归功于交易与UTxO的交互方式的独特属性。除此之外,eUTxO模型更容易进行形式化和静态分析,这将为用户提供更高程度的保证,即他们与之交互的合约将按预期运行。尽管eUTxO模型不如帐户模型直观,但目前正在构建工具和抽象,这将有助于弥合差距并简化学习和过渡过程。

This post is licensed under CC BY 4.0 by the author.

Halogen-07-运行应用程序

-