CKB 脚本编程简介第五弹:调试-lol2020全球总决赛下注首页

泡沫雕刻机 | 2021-03-31

实际上,CKB脚本的工作水平远远低于其他智能合同,因此CKB调试过程非常令人费解。本文将向您展示如何调试CKB脚本。找不到,但调试CKB脚本与日常调试程序没有太大区别。

这篇文章写在ckb v0.23.0上面。明确的,每个项目使用的commit版本是CKB 33607 E 2 AD 2 ED 6718360587 F 3762163229 ECC D2 CF 10 CK B-SDK-Ruby 336018 A 89D 8 C 69e 173 AD 59 Ce 3 BF 79B 5d 173我想告诉你是否可以使用GDB调试C程序。答案是肯定的!你同意可以通过GDB调试用C写的CKB脚本!首先,以上一句# include memory . h # include ' ckb _ syscalls . h ' intmain(intargc)中使用的carrot为例:Size _ t index=0;uint 64 _ t len=0;unsigned char buffer[6];while(1){ len=6;meset(缓冲区,0,6);Ret=ckb _ load _ cell _ data (buffer,len,0,index,ckb _ source _ output);if(ret==ckb _ index _ out _ of _ bound){ break;} intcmp=memcmp (buffer,' carrot ',6);IF(CMP){ return-1;}索引;} return 0;这里有两个变化。首先修改了此脚本,使其与ckb v0.23.0兼容。

在此版本中,您可以使用ckb_load_cell_data提供cell的数据。您可以在此代码中重新添加小错误,以便以后启动调试工作流。

如果你熟悉C,你可能已经注意到了。当然,如果你不介意的话,你几乎不需要担心。几天后我会解释的。

(大卫亚设,Northern Exposure(美国电视电视剧),骄傲)一整天,我用官方toolchain编译成RISC-V代码。$ ls carrot . c $ gitclone https://github.com/nervos network/CK B- system-scrom $ ls carrot . c Ckb _ consts . h Ckb \(大卫亚设,Northern Exposure(美国电视剧),现在把剧本分发给CKB吧。

使CKB节点保持运行状态,并使用Ruby SDK:Pry(Main)Api=CKB 33603360 Api . new Pry(main)wallet=CKB 33603360启动wallet Your Private Key ')from _ hex (API,Ckb 33603360 key . random _ private _ key)pry(main)Carrot _ data=file . read()Carrot _ type _ script=ckb 33603360 types 33603360 script . new(code _ hash 3360 Carrot _ data _ hash)aapry(main)tx=wallet . generate _ tx(wallet 2 .Use _ dep _ group3360 false,Fee 3360 5000)pry(main)tx . outputs[0]。type=carrot _ type _ script pry(main)Tx . cell Tx=Tx . sign(公事包)。键,API.com pute _ transaction _ hash(tx)pry(main)API . send _ transaction(tx)ckb 33603333但是我们运营后仍然检查完毕。这意味着我们的剧本不能有bug。

lol2020全球总决赛下注

以前没有别的办法。为了找到错误的地方,可能需要回去确认代码。

(大卫亚设,Northern Exposure),但是现在不合适。可以跳过这里的交易,输出到独立国家的CKB调试器开始调试!首先,将此交易与使用环境一起导出到名为pry(main)ckb 33603360 mocktransactiondumper . new(API)的本地文件中。Tx)。

write(“carrot . JSON”)其中需要跟踪carrot类型脚本的散列。pry(main)carrot _ type _ script.compute字符,CK b-standalone-debugger:$ gitclone 3359 github.com/./target/版本/CK B- de bugger-l 0 . 0 . 033602000-g type-h0x 039 C2 FB A64F 389575 CDEC FF 8173882 B 97be 5 F8 D3 BDB 2BB 0770$ sudo docker run-RM-it-v ` pwd ` :/code nervos/CK B- riscv-GNU-to 3360/# CD/codethere is no warranty To the extent permitted by law . type ' show copying ' and ' show warranty ' for details . this gdb was configured asType ' show configuration ' for configuration details . for bug reporting instructions,Please see : find the gdb manual and othertype ' apropos word ' to search for commands related to ' word '.reading symbols from carrot.(Target remote 192 . 168 . 1 . 23033602000 remote debugging using 192 . 168 . 1 . 230336020000 x 00000000000 C6 in _; 现在是罕见的GDB调试过程(GDB)B Main Breakpoint 1 At0x 106 B 03360 File Carrot。C,6号线。(GDB) C Continuing。

