导航
导航
文章目录
  1. 概述
  2. type 脚本
  3. lock 脚本
  4. 运行模型
  5. 回到例子
  6. 规则
  7. 下期预告

CKB脚本编程简介[1]: 验证模型

截至目前,CKB中的Cell验证模型或多或少已经趋于稳定,因此我将在这里开始写一系列文章来介绍CKB脚本编程。我的目标是补充在阅读白皮书后编写CKB脚本所需的所有缺失的细节实现,这样您就可以开始探索CKB呈现的这个美丽的仙境。

您可能会注意到我将在CKB上运行的代码称为脚本,而不是智能合约。这是因为智能合约对我来说是一个令人困惑的术语,我在这里想用另一个词来表示CKB独特的可编程性。CKB中的脚本不一定只是我们在脚本语言中看到的脚本,例如Ruby,JS,它实际上是指在CKB VM上运行的RISC-V格式二进制文件。

这第一篇文章将专门介绍CKB v0.14.0中引入的全新验证模型。这可能听起来很无聊,但我保证这是最后一篇没有实际例子的帖子 :P

请注意,尽管我认为CKB的编程模型现在非常稳定,但目前仍然在进行开发,因此可能会有变化。我会尽力确保这篇文章更新,但如果有什么让你感到困惑的话,这篇文章现在正在描述CKB的这次提交

概述

下面一张图片说明了CKB的真实交易过程:

Transaction Example

这张图中有很多内容,我们将在稍后的文章中再次回到此图。今天,我们将只关注单元数据结构中的2个实体:locktype

1
2
3
4
5
6
7
pub struct CellOutput {
pub capacity: Capacity,
pub data: Bytes,
pub lock: Script,
#[serde(rename = "type")]
pub type_: Option<Script>,
}

从数据结构中我们可以看到locktype共享相同的结构,稍后我们可以证明它们也是在同一个环境中执行的,它们之间的差异只是在几个小细节中:

  • lock 是必须的, while type 是可选项
  • 通常, 他们用于不同的实例

我们首先从type脚本开始。

type 脚本

请注意,注意这里的名字只是一个幸运的意外,它与心爱的编程语言无关.

如果你考虑一下,CKB(或大多数基于UTXO的区块链)上的交易只会将一组Cell(或UTXO)转换为另一组Cell。有趣的是,这里的实际转换过程。这就是我们开始设计CKB验证模型的地方:我们如何构建模型以更好地验证Cell 转换?

这就是type脚本的用武之地:type脚本用于验证 Cell 转换阶段的某些规则。这里的一些例子包括:

  • 验证UDT(用户定义的Token)余额以确保不会无效地发出新Token。

lock 脚本

运行模型

现在让我们看看是什么时候执行 lock 和 type 脚本的。

回到例子

这是我们之前看到的交易:

Transaction Example

在图中,执行流程如下:

  1. Lock Script 1 执行一次。
  2. Lock Script 2 执行一次。
  3. Type Script 1 执行一次。
  4. Type Script 2 执行一次。

在后面的文章中,我们可以看到 lock 和 type 脚本都在相同的环境中执行,并且都可以访问整个交易。如果任何一个脚本失败,整个交易就会失败。只有当所有脚本都成功时,交易才被认为是有效的。

有几点值得一提:

尽管有 2 个带有Lock Script 1的 input cell,但它只执行一次,由实际的 lock 脚本来定位具有相同 lock 脚本的所有 input cell,并验证两个签名。

在这个交易中只执行 input cell 中的 lock 脚本,例如:这里不执行Lock Script 3

即使 input cell 和 output cell 都包含Type Script 1,也只执行一次。

在 input 和 output cell 中都会执行 type 脚本,其中包括Type Script 1Type Script 2

有些 cell 没有 type 脚本,在本例中我们只是省略了执行。

规则

现在我们总结一下规则:

在 input cell 中的 lock 脚本会被收集和解压,每个单独的 lock 脚本会被执行一次,并且只执行一次。

input 和 output cell 中的 type 脚本(如果存在的话)会被收集在一起并解码,每个单独的 type 脚本都会被执行一次,并且只执行一次。

任何脚本失败,则整个交易验证失败。

下期预告

现在已经介绍了 cell 模型,我们将在下一篇文章中研究如何实际编写 CKB VM 脚本。将验证默认的 secp256k1 lock 脚本,来演示 CKB VM 脚本的使用周期。