如何在 CKB Studio 中构造合约和使用 cell_deps 调用 cell

如果你已经知道怎么在交易里说 Hello world 了(不知道的看这篇翻译
你们可以来看看怎么用上 cell deps 来调用有智能合约的 cell,并构造一笔新的交易

忘了说,cell_deps 是一个能够让你调用先前合约的一个 cell ,按造 RFC 19 : 数据结构 里头的话, Cell deps 是:

一个 outpoint 数组,指向此转账依赖的 cells。 只有 live 的 cells 才可以列在这里。这里列出的 cells 是 只可读取(read-only) 的。

他会在构造交易的时候和你的 cell input 以及 cell output 等等这些 cell 一起呈现在交易中,并且透过 type script 的 code hash 去引用先前 cell 中的数据,让 input / output 能执行 cell deps 的脚本 。因此你就不需要自己在你的 cell 中,再写一次前人的合约逻辑在你的 cell 中了,也可以省去一些不必要的空间使用;同时对于 dapp 开发者而言也是一个可以供人调用合约的方式。

1.首先假设你已经把本地的开发链打开了,如下图


可以注意到的地方是,在 “Start”的绿色按钮边有一个选项是 Start without miner,其实你编译合约的时候是可以先用这个选项的,可以省去不必要的挖矿成本(电和存储空间),发送交易的时候再打开就好。

2.另外,你必须还必须在链上有内含合约的 live cell 可以引用啊!!!
因此我们必须先创建一笔交易,并在里面存一段逻辑

那要写什么合约呢?
这个时候 CKB Studio 贴心的地方就来了

看到下图左上角的「小人像」了吧


在这里点击一下 My project

他会跳出一些目前已经写好的合约在 template 中,例如现在有 Carrot / sUDT / JavaScript 的简易合约等等(许愿:希望以后有更多),这次我们选择 carrot 合约做为范例,然后选好路径,按下 「Create Project」(记得资料夹里面不能不能有其他东西)

之后他就会跳进来,你可以看到 carrot 的合约内容

这是个简单的 carrot合约,代码就是你看到的这几行,大致的意思就是说
当今天读取到的 data 中的字是“ carrot ”会返回 -1,表示合约执行失败,反之,如果不是“carrot”,那么就会显示正确,返回 0。

但你今天看到的这个代码是你看的懂的,机器其实看不懂,因此我们要把他写成二进制的方式,这时候你可以看到左上角有个锤子:hammer: (Build)的符号,点下去他会帮你编译合约,生成二进制的文件。
长相如下(对的,就是这个上面有 corrot.o的档案)

接着可以打开交易构造器了
首先点开左下角的钥匙,复制地址到这个灰色的栏位中(请确保这个地址是你之前挖矿的地址)
下方就会显示出目前你有多少 cell 了 (empty cell 表示里面都还没有任何人为添增脚本的 cell )。


3.把 carrot 合约装到某个 cell 之中
这时候我们必须要把我们创建的 carrot 合约放到某个 cell 中了,所以我们这时候必须要

  • 构造一个有 “carrot” 合约的 cell

  • 发送

所以这时我来点击在左下角的 +New Cell 绿色按钮,他会问我要在 cell 的 type script 中放入什么样的数据,我选择了 File,并且索引了“carrot.o”的二进制文件,此刻他会显示出我们需要 “10709” Capicity,因为 CKB Studio 已经帮你算好了,我们需要 10709 bytes 才能容纳这份 carrot 合约。


现在好像已经更新了 ,当你按下 Preview之后,系统会自动帮你拿出一些 empty cell 作为输入,所以这时候你只要按下右边的紫色按钮“Push Transaction”就好了。

这时后只要交易成功发送了,会像上图一样显示绿色的 Transaction Pushed 字样。这时候在下方的 Live Cell 中,关掉“Show empty cell ”多按几次 “Load more”,就可以找到你部署合约的 cell。


点击一下这个 Cell,会显示出他的内容,你可以看的出来他就是里面含有 carrot 合约的 Cell ,和一般的 empty cell 是如此的不同,如此的耀眼~

这时候你可以按一下右上角有一个垃圾桶的 icon,对就是上面写着 clear 的,他会把你上一笔构造交易的版面清掉。
然后这时你就能够开启下个交易,把含有 “carrot”的 合约的 cell 拖到 Deps 那个栏位中,作为新交易的 Cell deps。


这时候我们可以点击右边 Outputs 旁边的 +New 绿色按钮,他可以让我们生成 output cell

这里要记得把 type script 中 Deps 的 code hash 选起来( CKB Studio 会自动把指向 Deps 栏位中的 Cell 的 code hash 准备好),他可以让这个 type script 透过 code hash 指向在 Deps 栏位中的 Cell 。我们这时候可以在 data 中填入 carrot。并且按下“Confirm”,然后推送交易。

你会发现他呈现“Failed”,因为“验证失败”。那我们现在来看看这个验证失败,到底是不是因为我们在 “Data” 中填写了 “”carrot“,所以我们这次试着点击“Data“,改一下data的字,把它改成 ”carro“

然后发送交易

可以发现这次成功了!!!!! :ghost: :ghost:

这时候我们再来回顾,确实在 carrot 的合约中,他写了

if (memcmp(buffer, "carrot", 6) == 0) {
      ckb_debug("Error: Data string starts from 'carrot'"); //只要你的Data 字符串是 “Carrot“,就返回 -1 表示错误
      return -1;
    }

这时候我们就能够确定我们已经成功的引用了 carrot 合约在我们的交易中了。

以后你可以试着想想其他好玩的合约,并且让其他人透过 Cell Deps 的方式来调用你的合约,作为验证的规则,那么很多的 Dapps 就有机会跑起来啰。

然后你也可以在这个过程中发现 IDE 帮你做了好多事情,你只要专心在你想要构造的交易内容就好。

2 Likes