可以尝试Breakpoint。(GDB)N 7 uint 64 _ t Len=0;(GDB)N11 LEN=6;(gdb) n12 memset(buffer,0,6);(gdb)n 13 ret=ckb _ load _ cell _ data(buffer,len,0,index,ckb _ source _ output)buffer的第一个字节值为0。这与C不同,所以buffer和carrot是不同的。

条件if (cap) {函数不调用下一个循环,返回true,返回-1,表示carrot和给定的。经常出现这种问题的原因是,如果两个buffers较大,memcmp就不会返回到0,如果不是很大,就会返回到非零值。但是,没有测试memcmp的返回值。

如果不是0,则必须在if条件下使用。这样,C不会将任何非零值视为true。其中返回的-99不被识别为true。对初学者来说,这是一个典型的错误,不会在C遇到,我希望你会犯这样的错误。

)现在,错误的原因、网络桌面报纸网、下一步,修改karoot脚本的错误是非常简单的。但是如您所见,我们可以在CKB上提供操作时错误交易的状态,然后通过GDB(业界罕见的工具)进行调试。此外,GDB中现有的工作流和工具也可以在此使用。是不是很有趣?基于REPL的研发/调试,但GDB是现代软件开发的一部分。

动态语言具有相当大的优势,很多程序员都在基于REPL的开发/调试工作流中使用。这与编译语言的GDB几乎不同。基本上需要操作环境。

您可以输出想要与环境交互的代码,以获得不同的结果。正如这里展示的那样,CKB不会反对这种类型的研发/调试工作流。

lol2020全球总决赛下注首页

p将在ckb-duktape上展示基于JavaScript的REPL。但是,请注意,这只是demo展示工作流,没有什么能阻止Ruby、Rython、Lisp等将自己喜欢的动态语言复制到CKB,并为该语言启动REPL。首先,让我们使用编译器duktape:$ git clone 3359 github.com/nervos network/CK B- duktape $ CD CK B- duktape $ sudo dockerrun-RM-it-v ' pwd ' 3360/CKDduktape . c-c-o build/duktape . oris cv64-unknown-elf-gcc build/entry . o build/duktape;-static-fdata-sections-ffunction-sections-wl、-GC-sections-wl、-Sri scv64-unknown与Carrot的示例一样,duktape REPL的二进制文件将放置在CKB的: Pry(main)API=CKB 33603360 APi . new Pry(main)Wallet=CKB中from _ hex (API,Ckb 33603360 key . random _ private _ key)pry(main)Duktape _ repl _ data=fiit FEE : 310000)Duktape _ repl _ data _ hash=CKB 33603360 Blake 2b . hex digest(Duktape)Duktape 我用在很简单的脚本中。当然,通过重新添加更好的数据,可以在CKB上播放PRY(Main)TX=Wallet . gg:CKB 33603360 Utils . byte _ to _ Shannon(100),use _ dep _type=duktape _ repl _ type _ script pry(main)=' 0 x ',然后导出到文档中,duktape类型脚本的散列:prywrite(' Duktape . JSON ')=2765824 pry(主要)Duktape _ repl _ type _ script.compute _ hash='0xa 824./target/release/CK B- debugger-g type-h0xa 8b 79392 c 857 e 29 CB 283 e 452 f 2 CD 48a 8 e 06 c 51 af 64 be 175 e 0 Fe 0如果发生一定程度的错误,请更改类型脚本的散列或正确的duktt Duk print(1 2)3=undefined Duk function foo(a){ return a1;}=undefinedduk foo(123)=124 CKB相关功能也可以使用。

Duk var hash=ckb . load _ script _ hash()=undefined DD { returnarray . prototype . map . call(new uint 8 array)Join(' ');}=undefined Duk buf 2 hex(hash)=A8 b 79392 c 857 e 29 CB 283 e 452 f 2 CD 48 a 8 e 06 c 51 af 64 be 175 e 0 Fe 0 e 2902 c 482837这里获得的脚本散列是目前正在进行的脚本散列,这是CKB系统调试在这里有效你可以尝试更有趣的东西。Duk print(ckb . source . output)2=undefined Duk print(ckb.cell . capacity)0=unded ckb . source . output,ckb . cell十进制数正好是100000000。另外,CKB使用容量的单位是shannons,因此1000000000正好是100字节。这就是我们分解上述交易时想发送的令牌数!现在看到了在duktape环境下和CKB无聊地玩的方法。

)总而言之,我们已经说明了CKB调试的两个过程。可以任意使用其中一个(或两者)。我想看你们在CKB开花,已经迫不及待了!|lol2020全球总决赛下注首页。

本文来源:lol2020全球总决赛下注首页-www.game3117.com