作者:李剑英

原文链接:https://www.cnblogs.com/crazylights/p/8962202.html

之前我们说过NEO智能合约的调试问题,过去了一段时间,有很多东西都发生了比较大的变化。让我们重新再来探讨一下这个话题。

先说日期,2018年4月27日,马上迎来劳动节。

以后可能还会再次谈论这个话题。

然后明确几个问题,把一些经常纠结的地方先说清楚

  1. 如果你连neo同步区块还没搞明白,先不要凑智能合约开发这个热闹。

  2. 我们只讨论C#开发智能合约的调试问题,其它的暂无工具开发计划。

  3. NEO官方没有智能合约调试工具,所以我们的工具是有很多定制的成分。

    1. 为什么要调试

一次编码,按下f5,一切正常,挥一挥衣袖就潇洒的离开,那是传说。

当代码执行不符合预期时,我们需要深入分析问题,需要更精细的观测手段。

而NEO官方并没有提供这样的工具,于是我们开发了一揽子工具用于解决调试问题

他们是:

  1. NeonDebug 替换的c#智能合约编译器

  2. NeoGUI-NEL 定制版NeoGUI 或者 NeoCli-NEl 定制版的NeoCli

  3. NeonDebugGUI,智能合约执行情况观测工具

为了3的正常运行,1 2 都是必须的,如果你想知道为什么,源码可以告诉你答案

https://github.com/NewEconoLab/neondebug

https://github.com/NewEconoLab/neo-gui-nel

  1. 合约的编译

你可曾听过NeoVM,AVM文件,就是智能合约编译生成的那东西,就是NeoVM的字节码,叫AVM是因为以前叫小蚁,ant的A,这个扩展名没一起改。

为了方便不那么了解虚拟机的开发者理解,我和C#的类库机制做一个对比。

这个AVM相当于是DLL,要调试一个c# DLL,你需要DLL PDB cs源码三部分内容。DLL存储字节码,PDB存储字节码地址和源码位置的映射,这样才能在断点时根据字节码执行位置定位到源码位置,而cs源码,就是为了让你调试时对照到代码

那么:

DLL-》AVM

PDB-》?

cs-》cs

标准的c#编译器neon.exe(如果不知道neon.exe,再好好补一下C#智能合约编译的相关资料),只生成了一个AVM和一个ABI文件,这个ABI是接口说明。

PDB对应的角色是空缺的

所以你需要 NEL 的 Neon.exe ,编译neondebug仓库的neondebug项目可以得到这个替换的neon.exe

设置环境变量,保证在任何路径可以执行neon

注意红框部分,有Debug字样

这个替换的编译器,就专门解决那个缺失的PDB问题,这个编译器和官方编译器代码随时同步更新,你直接使用这个替换的编译器就行,任何更新都会同步,不需要切换回官方编译器。

重启VS2017之后,来编译一个智能合约试试

注意红框部分,已经使用了我们的替换版本编译 有(debug)字样

下一行告诉你,在c:\neo\smartcontracts输出了些什么,让我们来看看。

首先原来的avm照样输出,这些是另外多输出的

文件名全部替换为了合约hash,avm还是那个avm

Abi.json还是那个abi

Cs是把智能合约源码copy 过来的,只支持一个智能合约项目有一个代码文件,所以不要分文件。

Map就是替代PDB的那个了,他记录字节码地址和源代码地址的映射关系

生成在这个路径也是有意义的,调试查看工具会直接来这个路径找合约,以前需要用调试查看工具再打开一次合约,现在不用了,直接用同一个路径。

  1. 合约的调用

A,用neogui 测试执行合约

用neogui-nel,测试执行一个合约,只有nel定制版支持。

试运行固定产生一个0x00 的log文件,看这个log就可以调试了,这个下一节再说,我们这里之说产生log文件的办法。

产生这个log是调试的唯一办法。

B 、用NEOCLI 测试执行合约

调用NEOCLI -NEL的 rpc invokescript 接口,会在返回值多返回一个fulllog字段,将其保存为文件,就是这个llvmhex文件,可以用来调试。

只有nel定制版支持

