x 是 ckb-vm 的核心开发者,他在自己的博客「lm」中,创作了一系列介绍 ckb 脚本编程的文章,用于补充白皮书中编写 ckb 脚本所需的所有缺失的细......在过去的十年间,阿蒂斯atis币官网战胜了很多的竞争对手,在摸爬滚打中奋勇前行,为客户打磨出很多的好产品。
x 是 ckb-vm 的核心开发者,他在自己的博客「lm」中,创作了一系列介绍 ckb 脚本编程的文章,用于补充白皮书中编写 ckb 脚本所需的所有缺失的细节实现。本文是该系列的第一篇,介绍了 ckb 的全新验证模型,据说这是 x 最后一篇没有实际代码示例的帖子,快来查收吧:p
截至目前,ckb 中的 c 验证模型或多或少已经趋于稳定,因此我将开始写一系列文章来介绍 ckb 脚本编程。我的目标是补充白皮书中编写 ckb 脚本所需的所有缺失的细节实现,这样您就可以开始探索 ckb 呈现的这个美丽的仙境。
您可能会注意到我将在 ckb 上运行的代码称为脚本,而不是智能合约。这是因为智能合约对我来说是一个令人困惑的术语,在这里,我想用另一个词来表示 ckb 独特的可编程性。ckb 中的脚本不一定只是我们在脚本语言中看到的脚本,例如 r,js,它实际上是指在 ckb-vm 上运行的 risc-v 格式的二进制文件。
这个系列的第一篇文章将专门介绍 ckb .. 中引入的全新验证模型(://////)。虽然这听起来很无聊,但我保证这是最后一篇没有实际示例的帖子:p
请注意,尽管我认为 ckb 的编程模型现在非常稳定,但目前仍然在开发过程中,因此可能会有变化。我会尽力确保更新这篇文章的内容,但如果您有感到困惑的话,那是因为这篇文章现在正在描述的是 ckb 的这次提交:://////。
概 述
这张图中有很多内容,我们将在稍后的文章中再次提到此图。今天,我们将只关注 c 数据结构中的个实体: 和 。
co {
: c,
: b,
: s,
#[( = "")]
_: o&;s&;,
}
从数据结构中我们可以看到和共享相同的结构,稍后我们可以证明它们也是在同一个环境中执行的,它们之间的差异只是体现在几个小细节中:
·是必选项,而是可选项
· 通常,他们被用于不同的场景
我们首先从脚本开始。
脚本
请注意,这里的名字只是一个幸运的意外,它与受欢迎的程语言无关(://.)。
我们仔细思考一下,其实 ckb(或大多数基于 utxo 的区块链)上的交易只会将一组 c(或 utxo )转换为另一组 c。这其中最有趣的是这里的实际转换过程,这也是我们开始设计 ckb 验证模型的着手点:我们如何构建模型以更好地验证 c 转换?
脚本的用武之地就体现在这里: 脚本用于验证 c 转换阶段的某些规则。这里的一些例子包括:
· 验证 udt(用户自定义的 t)余额以确保不会无效地发出新 t;
· 确保每一个可能发生变化的 c 都拥有一个独一无二的名字。注意一下,这是非常有趣的一点,未来的文章很多都将和这一话题息息相关,敬请期待。
· 实现经济模型结构。事实上,ndao 完全是作为一个脚本实现的,而不需要共识层的支持。
· 比特币的虚拟机可以编译成基于 risc-v 的二进制文件,这意味着可以将 ckb 转换成另一种替代比特币的实现。
· 请记住,除了数据之外,c 还可以用于存储代码,因此脚本也可以被用作对 c 中代码的测试,确保代码正确。
简而言之, 脚本可以用于存储 c 转换中所需要的任何验证逻辑,结合 ckb 灵活的虚拟机,我相信它将能提供无限的开发潜能。
脚本
脚本用于存储 c 的逻辑转换,但是还缺少一件事情:如何保护自己的 c 不受其他人的攻击呢?换句话说,在这个瞬息万变的世界里,我如何才能确保我的永远属于我呢?
这就是为什么我们需要设计脚本的原因。只有当脚本能够成功执行时,才可以使用该 c。与脚本不同, 脚本是可选的,用户可以完全不填,而脚本总是需要被用于保护 c 的安全性。
通常,您会期望一个脚本包含一个签名验证,就像所有其他区块链所做的那样,当然除此之外,ckb 还将提供一些全新的解锁用例:
· 实际的签名算法完全由脚本来决定,而您可以自由使用任何脚本。这意味着您可以自由地选择任何符合您需求的签名算法。在官方发行的 ckb 版本中,我们将作为默认的脚本(:////--////___.)。但您也可以不必使用它,如果有人用签名实现了一个脚本,那么我们非常欢迎您使用这个脚本。
· 除了签名验证之外, 脚本还可以包含其他用于解锁 c 的规则。比如,如果一笔交易包含了一个使用了我的脚本的 o c,但是它的容量大于我可以使用的 c,那么我可以通过配置我的脚本来进行容量传递。这样的话,当有人向我发送 ckb t 时,他们可以利用我现有的 c 来完成 ckb 转账,而不需要像比特币那样为我再重新创建一个新的 c。
在我看来,ckb 最好的一点就是,社区创建的脚本与官方默认脚本的处理方式完全相同,官方脚本没有任何特权。与其他一些区块链项目不同,ckb 为社区开发 ckb 脚本提供了完全的自由。
运行模型
现在让我们看看是什么时候执行和脚本的。
回到之前的例子
这是我们之前看到的交易:
图中的执行流程如下:
l s执行一次。
l s执行一次。
t s执行一次。
t s执行一次。
在后面的文章中,我们可以看到和脚本都在相同的环境中执行,并且都可以访问整个交易。如果任何一个脚本失败,整个交易就会失败。只有当所有脚本都成功时,交易才被认为是有效的。
有几点值得一提:
· 尽管这里有个带有 l s的 i c,但它只执行一次,由实际的脚本来定位具有相同脚本的所有 i c,并验证两个签名。
· 在这个交易中只执行 i c 中的脚本,例如:这里不执行 l s 。
· 即使 i c 和 o c 都包含 t s ,也只执行一次。
· 在 i 和 o c 中都会执行脚本,其中包括 t s和 t s 。
· 有些 c 没有脚本,在本例中我们只是省略了执行。
规则
现在我们总结一下规则:
· 在 i c 中的脚本会被收集和去重,每个单独的脚本会被执行一次,并且只执行一次。
· i 和 o c 中的脚本(如果存在的话)会被收集在一起并去重,每个单独的脚本都会被执行一次,并且只执行一次。
· 任何脚本失败,则整个交易验证失败。
w' n
现在我们已经介绍了 c 模型,下一篇文章中我们将介绍如何实际编写 ckb-vm 脚本,我们将通过验证默认的 脚本,来演示 ckb-vm 脚本的使用周期。