五一劳动节,讲讲NEO智能合约的调试
作者:李剑英
原文链接:https://www.cnblogs.com/crazylights/p/8962202.html
之前我们说过NEO智能合约的调试问题,过去了一段时间,有很多东西都发生了比较大的变化。让我们重新再来探讨一下这个话题。
先说日期,2018年4月27日,马上迎来劳动节。
以后可能还会再次谈论这个话题。
然后明确几个问题,把一些经常纠结的地方先说清楚
如果你连neo同步区块还没搞明白,先不要凑智能合约开发这个热闹。
我们只讨论C#开发智能合约的调试问题,其它的暂无工具开发计划。
NEO官方没有智能合约调试工具,所以我们的工具是有很多定制的成分。
为什么要调试
一次编码,按下f5,一切正常,挥一挥衣袖就潇洒的离开,那是传说。
当代码执行不符合预期时,我们需要深入分析问题,需要更精细的观测手段。
而NEO官方并没有提供这样的工具,于是我们开发了一揽子工具用于解决调试问题
他们是:
NeonDebug 替换的c#智能合约编译器
NeoGUI-NEL 定制版NeoGUI 或者 NeoCli-NEl 定制版的NeoCli
NeonDebugGUI,智能合约执行情况观测工具
为了3的正常运行,1 2 都是必须的,如果你想知道为什么,源码可以告诉你答案
https://github.com/NewEconoLab/neondebug
https://github.com/NewEconoLab/neo-gui-nel
合约的编译
你可曾听过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的那个了,他记录字节码地址和源代码地址的映射关系
生成在这个路径也是有意义的,调试查看工具会直接来这个路径找合约,以前需要用调试查看工具再打开一次合约,现在不用了,直接用同一个路径。
合约的调用
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都要看一眼。
合约的调试
编译,启动NeonDebugGUI
略,他也在NeonDebug仓库中
使用Load 打开对应的llvmhex.txt文件即可调试
这两个load,一个是打开一个对话框,一个是输入txid自己去找,结果都一样。
功能介绍
打开调试LOG以后
图中红黄蓝部分先注意一下
红色部分最重要,首先观察合约执行状态 halt break 为vm正常停机,程序正常走到结束。
Fault break为vm异常停机,你可以直接反着从最下边看看到底怎么了。
红色部分为整个VM内Dump下来的执行流程,也就是整个智能合约的过程到底干了什么,从红色部分选择最上面一项,然后用键盘的方向键下,往下挪,先完整的看几个合约,可以建立一些基本的感觉。
黄色部分为智能合约源码,当红色部分选中条目变化时,如果能找到对应的源码,黄色部分就会跳转高亮。
通常最主要的调试观测方法就是选红色、看黄色。
然后蓝色部分收集了所有syscall,因为neoVM的虚拟机自身是纯计算,所有对链产生影响或者和链互访的功能都是通过syscall进行的,看一个合约有哪些syscall就能快速了解这个合约的行为,当然这需要建立在熟悉的基础上,只要多看,就能熟悉。
调试小提示
红色部分最重要
选中条目时,执行栈显示的这条指令执行之后的状态。
比如
Equal指令是==表达式,他显示的false只能告诉你是不想等,要看是谁和谁比较,往前倒退一条指令
倒退后观测计算栈,valuetool 会帮助你显示这个数据可能是什么
是多条虚拟机指令对应一条cs源码,并且有些是对应不到的。
记住这一点,而不能只盯着源码,左边最重要,左边要选到关键的代码。
你要搞清楚那些最关键的指令,比如syscall appcall equal
这并不会有多复杂,知道找关键指令就会快很多。
一定要熟悉syscall
最重要的storage.put 就是一个syscall
五一劳动节,讲讲NEO智能合约的调试相关推荐
- NEO智能合约黑盒测试框架
最近在做NNS合约测试工具,目标是简单好用,适用非技术人员测试,同时开发快捷,实现快速.再写完后,发现这不就是一个NEO智能合约黑盒测试框架吗嘛,所以写个文章分享给大家. 选择的代码平台是C#,显示和 ...
- NEO智能合约开发(一)不可能完成的任务
悬赏任务 兹有如下合约 public static object Main(string method, object[] args) { if (Runtime.Trigger == Trigger ...
- NEO智能合约反编译工具
2019独角兽企业重金招聘Python工程师标准>>> 0x00 前言 下拉最后看演示效果.项目地址 本来这应该是一个很和谐的感恩节假期,本来我可以很悠闲的写完所有作业然后随便看点论 ...
- EOS 智能合约如何调试?
为了能够调试智能合约,需要配置本地节点.这个本地节点可以作为单独的私有链或公有链的扩展来运行.这个本地节点还需要运行在合约控制台选项上,或者通过命令行 加参数--contracts-console,或 ...
- 四十种 智能合约 支持平台
目录 1. 以太坊( Ethereum ) 2. Quorum 3. Wanchain 4. æternity 5. Zen 6. Counterparty 7. Rootstock (RSK) 8. ...
- EOS智能合约开发(四)EOS智能合约部署及调试(附编程示例)
EOS的智能合约里面有一个action(动作)和transaction(交易)的概念. 对于我们开发以太坊开发者来说,基本上只有transaction的概念.如果我只要执行一种操作,而且是只读操作,就 ...
- 在线 Beosin EOS-IDE 免费版本同时支持智能合约在线编辑、编译、运行调试、部署
Beosin EOS-IDE 是一款免费的面向EOS区块链平台的智能合约在线集成开发环境,可同时支持合约开发.部署.测试和源码调试等功能的在线区块链应用开发集成环境. Beosin EOS-IDE产品 ...
- Beosin成都链安发布在线EOS-IDE免费版本 EOS智能合约在线编辑、编译、运行调试、部署一步到位...
Beosin EOS-IDE产品链接: https://beosin.com/EOS-IDE/index.html#/ (推荐Chrome浏览器) 每一个区块链开发的程序员都需要一个界面友好,操作方便 ...
- 以太坊系列 - 智能合约开发与调试
本文默认智能合约所需要的相关环境Geth.Truffle.Solidity.Ganache等都是完备的! 主要介绍: Remix IDE环境如何与指定的链进行连接: 编译 部署与调试智能合约 使用 z ...
- eos智能合约的编写和调试
编译环境 在<EOS环境搭建>中已经编译并且安装了智能合约的编译工具链 合约调试 nodeos配置 调试合约最好在本地搭建一个Nodeos测试节点,运行nodeos时,加入--contra ...
最新文章
- Android判断当前的android设备是否处于联网状态
- 自定义的GridView控件源代码
- 自适应xib比代码frame布局更优秀
- 关于eclipse不编译项目的问题解决
- 杭电Problem 1872 稳定排序
- PHP中,json汉字编码
- 这款刷爆抖音的玩意儿,竟然是程序员的福音!
- 【源代码】Image Deformation Using Moving Least Squares算法的实现
- 最详细Python批量字典暴力破解zip密码
- 在Qt工程中调用GmSSL
- 百度地图开发(安卓)
- Azure School女神相邀,把每分钟都过的更充实
- 最新的物联网10大深度技术,主要包括哪些技术?
- 软件项目管理大作业:项目内容介绍
- Metasploit -- 各类密码破解
- Go语言操作sqllite
- 疯狂脑机接口计划:马斯克的 “读心术”
- 服务器规范名字与IP地址的转换
- 1967年图灵奖--莫里斯·威尔克斯生平
- Idea构建异常---Could not parse metadata xx/xx/maven-metadata-local.xml-删除文件解决不掉---SpringCloud工作笔记176
热门文章
- CSS峰会圆桌论道丨共享产业数字化升级中的安全探索
- 淘客该怎么做,淘客+又是什么
- Android显示raw格式,手机上怎么处理RAW格式?有何不同?
- iphone不支持webp图片格式处理方案
- 哈哈,用FlexGrid做开发,轻松处理百万级表格数据
- 360 vs QQ 有意思的大战
- unity shader中关于Tags的整理
- storyBoard配置错误导致崩溃 superview]: unrecognized selector...
- 东北工学院 计算机 姚岚,东北的大学最强十校,工科是真强,2所211大学无缘前十...
- 吴恩达反向传播算法推导,吴恩达卷积神经网络ppt