C、用NEOGUI发交易

用NEL定制版NEOGUI发起交易,只有nel定制版支持

发起交易,

会得到交易id同名的llvm文件

Id[0]

Id[1]

这种为鉴权合约的log

只有通过neogui nel定制版发起交易 或者 neocli nel定制版的 rpc接口 sendraw发起交易

才会产生鉴权合约的log,才可以调试鉴权合约,其他只调试应用合约

D、通过NEOCLI的sendraw RPC 发起交易

只有nel定制版支持

会得到交易id同名的llvm文件

Id[0]

Id[1]

这种为鉴权合约的log

E、通过其他方式产生的交易

由于交易会同步给每一个节点,定制的neo-gui-nel,和neo-gui-cli

可以得到所有的交易,无论是谁产生的。

但是做智能合约的调试的LOG是很耗时的,所以他并不总是打开的,有一个开关去控制他

这个开关在config.json里面

NEOGUI-nel的设置为true,表示只生成这个GUI自己发起的交易的LOG

打开这个同步就会变得非常慢,调试的时候再用。

NEOGUI-nel不修改这个config 也可以打开生成任何人发起的交易的开关

这里按一下让他显示为=false,然后之后同步的每一笔交易都会生成调试LOG了

这个只在内存修改,每次打开neo-gui都要看一眼。

  1. 合约的调试

编译,启动NeonDebugGUI

略,他也在NeonDebug仓库中

使用Load 打开对应的llvmhex.txt文件即可调试

这两个load,一个是打开一个对话框,一个是输入txid自己去找,结果都一样。

功能介绍

打开调试LOG以后

图中红黄蓝部分先注意一下

红色部分最重要,首先观察合约执行状态 halt break 为vm正常停机,程序正常走到结束。

Fault break为vm异常停机,你可以直接反着从最下边看看到底怎么了。

红色部分为整个VM内Dump下来的执行流程,也就是整个智能合约的过程到底干了什么,从红色部分选择最上面一项,然后用键盘的方向键下,往下挪,先完整的看几个合约,可以建立一些基本的感觉。

黄色部分为智能合约源码,当红色部分选中条目变化时,如果能找到对应的源码,黄色部分就会跳转高亮。

通常最主要的调试观测方法就是选红色、看黄色。

然后蓝色部分收集了所有syscall,因为neoVM的虚拟机自身是纯计算,所有对链产生影响或者和链互访的功能都是通过syscall进行的,看一个合约有哪些syscall就能快速了解这个合约的行为,当然这需要建立在熟悉的基础上,只要多看,就能熟悉。

调试小提示

  1. 红色部分最重要

  2. 选中条目时,执行栈显示的这条指令执行之后的状态。

比如

Equal指令是==表达式,他显示的false只能告诉你是不想等,要看是谁和谁比较,往前倒退一条指令

倒退后观测计算栈,valuetool 会帮助你显示这个数据可能是什么

  1. 是多条虚拟机指令对应一条cs源码,并且有些是对应不到的。

记住这一点,而不能只盯着源码,左边最重要,左边要选到关键的代码。

你要搞清楚那些最关键的指令,比如syscall appcall equal

这并不会有多复杂,知道找关键指令就会快很多。

  1. 一定要熟悉syscall

最重要的storage.put 就是一个syscall

