在过去,NEL发布了neon_debug_gui调试工具,用来进行neo上的智能合约调试。现在,我们发布了它的online版本——NeoRay,一个将智能合约的编译、部署、调用、调试集成起来的超级工具。
如果你已经熟悉了我们以前的调试工具和流程,那么你可以绕过这篇文章直接使用这个在线调试工具
https://neoray.nel.group/
1
为什么我们要做它?
我们之前做了类似的调试工具,但后来我们发现这些工具对于新手而言还是过于复杂,他们需要学习额外的配置、使用流程,包括了解合约调试的实现原理。因此我们做了一套流水线式的调试工具,能够辅助开发者们从合约代码快速进入调试流程。更棒的是,它不需要你去配置环境,只需要打开网页就能使用。并且整个工具都是在线的,这意味着当你遇到难以解决的问题时,可以请他人来帮你看看问题出在了哪里。
2
它有什么功能?
这套调试工具由一个钱包、一个简易的代码编译器、以及一个交易结果解析器组成,接入的是NEO的测试网。我们将调试工具主要分为三个部分:合约编译部署、合约调用、合约调试。每个部分都被放在一个页面中。
合约编译部署
在合约编译部署页面,有两个功能:编译合约代码和将编译通过的合约代码部署到链上。
我们的在线编译器可以将C#语言的合约代码编译成可部署上链的AVM文件,但是当代码存在语法错误时无法通过编译。我们建议您在visual studio中先写好代码,确保没有语法错误后再粘贴到网页上进行编译。
您也可以通过合约hash载入我们服务器上已保存的合约代码或直接载入自己曾部署过的合约代码。需要注意的是,我们会将通过调试工具部署的合约代码都保存在服务器中,以便进行合约调试。任何人都可以通过hash访问到合约源码。因此使用本工具意味着您的代码会被开源。
合约编译通过后就可以直接部署到链上。你需要填写一些合约信息,这些信息和neogui上的相同。这些信息会在你再次打开合约代码时显示出来。等待合约部署交易被链上确认后就可以使用交易调用合约了。
您可以在操作记录里看到合约部署交易的确认状态,并在交易被确认后对合约进行调用。
合约调用
在合约调用页面中,有两个功能:试运行合约和调用合约。在这之前,你需要填入目标合约hash。
试运行合约和调用合约都需要填入交易参数。交易参数包括你需要调用合约中的哪个函数及其需要给它传的参数。具体的的填参方法我们会由专门的说明文档,点击帮助就可以查看。
“试运行”不需要发交易,不会更改链上数据,即时返回结果,但无法执行鉴权操作,一般用于查询合约中的数据。而想要调试合约就需要使用“调用交易”,发一笔交易来调用合约,以查看合约在真实环境下是怎么被执行的。
合约调试
当你调试合约时,其实你是在调试某个合约在某一次交易时的执行情况。因此你需要交易被确认后,才可以进行调试。需要注意的是,只有在我们的调试工具里调用使用我们调试工具部署的合约的交易才能被调试,因为调试需要的数据需要提前被收录,而收录数据的操作需要调试工具发起。
你需要先填入(或选择)一个交易ID,才能查询它的执行数据。
调试前查看一下log/notify数据,如果数据正确则合约运行正常,没有必要调试。如果出现错误则需要通过点击AVM查看合约运行步骤的方式调试合约。
在AVM列你会看到节点执行合约时的每一步操作,右侧区域是这些操作所对应的代码,左侧是对应的内存堆栈数据。通过移动AVM的光标,代码和堆栈数据都会变化。整个调试过程类似于我们调试程序时在代码上打断点,不同的是在这里每一步操作都会被打断点,你可以清楚地看到节点内部的执行逻辑和状态。
堆栈里的数据都是16进制的字节码,人类是无法直接阅读的,左下角的Value tool可以帮你把堆栈中的数据流转换成字符串、数字或地址。
3
我该如何使用?
第一步,你得有一个NEO的钱包。如果没有,可以在我们的登录页创建一个新钱包。
确保你的钱包里有足够的测试网gas(一般发一个合约需要500gas)。你可以在我们的调试工具里申请测试网络的gas。每个钱包每天可以申请500gas,需要更多gas的话只能在我们的开发者论坛里留言获取。
第二步,你需要将智能合约代码输入调试工具,点击编译代码将代码编译为可部署上链的avm。
如果出现编译失败,那应该是代码语法不正确或缺少了必要的引用,会显示下图的提示。这里暂时无法提示明确的错误行数。
第三步,将编译通过的合约代码部署到网络中,等待交易被确认。
第四步,选择一个你已经部署的合约或者直接输入合约hash来调用其他人的合约。
然后填入调用参数,点击调用交易发一笔调用该合约的交易。这笔交易可能会涉及到多个合约的互相调用,要保证所有的合约必须是使用调试工具部署的,否则调试时会看不到代码。如果只是为了查询合约存储的值直接试运行即可。
第五步,选择一个你已经发出的交易进行调试或者直接输入交易TXID来调试这笔交易。在屏幕最中间你可以看到AVM、Careinfo和log/notify。
第六步,查看log/notify信息,查看完整的合约执行结果。如果交易返回的数据与预期的不一致,返回AVM查找问题。
第七步,点击AVM,查看对应合约代码和堆栈数据。
AVM那是虚拟机在执行合约时进行的每一步操作。这个看不懂没关系,在AVM中点击单个步骤可以查看对应代码和堆栈数据,然后点击AVM后使用↑↓箭头移动光标可以看到代码是怎样被一行一行执行的。如果合约执行是有问题的,那么最后的执行步骤就会返回错误,又或者你会发现代码执行顺序或堆栈数据与你的设计不一致。
通过观察这些执行状态,你就可以完成自己的合约调试,然后回到起点,修改代码,重发合约、进行调试,直到它与你的设计完全吻合。
网友评论