摘要:开发NEO智能合约的典型开发流程有两个实际阶段:编码(在IDE中编码并将源码编译为.avm文件)以及测试(在测试网上部署、调用、检查结果)。这个工做流须要编译和部署来调试任何代码的变动。在NEO社区开发的一些最新工具集的帮助下,出现了四步流程法,从而进一步加快了开发效率。git
在本教程中,咱们将首先简要地讨论一下标准的两步流程法,并提供一些有用的参考资料,而后介绍四步流程法以及相关的新开发的工具。除非另有说明,不然讨论时使用C#做为智能合约开发语言。docker
在本教程中,我颇有可能会犯错误或者遗漏一些要点,很是感谢您的评论。json
传统上来讲,NEO智能合约开发有两步开发流程:编码和测试。这篇官方的教程提供了关于这个工做流程的详细信息。数组
在编码阶段,NEO官方支持C#(示例)。咱们也可使用Java和Python开发智能合约。你能够轻松的在Google和YouTube上找到教程和示例代码页,以了解如何编写NEO智能合约。服务器
咱们依赖于测试网来进行测试工做。如上图所示,对于测试网,咱们有不少选择。网络
公共测试网络app
最多见的方法是使用公共的测试网络。NEO智能经济、CoZ和NEL分别维护了三个主要的公共测试网络。Alex Guba的教程详细阐述了如何在NEO和CoZ测试网络上进行测试以前,同步区块并申请GAS,不过NEL的测试网络对支持本地化的中国开发者更加友好。框架
在大多数状况下,你能够经过NEO API(完整引用)运行RPC调用来与区块链进行交互。部分APIs只有当你运行了一个具备开放钱包的NEO.CLI节点时,才可以使用。可是若是NEO.Scan赋予了测试网权限,则能够在不运行节点的状况下调用相似的服务。例如,API getBalance须要一个正在运行的节点,可是你可使用Neo-Scan提供的get_balance接口来得到相似的功能。我创建了一个Postman集合来帮助测试这些远程调用。你只需更改测试网络(或Neo-Scan)的值便可使用它。工具
NeoCompile Eco有一个新的特殊的公共测试网络,这激发了咱们转向四步工做流程的灵感。咱们将在下一节详细讨论它。单元测试
私人测试网络
另外一个好的方法是创建你本身的私人测试网络。与公共测试网络相比,私人测试网络的优点在于你能够得到彻底的控制权。使用私人测试网络的第一个缘由是,它真的很是有用,也很鼓舞人心,由于它会让人产生钱包中持有数百万的NEO和GAS的错觉。与此同时,与公共测试网络相比,咱们不须要担忧链再生,链接失败,或者由于其余开发者错误致使的网络拥堵。
NEO官网提供了一个在云服务器上设置私人网络的逐步指南。不过查看了我在Azure上的帐单后,我不建议你这么作,除非你不得不和其余人共享链数据。Neo-privatenet-docker很是适合在本地计算机上构建私人的测试网络,同时能够帮你节省大量配置和执行指令的时间。若是你在笔记本电脑上运行它,它还能帮助你在加拿大的冬天保持你的体温。
两步流程法的局限性
这个两步工做流程法已经成熟,而且被大多数现有的项目所采用。然而,与传统的软件项目相比,它仍有一些局限性。主要的一点是调试的代价很是高昂,要监视变量的运行时值,最好的选择是使用运行时通知,如如下代码段所示:
byte[] ba0 = CallSomeFunction(); byte[] ba1 = CallAnotherFunction(); //Print out the value of ba0 and ba1 to ApplicationhLog Runtime.Notify(ba0, ba1);
咱们须要使用neon从新编译项目,确保有足够的GAS并进行从新部署,使用正确的格式组成适当的参数,而后调用它,并等待20-30秒的时间等待下一个区块的出现,调用API getapplicationlog来获取JSON格式的日志,使用pretty format格式打印响应的内容来查找日志值(查看如下示例中高亮的部分)。日志值一般表示为字节数组,所以咱们须要将它们转换为字符串或者大整数类型…总共7个步骤。
[ { "jsonrpc": "2.0", "id": 5, "result": { "txid": "0x7e3f08a8af4290693184b413ba1d58bede8462cb565baba8ffcc380bf947e317", "executions": [ { "trigger": "Application", "contract": "0x32682404d4313ecf80b70e1323ccf908a80fdfc0", "vmstate": "HALT, BREAK", "gas_consumed": "0.039", "stack": [], "notifications": [ { "contract": "0xaeccdcf6d7ecf827e7e6baec3c233eca08c27ee3", "state": { "type": "Array", "value": [ { "type": "ByteArray", "value": "010203" }, { "type": "ByteArray", "value": "04090d" } ] } } ] } ] } } ]
官方文档中有介绍单元测试的章节,可是其中的示例仍然须要提早编译和/或部署.avm文件。
当咱们在开发基于NEO的区块链游戏CarryBattle时,个人团队norchain.io强烈地感觉到了这种限制。在社区的帮助下,咱们开始尝试4阶段工做流程,这大大提升了开发效率。
这个工做流程的四个阶段是:编辑、调试、私人测试以及Beta测试。主要的想法是:
四步工做流程法开发NEO智能合约(C#)
对于编辑和调试阶段,我建议使用两种方法:Neo-Debugger和Neunity。
Neo-Debugger
Neo-Debugger的项目是由Relfos公司开发的。使用特殊版本的Neon和调试json文件,你能够编写调用级别的测试用例,并在IDE中逐步运行源代码,跟踪GAS使用状况和应用程序日志,而无需与区块链交互。Neo-Debugger的另外一个不错的功能是,它能够在检查堆栈时跳过OpCode(操做码)。Nikolaj- k制做过一个针对Neo-Debugger的视频教程。
Fabio也用相似的想法作了一个不错的项目SCTracker,可是当他知道Neo-Debugger的存在的时候,他决定跳过这个项目。但仍是要感谢他的贡献。
Neunity.Adapter
Neo-Debugger在NeoVM级别的调试方面作得很好,可是它仍然有一些局限性。例如,它还不支持变量监视、断点或功能级别的测试用例。
由Norchain.io建立的框架Neunity的Adapter层正在采用了不一样的本地调试方式。 Neunity.Adapter的思路是:
我制做了一个视频教程来演示如何使用Neunity.Adapter来执行功能级别的TDD,执行测试步骤,同时监视变量和调用堆栈。
与下表相比,咱们能够相应看到Neo-Debugger和Neunity.Adapter的优点。根据咱们的经验,Neo-Debugger更适合小规模项目,由于它不消耗GAS,而Neunity.Adapter更适合较大规模或更复杂的项目,由于它更好地支持TDD,多类,断点,变量跟踪等。
Neunity的设计实践了大规模软件的项目方法学(我指的是系统逻辑的规模,并不意味着单个调用必须复杂或者昂贵的)。经过适配器层的使用迈出了缩小.Net开发者和NEO开发者之间差距的重要的一步。与此同时,Neunity还提供了一个Neunity.Tools层,它具备灵活的序列化工具(NuSD),类HTTP的通讯协议(NuTP),类URI的存储管理器(NuIO)等。咱们但愿可以助力更多的NEO区块链Dapps的落地。
私人测试
经过迭代编码和调试阶段完成逻辑后,咱们能够转到私人测试阶段并开始与区块链进行交互。咱们建议使用私人测试网络或NeoCompiler Eco进行私人测试,由于它们的环境简单且易于交互和管理。
NeoResearch公司开发的NeoCompiler Eco公共测试网络是新的、特殊的。它不须要使用GAS,同时提供了一整套基于Web的GUI工具,包括编译,导入OpCode,部署,调用,交易,转换等.NeoResearch最近还集成了gitter.im用于即时聊天,以便更好地与开发者沟通。 Igor有一个很好的教程来介绍它的基本功能。
这个测试网络的另外一个优势是,区块生成的时间间隔是5-7秒,几乎比正常状况快5倍。它缩短了等待时间,几乎不会出现开发者在同一个区块发生调用冲突的状况,这使得测试几乎与私人测试网络同样简单。这就是为何咱们建议将其视为私人测试选项的缘由。
Beta测试
若是成功完成了在私人测试阶段的全部功能测试,咱们就能够进入最后的一个阶段,以后就可上线Dapp。 公共测试网络是最适合于Beta测试的地方,由于它相似于主网环境。 另外一个好处是你还能够邀请你的朋友来帮忙测试。 你的智能合约还要能沉着地面对来自并行调用、潜在盲区或者无效输入等的挑战。
与许多其余公有链项目相比,NEO具备许多优点:诸如高交易速度,相对友好的开发语言(C#,Python),国际化且活跃的社区氛围。
改进开发工做流程有助于提升NEO的语言优点,同时能够将出色的想法与有生命力的项目相结合,而无需花费太多时间来解决琐碎的问题。
本人知识有限,但愿本教程能够给你们提供些许帮助。感谢Fabio和Relfos对本教程提供的帮助。 欢迎任何建议和意见。
NEOFANS:neofans.org
NEOFANS 微博:https://www.weibo.com/neofans...
NEOFANS telegram群:https://t.me/NEOfansCN