和你说说调试 CKB 脚本的几个技巧

CKB 中的脚本不一定只是我们在脚本语言中看到的脚本,例如 Ruby,JS,它实际上是指在 CKB VM 上运行的 RISC-V 格式二进制文件。CKB VM 模拟 RISC-V 指令集,与其他 VM 通过 opcode 硬编码功能非常不同。考虑到 CKB VM 的通用特性,每种编程语言和工具链都有一些不同。在这篇本章中,CKB 开发者 jjy 将和大家介绍调试 CKB 脚本的几个技巧,快来查看吧。

请注意:尽管 CKB 的编程模型现在非常稳定,但目前仍然在进行开发,因此可能会有变化。

错误码

CKB 节点仅在交易验证失败时报告 exit code,区分错误最直接的方法是使用不同的 exit code(-127 和 127 之间)来表示错误。

例如,默认的 lock script error code:secp256k1 error codes


https://github.com/nervosnetwork/ckb-system-scripts/wiki/Error-codes

注意:常见的错误是混淆了lock script 错误和 type script 错误。简单的调试方法是删除 type script,然后重新运行;如果错误仍然存在,可以确定错误是由 lock script 引起的;否则,它是由 type script 引起的。

调试 syscall

当我们想要从脚本中输出额外的信息时,采用 debug syscall 来完成此需求。


默认情况下,CKB节点不输出调试 syscall 消息,可以配置 ckb.toml 来启用它。

[logger]


filter = info,ckb-script=debug

还可以选择在调试环境下运行脚本:ckb-cli, VM debugger, ckb-contract-tool。


对于语言 / 工具链实现人员,如果开发语言支持,建议您集成 debug syscall 来打印错误向后追踪。例如:如果将 Rust 与 ckb-contract-std 一起使用,您可以看到程序崩溃的位置。

用 ckb-cli 生成 mock tx 和验证

ckb-cli 支持在调试环境下生成模拟 tx 和验证,步骤如下:

1. 生成 mock-tx 模板

ckb-cli mock-tx template –lock-arg <your lock-arg> –output-file debug-tx.json

2. 修改模板

将你的 script cell 添加到 cell_deps 中,并修改交易结构以使用 lock script 或 type script。

3. 实现模板

ckb-cli mock-tx complete –tx-file debug-tx.json

此命令根据 lock arg 使用私钥签名交易。

4. 验证交易

ckb-cli mock-tx verify –tx-file debug-tx.json

你将看到验证结果和调试输出。

另外关于如何构建交易可参考 RFC:CKB 的交易结构

使用 VM debugger 和 GDB

1. Install ckb-standalone-debugger 安装 ckb-standalone-debugger

git clone https://github.com/nervosnetwork/ckb-standalone-debugger


cd ckb-standalone-debugger/bins


cargo build –release

2. Start standalone debugger 启动 ckb-standalone-debugger

ckb-standalone-debugger 支持 ckb-cli 生成的模板。要调试一个脚本,我们用 -g <script type> 来指代 script group 类型,这表示我们想要调试哪个 script group,使用引用的 -h <script hash>。

ckb-debugger -l 0.0.0.0:2000 -g type -h <type script hash> -t debug-tx.json

3. 启动 GDB





docker run –rm -it -v pwd:/code nervos/ckb-riscv-gnu-toolchain:bionic-20191012 bash


# start gdb


riscv64-unknown-elf-gdb <path of script binary>


# connect to debugger server


target remote <ip>:2000

若想了解更多,请参考 CKB 开发者 Xuejie 的文章:CKB 脚本编程简介第一弹: 验证模型

关于提交 bug

当您在脚本中发现与安全相关的 bug 时,请不要将其发布在 github public issue。请在 ckb dev telegram(https://t.me/nervos_ckb_dev) 联系维护人员,这不仅有助于维护人员更新,也可以防止用户损失资金。

当您在 CKB 官方 script 或 CKB VM 中发现与安全相关的 bug 时,欢迎加入我们的 bug bounty program,我们会为您的宝贵贡献提供丰厚奖励!


关键词: CKB  脚本  

该内容来自于互联网公开内容,非区块链原创内容,如若转载,请注明出处:https://htzkw.com/archives/28227

联系我们

aliyinhang@gmail.com