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 协议参数的一部分。 开发人员可以单独调整这些参数。有关更多详细信息,请参阅以下内容:
- 成本模型参数列表及其简要说明
- 了解更多参数含义的来源