CKB-VM 的核心开发者 Xuejie 在自己的博客「Less is More」中,创作了一系列介绍 CKB 脚本编程的文章,用于补充白皮书中编写 CKB 脚本所需的所有缺失的细节实现。
作者:Xuejie,Xuejie 是 CKB-VM 的核心开发者,他在自己的博客「Less is More」中,创作了一系列介绍 CKB 脚本编程的文章,用于补充白皮书中编写 CKB 脚本所需的所有缺失的细节实现。本文是该系列的第一篇,介绍了 CKB 的全新验证模型,据说这是 Xuejie 最后一篇没有实际代码示例的帖子,快来查收吧:P
原文链接:https://xuejie.space/2019_07_05_introduction_to_ckb_script_programming_validation_model/
译者:Jason, Orange (排名不分先后)
校对:Xuejie, Kelly
截至目前,CKB 中的 Cell 验证模型或多或少已经趋于稳定,因此我将开始写一系列文章来介绍 CKB 脚本编程。我的目标是补充白皮书中编写 CKB 脚本所需的所有缺失的细节实现,这样您就可以开始探索 CKB 呈现的这个美丽的仙境。
您可能会注意到我将在 CKB 上运行的代码称为脚本,而不是智能合约。这是因为智能合约对我来说是一个令人困惑的术语,在这里,我想用另一个词来表示 CKB 独特的可编程性。CKB 中的脚本不一定只是我们在脚本语言中看到的脚本,例如 Ruby,JS,它实际上是指在 CKB-VM 上运行的 RISC-V 格式的二进制文件。
这个系列的第一篇文章将专门介绍 CKB v0.14.0 中引入的全新验证模型(https://github.com/nervosnetwork/ckb/pull/913)。虽然这听起来很无聊,但我保证这是最后一篇没有实际示例的帖子:P
请注意,尽管我认为 CKB 的编程模型现在非常稳定,但目前仍然在开发过程中,因此可能会有变化。我会尽力确保更新这篇文章的内容,但如果您有感到困惑的话,那是因为这篇文章现在正在描述的是 CKB 的这次提交:https://github.com/nervosnetwork/ckb/commit/a02c675c50c5969a588fa7f6356f08861d8f5f92。
概 述

这张图中有很多内容,我们将在稍后的文章中再次提到此图。今天,我们将只关注 Cell 数据结构中的 2 个实体:lock 和 type。
pub struct CellOutput {pub capacity: Capacity,pub data: Bytes,pub lock: Script,#[serde(rename = "type")]pub type_: Option<Script>,}
从数据结构中我们可以看到 lock 和 type 共享相同的结构,稍后我们可以证明它们也是在同一个环境中执行的,它们之间的差异只是体现在几个小细节中:
lock 是必选项,而 type 是可选项我们首先从 type 脚本开始。
type 脚本
请注意,这里的名字只是一个幸运的意外,它与受欢迎的程语言无关(https://www.typescriptlang.org/)。
我们仔细思考一下,其实 CKB(或大多数基于 UTXO 的区块链)上的交易只会将一组 Cell(或 UTXO )转换为另一组 Cell。这其中最有趣的是这里的实际转换过程,这也是我们开始设计 CKB 验证模型的着手点:我们如何构建模型以更好地验证 Cell 转换?
type 脚本的用武之地就体现在这里:type 脚本用于验证 Cell 转换阶段的某些规则。这里的一些例子包括:
简而言之,type 脚本可以用于存储 Cell 转换中所需要的任何验证逻辑,结合 CKB 灵活的虚拟机,我相信它将能提供无限的开发潜能。
lock 脚本
type 脚本用于存储 Cell 的逻辑转换,但是还缺少一件事情:如何保护自己的 Cell 不受其他人的攻击呢?换句话说,在这个瞬息万变的世界里,我如何才能确保我的 token 永远属于我呢?
这就是为什么我们需要设计 lock 脚本的原因。只有当 lock 脚本能够成功执行时,才可以使用该 Cell。与 type 脚本不同,type 脚本是可选的,用户可以完全不填,而 lock 脚本总是需要被用于保护 Cell 的安全性。
通常,您会期望一个 lock 脚本包含一个签名验证,就像所有其他区块链所做的那样,当然除此之外,CKB 还将提供一些全新的解锁用例:
在我看来,CKB 最好的一点就是,社区创建的 lock 脚本与官方默认脚本的处理方式完全相同,官方脚本没有任何特权。与其他一些区块链项目不同,CKB 为社区开发 CKB 脚本提供了完全的自由。
运行模型
现在让我们看看是什么时候执行 lock 和 type 脚本的。
回到之前的例子
这是我们之前看到的交易:

图中的执行流程如
在后面的文章中,我们可以看到 lock 和 type 脚本都在相同的环境中执行,并且都可以访问整个交易。如果任何一个脚本失败,整个交易就会失败。只有当所有脚本都成功时,交易才被认为是有效的。
有几点值得一提:
现在我们总结一下规则:
What's Next
现在我们已经介绍了 Cell 模型,下一篇文章中我们将介绍如何实际编写 CKB-VM 脚本,我们将通过验证默认的 secp256k1 lock 脚本,来演示 CKB-VM 脚本的使用周期。
预告:
这是 CKB 脚本编程简介第一弹,接下来,我们还会持续更新该系列文章。同时,公众号「Nervos 中文社区」将陆续推出系列技术内容,如果你想知道 CKB 中的基本数据结构,如果你想了解 CKB 新的哈希算法,如果你想学习更多区块链所面临的问题和解决方案,记得关注我们公众号哦,我们将持续输出新的认知,和大家一起探索区块链的无限可能!