IOHK官网博客:对于Plutus,我们需要知道的信息

image
原文来自IOHK Lars Brünjes,由卡尔达诺大使陈哲Anson翻译

开发人员现在正在准备通过Plutus和Alonzo协议升级实现Cardano智能合约

在我们以前的博客文章中,我们讨论了Alonzo ‒协议升级的名称,它将在Cardano上引入智能合约支持。 Alonzo将使用Plutus建立基础设施并添加功能性智能合约开发工具。

Plutus平台为Cardano区块链提供了原生智能合约语言。要了解并精通Plutus,必须了解三个概念:

•扩展的UTXO模型(EUTXO)

•Plutus Core P Plutus的“链上”部分

•Plutus应用程序框架(PAF)‒ Plutus的“脱链”部分,可与智能合约进行交互。

Plutus合同包括在区块链上运行的部分(链上代码)和在用户机器上运行的部分(链下代码或客户端代码)。链上和链外代码都是用Haskell编写的,而Plutus智能合约实际上是Haskell程序。链外代码可以使用PAF编写,然后由GHC(格拉斯哥Haskell编译器)编译,而链上代码(使用Plutus Core编写)由Plutus编译器编译。

了解这些Plutus概念与原生代币功能之间的关系至关重要,以了解它们的交互如何将后者变成更有用和更强大的功能。

扩展的UTXO模型

卡尔达诺(Cardano)(如比特币)使用未花费(U)交易(TX)输出(O)会计模型。在UTXO模型中,交易具有输入和输出,其中输入是先前交易中未花费的输出。一旦将输出用作交易中的输入,该输出就会变为消耗状态,并且永远无法再次使用。输出由地址(公共密钥或公共密钥哈希)和值(由ada数量和可选的附加原生代币数量组成)指定。输出地址确定允许哪些交易“解锁”输出并将其用作输入。交易必须由与该地址对应的私钥的所有者签名。将地址视为“锁”,只能通过正确的“键” ‒正确的签名进行“解锁”。

EUTXO模型在两个方向上扩展了该模型:

1.它通过使用锁和钥匙类比来概括“地址”的概念。除了限制对公共密钥的锁定和对签名的密钥,EUTXO模型中的地址可以包含脚本形式的任意逻辑。例如,当节点验证交易时,该节点确定是否允许交易使用某个输出作为输入。事交易将查找由输出地址提供的脚本,如果交易可以将输出用作输入,则将执行脚本。

  1. UTXO和EUTXO之间的第二个区别是,除了地址和值之外,输出还可以携带(几乎)任意数据。通过允许脚本携带状态,这使脚本更加强大。

验证地址时,脚本将访问输出所携带的数据,正在验证的交易以及称为赎回者的一些其他数据,交易为每个输入提供这些数据。通过查找所有这些信息,脚本具有足够的上下文,可以在非常复杂的情况和用例中给出“是”或“否”的答案。

总而言之,EUTXO扩展了UTXO模型,方法是允许输出地址包含复杂的逻辑来决定哪些交易可以对其进行解锁,并向所有输出添加自定义数据。

EUTXO模型提供了独特的优势对其他会计模型的约束。交易验证的成功或失败仅取决于交易本身及其输入,而不取决于区块链上的其他任何内容。因此,可以在将交易发送到区块链之前在链外检查交易的有效性。如果某个其他交易同时消耗了该交易预期的输入,则该交易仍可能失败,但是如果所有输入仍然存在,则该交易可以保证成功。

这与基于帐户的模型(以太坊使用的模型)形成对比,在该模型中,交易可能在脚本中期执行中失败。这在EUTXO中永远不会发生。此外,交易执行成本可以在传输前在链外确定-这是以太坊上无法实现的另一功能。

最后,由于交易验证的“本地”性质,因此高度并行是可能的:原则上,如果一个节点不尝试消耗相同的输入,则节点可以并行验证交易。这对于效率和推理都非常有用,它简化了对可能结果的分析,并证明了“一切皆有可能”发生。您可以在上一篇博客文章中更深入地研究EUTXO模型。

Plutus Core

要实现EUTXO模型,必须明确定义术语脚本和数据。脚本需要使用明确的,明确指定的脚本语言,并且定义附加到输出并用作救赎者的数据类型也很重要。

