和你說說除錯 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 codeshttps://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 和 GDB1. Install ckb-standalone-debugger 安裝 ckb-standalone-debuggergit clone https://github.com/nervosnetwork/ckb-standalone-debugger
cd ckb-standalone-debugger/binscargo build --release2. Start standalone debugger 啟動 ckb-standalone-debuggerckb-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.json3. 啟動 GDB
docker run --rm -it -v pwd:/code nervos/ckb-riscv-gnu-toolchain:bionic-20191012 bash# start gdbriscv64-unknown-elf-gdb <path of script binary># connect to debugger servertarget 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,我們會為您的寶貴貢獻提供豐厚獎勵!

免責聲明:

  1. 本文版權歸原作者所有,僅代表作者本人觀點,不代表鏈報觀點或立場。
  2. 如發現文章、圖片等侵權行爲,侵權責任將由作者本人承擔。
  3. 鏈報僅提供相關項目信息,不構成任何投資建議

推荐阅读

;