五一劳动节,讲讲NEO智能合约的调试相关推荐

  1. NEO智能合约黑盒测试框架

    最近在做NNS合约测试工具,目标是简单好用,适用非技术人员测试,同时开发快捷,实现快速.再写完后,发现这不就是一个NEO智能合约黑盒测试框架吗嘛,所以写个文章分享给大家. 选择的代码平台是C#,显示和 ...

  2. NEO智能合约开发(一)不可能完成的任务

    悬赏任务 兹有如下合约 public static object Main(string method, object[] args) { if (Runtime.Trigger == Trigger ...

  3. NEO智能合约反编译工具

    2019独角兽企业重金招聘Python工程师标准>>> 0x00 前言 下拉最后看演示效果.项目地址 本来这应该是一个很和谐的感恩节假期,本来我可以很悠闲的写完所有作业然后随便看点论 ...

  4. EOS 智能合约如何调试?

    为了能够调试智能合约,需要配置本地节点.这个本地节点可以作为单独的私有链或公有链的扩展来运行.这个本地节点还需要运行在合约控制台选项上,或者通过命令行 加参数--contracts-console,或 ...

  5. 四十种 智能合约 支持平台

    目录 1. 以太坊( Ethereum ) 2. Quorum 3. Wanchain 4. æternity 5. Zen 6. Counterparty 7. Rootstock (RSK) 8. ...

  6. EOS智能合约开发(四)EOS智能合约部署及调试(附编程示例)

    EOS的智能合约里面有一个action(动作)和transaction(交易)的概念. 对于我们开发以太坊开发者来说,基本上只有transaction的概念.如果我只要执行一种操作,而且是只读操作,就 ...

  7. 在线 Beosin EOS-IDE 免费版本同时支持智能合约在线编辑、编译、运行调试、部署

    Beosin EOS-IDE 是一款免费的面向EOS区块链平台的智能合约在线集成开发环境,可同时支持合约开发.部署.测试和源码调试等功能的在线区块链应用开发集成环境. Beosin EOS-IDE产品 ...

  8. Beosin成都链安发布在线EOS-IDE免费版本 EOS智能合约在线编辑、编译、运行调试、部署一步到位...

    Beosin EOS-IDE产品链接: https://beosin.com/EOS-IDE/index.html#/ (推荐Chrome浏览器) 每一个区块链开发的程序员都需要一个界面友好,操作方便 ...

  9. 以太坊系列 - 智能合约开发与调试

    本文默认智能合约所需要的相关环境Geth.Truffle.Solidity.Ganache等都是完备的! 主要介绍: Remix IDE环境如何与指定的链进行连接: 编译 部署与调试智能合约 使用 z ...

  10. eos智能合约的编写和调试

    编译环境 在<EOS环境搭建>中已经编译并且安装了智能合约的编译工具链 合约调试 nodeos配置 调试合约最好在本地搭建一个Nodeos测试节点,运行nodeos时,加入--contra ...

最新文章

  1. Android判断当前的android设备是否处于联网状态
  2. 自定义的GridView控件源代码
  3. 自适应xib比代码frame布局更优秀
  4. 关于eclipse不编译项目的问题解决
  5. 杭电Problem 1872 稳定排序
  6. PHP中,json汉字编码
  7. 这款刷爆抖音的玩意儿,竟然是程序员的福音!
  8. 【源代码】Image Deformation Using Moving Least Squares算法的实现
  9. 最详细Python批量字典暴力破解zip密码
  10. 在Qt工程中调用GmSSL
  11. 百度地图开发(安卓)
  12. Azure School女神相邀,把每分钟都过的更充实
  13. 最新的物联网10大深度技术,主要包括哪些技术?
  14. 软件项目管理大作业:项目内容介绍
  15. Metasploit -- 各类密码破解
  16. Go语言操作sqllite
  17. 疯狂脑机接口计划:马斯克的 “读心术”
  18. 服务器规范名字与IP地址的转换
  19. 1967年图灵奖--莫里斯·威尔克斯生平
  20. Idea构建异常---Could not parse metadata xx/xx/maven-metadata-local.xml-删除文件解决不掉---SpringCloud工作笔记176

热门文章

  1. CSS峰会圆桌论道丨共享产业数字化升级中的安全探索
  2. 淘客该怎么做,淘客+又是什么
  3. Android显示raw格式,手机上怎么处理RAW格式?有何不同?
  4. iphone不支持webp图片格式处理方案
  5. 哈哈,用FlexGrid做开发,轻松处理百万级表格数据
  6. 360 vs QQ 有意思的大战
  7. unity shader中关于Tags的整理
  8. storyBoard配置错误导致崩溃 superview]: unrecognized selector...
  9. 东北工学院 计算机 姚岚,东北的大学最强十校,工科是真强,2所211大学无缘前十...
  10. 吴恩达反向传播算法推导,吴恩达卷积神经网络ppt