这就是Plutus Core出现的地方。PlutusCore是Cardano使用的脚本语言。它是一种类似于Haskell的简单功能语言,并且Haskell的很大一部分可用于编写Plutus Core脚本。作为合同作者,您不会编写任何Plutus Core。所有Plutus Core程序均由Haskell编译器插件生成。

这些脚本将在链上“实时”进行交易验证期间由节点执行。它们将以验证程序脚本的形式或作为铸币策略锁定UTXO,以控制本机代币的铸币和刻录(请参阅下文)。

赎回者数据是一种简单的(代数)数据类型,可以在Haskell中轻松定义,这也是Haskell是编写Plutus Core脚本的好选择的另一个原因。实际上,聪明的合同开发人员将在Haskell中编写验证程序脚本,然后将其自动编译到Plutus Core中。

适当的Haskell库通过提供用于验证期间检查交易的核心数据类型,并提供许多帮助程序功能和更高级别的抽象,简化了编写这种验证逻辑的过程,使合同作者可以专注于业务逻辑,而不必担心过多交易详细信息。

Plutus应用程序框架(PAF)

验证程序脚本的链上状态只能通过花费并产生脚本输出的交易来修改。在编写Plutus应用程序时,我们不仅需要考虑应用程序的链上部分(Plutus Core脚本),还需要考虑构建和提交交易的链下部分。

就像链上代码一样,链外代码也是用Haskell编写的。这样,我们只需要编写一次业务逻辑。然后,我们可以在验证程序脚本和构建运行验证程序脚本的事务的代码中使用它。

许多应用程序需要监视UTXO集以查看特定地址的更改,因此,如果我们将合同写为状态机,则需要跟踪代表机器当前状态的未花费输出,并在链上时更新本地状态状态更改。同样,许多应用程序需要与电子钱包后端进行通信,以访问其用于交易的加密货币。

通过PAF,可以轻松访问Plutus应用程序常用的服务。使用框架库部署的应用程序可以在Plutus应用程序后端运行,该应用程序运行时支持对区块链的访问以及持久性,日志记录和监视等其他问题。在PAF之上编写的应用程序会自动提供HTTP和WebSocket接口,可用于从Web浏览器与应用程序进行交互。

原生代币

借助2月份的Mary硬分叉,卡尔达诺用户可以使用原生代币。任何用户都可以创建自己的代币,并且可以像ada一样自由发送和接收代币。每个原生代币都有其自己的铸造策略,该策略决定了代币可以被铸造和燃烧的条件。

目前,这些铸造策略由指定签名和时间锁的简单规则组成。例如,策略可以声明仅允许由五个可能的签名中的两个签名的交易创建或刻录代币。另一策略可以仅在特定slot之前或之后允许铸造。

尽管这些基本构建块功能强大,但它们并不能涵盖所有可能的用途。例如,这可能使用此类简单策略的不可替代代币(NFT)。通过将铸造操作限制在特定时间点,可以使用时间锁来铸造NFT。如果在该时间点之前仅铸造了一个代币,则该代币在技术上是不可替代的(因为只有一个)。但是要检查这一点,仅检查铸造策略是不够的。我们需要查看代币的铸造历史,以确保确实只铸造了一次。

随着Plutus的部署,用户将能够使用Plutus核心编写铸造策略。在铸造或刻录过程中,将在铸造或刻录交易的上下文中执行Plutus Core策略脚本,并且脚本必须批准或禁止该操作。通过创建更加复杂的铸造策略并允许以不信任的方式创建NFT,这将进一步加快Cardano上NFT的增长。

Alonzo正在通过多个测试网逐步部署到主网,因此我们的合作伙伴和Plutus开拓者将能够在代码冻结之前的整个5月和6月在Cardano上编写应用程序来测试Plutus Core。这也是交换所进行的质量保证和用户接受度测试的时期,以确保在Alonzo主网升级时该平台已完全准备就绪。如果您是开发人员,并且想了解有关Plutus的更多信息,请考虑加入未来的先锋团队。另外,请查看Plutus GitHub存储库,并在Cardano论坛上参与有关Plutus的讨论。

我想感谢JannMüller在此博客文章中的投入和贡献。

原文链接:https://iohk.io/zh/blog/posts/2021/04/13/plutus-what-you-need-to-know/

1 Like