Plutus教程:#8 脚本

By George Z. September 8, 2021

8. Plutus Scripts

Cardano 使用脚本来验证操作。这些脚本是代码片段,使用 True 或 False 输出实现纯函数。脚本验证是调用脚本解释器以在适当的参数上运行给定脚本的过程。

8.1 什么是脚本?

脚本是一个程序,它决定花费输出的交易是否被授权这样做。这样的脚本称为验证器脚本,因为它验证是否允许支出。一个简单的验证器脚本将检查支出交易是否由特定密钥签名——这将完全复制简单的支付到公钥输出的行为。但是,通过一些仔细的扩展,我们可以使用脚本来表达链上有用的逻辑。EUTXO 模型的工作方式是验证器脚本传递三个参数:

  • 数据(Datum):这是附加到脚本锁定的输出的一段数据(严格来说,同样,只有散列存在)。这通常用于携带状态。
  • Redeemer:这是一个附加到支出输入的数据。这通常用于从支出者向脚本提供输入。
  • 上下文(Context):这是一条数据,表示有关支出交易的信息。这用于对输出的发送方式进行断言(例如“Bob 签名”)。

8.2 直观的例子

例如,一个孩子想坐摩天轮,但在上车之前,他们必须比安全标志高。我们可以用伪代码表达这个想法,比如:

if isTallEnough(attraction=ferrisWheel,passenger=michael):
    getOnFerrisWheel()

def isTallEnough(attraction,kid):
    return kid["height"] >= attraction["minimumHeight"]

def getOnFerrisWheel():
    print ("get On the Ferris Wheel")

ferrisWheel = {"minimumHeight":120}
michael = {"height":135}

在本例中,以下适用:

  • 数据是关于这次交易的信息:michael.height。
  • 上下文是世界的状态,此时的意思是:ferrisWheel.minimumHeight。
  • reedemer,是要执行的操作:getOnFerrisWheel() 验证器脚本是使用所有信息的函数 isTallEnough

8.3 定义示例

现在让我们看一个来自 DeFi 领域的例子。我们可以实现原子交换,如下所示:

  • 数据包含交换双方的密钥,以及他们交换的内容的描述
  • 救赎者未使用。
  • 上下文包含交易的表示。 验证器脚本的逻辑如下:交易是否从第二方支付给第一方,包含他们应该发送的价值? 如果是这样,那么他们可能会花费这个输出并将其发送到他们想要的地方(或者我们可以坚持他们将其发送到他们的密钥,但我们不妨让他们用它做他们喜欢的事情)。

8.4 代码示例

您可以在每个智能合约上找到验证器脚本的真实代码示例,例如:

  • Plutus 交易教程:在这个验证器上,它总是成功的。
  • Plutus Hello World:在此验证器上,如果数据等于“Hello”,则将其转换为整数。
  • Plutus Pioneers English Auction:在这条线上,验证器确保新的出价(数据)优于前一个,直到时间结束。

8.5 成本模型参数

Plutus Core 脚本的成本模型有许多参数,它们是 Cardano 协议参数的一部分。 开发人员可以单独调整这些参数。有关更多详细信息,请参阅以下内容:

  • 成本模型参数列表及其简要说明
  • 了解更多参数含义的来源
comments powered by Disqus