Hi 游客

更多精彩,请登录!

比特池塘 区块链前沿 正文

开发NEO智能合约的工作流程

枪手本色戮
71 0 0
摘要:开发NEO智能合约的典型开发流程有两个实际阶段:编码(在IDE中编码并将源码编译为.avm文件)以及测试(在测试网上部署、调用、检查结果)。这个工作流需要编译和部署来调试任何代码的变更。在NEO社区开发的一些最新工具集的帮助下,出现了四步流程法,从而进一步加快了开发效率。1 X+ S9 A& Z4 }" J  }  O
在本教程中,我们将首先简要地讨论一下标准的两步流程法,并提供一些有用的参考资料,然后介绍四步流程法以及相关的新开发的工具。除非另有说明,否则讨论时使用C#作为智能合约开发语言。- \% z: w' b7 O; t  Q3 _
在本教程中,我很有可能会犯错误或者遗漏一些要点,非常感谢您的评论。& X& V. Z% h( f$ d1 V2 l
两步流程法6 c) J* l( S) a0 Y* s, F% }
传统上来说,NEO智能合约开发有两步开发流程:编码和测试。这篇官方的教程提供了关于这个工作流程的详细信息。
( z! |9 E% c, L. d  [" a2 b& @在编码阶段,NEO官方支持C#(示例)。我们也可以使用Java和Python开发智能合约。你可以轻松的在Google和YouTube上找到教程和示例代码页,以了解如何编写NEO智能合约。2 A( S( V3 ?- ]; T8 y( q
( n- h. m; j* E( \( Q, \" J: \, ]8 K  v
我们依赖于测试网来进行测试工作。如上图所示,对于测试网,我们有很多选择。
" {( x: q1 K1 R& L公共测试网络3 X) m, g: W& ~$ h& Z6 h
最常见的方法是使用公共的测试网络。NEO智能经济、CoZ和NEL分别维护了三个主要的公共测试网络。Alex Guba的教程详细阐述了如何在NEO和CoZ测试网络上进行测试之前,同步区块并申请GAS,不过NEL的测试网络对支持本地化的中国开发者更加友好。
7 ~  S( X$ [$ p& N在大多数情况下,你可以通过NEO API(完整引用)运行RPC调用来与区块链进行交互。部分APIs只有当你运行了一个具有开放钱包的NEO.CLI节点时,才可使用。但是如果NEO.Scan赋予了测试网权限,则可以在不运行节点的情况下调用类似的服务。例如,API getBalance需要一个正在运行的节点,但是你可以使用Neo-Scan提供的get_balance接口来获得类似的功能。我建立了一个Postman集合来帮助测试这些远程调用。你只需更改测试网络(或Neo-Scan)的值即可使用它。
9 F! M, ~# X4 }! {- M% |5 bNeoCompile Eco有一个新的特殊的公共测试网络,这激发了我们转向四步工作流程的灵感。我们将在下一节详细讨论它。
) B" l) A. V' [# S" _私人测试网络
8 q7 q! B$ {7 {4 \/ F- P* B另一个好的方法是建立你自己的私人测试网络。与公共测试网络相比,私人测试网络的优势在于你可以获得完全的控制权。使用私人测试网络的第一个原因是,它真的非常有用,也很鼓舞人心,因为它会让人产生钱包中持有数百万的NEO和GAS的错觉。与此同时,与公共测试网络相比,我们不需要担心链再生,连接失败,或者因为其他开发者错误导致的网络拥堵。1 U3 Q# }1 s) S3 o
NEO官网提供了一个在云服务器上设置私人网络的逐步指南。不过查看了我在Azure上的账单后,我不建议你这么做,除非你不得不和其他人共享链数据。Neo-privatenet-docker非常适合在本地计算机上构建私人的测试网络,同时可以帮你节省大量配置和执行指令的时间。如果你在笔记本电脑上运行它,它还能帮助你在加拿大的冬天保持你的体温。
; b1 Z$ ]1 i# q9 n- v" P两步流程法的局限性5 L+ A) l5 R) Z5 b5 W: K, V7 Y
这个两步工作流程法已经成熟,并且被大多数现有的项目所采用。然而,与传统的软件项目相比,它仍有一些局限性。主要的一点是调试的代价非常高昂,要监视变量的运行时值,最好的选择是使用运行时通知,如以下代码段所示:
! H5 Y; l/ d, a5 \* t) V`byte[] ba0 = CallSomeFunction();/ J: ]4 ^1 U' u  e% m0 _- H- v7 K
byte[] ba1 = CallAnotherFunction();
1 x1 j* S/ w( V8 C8 m//Print out the value of ba0 and ba1 to ApplicationhLog
! \0 E+ V* M$ }Runtime.Notify(ba0, ba1);`  f3 R5 i3 N& Z( N
我们需要使用neon重新编译项目,确保有足够的GAS并进行重新部署,使用正确的格式组成适当的参数,然后调用它,并等待20-30秒的时间等待下一个区块的出现,调用API getapplicationlog来获取JSON格式的日志,使用pretty format格式打印响应的内容来查找日志值(查看以下示例中高亮的部分)。日志值通常表示为字节数组,因此我们需要将它们转换为字符串或者大整数类型…总共7个步骤。) _4 y2 j% u3 M8 g  I6 w! `0 u
[   {     "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"                   }                 ]               }             }           ]         }       ]     }   } ]
9 H; I- @/ [# p0 N- o# A官方文档中有介绍单元测试的章节,但是其中的示例仍然需要提前编译和/或部署.avm文件。/ a; P1 O3 `& @+ o( ]5 v! A8 B& t
当我们在开发基于NEO的区块链游戏CarryBattle时,我的团队norchain.io强烈地感受到了这种限制。在社区的帮助下,我们开始尝试4阶段工作流程,这大大提高了开发效率。7 R. R3 \; Z. [+ h0 z2 \4 E9 u' [
四步流程法
/ O6 C5 h! A# x3 r. `! e0 R- E, T这个工作流程的四个阶段是:编辑、调试、私人测试以及Beta测试。主要的想法是:
- s4 _. U- u& x" X- A利用一些新工具将编码阶段拆分成编码阶段和调试阶段。在调试阶段,我们尽可能多地跳过或运行本地测试案例,就像传统软件项目那样,而不与区块链进行交互。将测试阶段拆分为私人测试和Beta测试,分别使用privateNet / NeoCompiler Eco进行私人测试以及公共测试网络进行beta测试。 使用这种方法,我们以最小的代价确保最大程度上的灵活性和兼容性。
- S, P1 I. k( f$ b+ t
$ f  }6 M/ o. x. u/ X) Y
& S% n# R( Q/ Y9 K9 J7 B6 D四步工作流程法开发NEO智能合约(C#)
$ a# h3 a3 Z3 O9 y+ w+ j, \1 G对于编辑和调试阶段,我建议使用两种方法:Neo-Debugger和Neunity。; j$ T9 Q% p# t# X- v8 L
Neo-Debugger( _1 I. |7 P4 U" R
Neo-Debugger的项目是由Relfos公司开发的。使用特殊版本的Neon和调试json文件,你可以编写调用级别的测试用例,并在IDE中逐步运行源代码,跟踪GAS使用情况和应用程序日志,而无需与区块链交互。Neo-Debugger的另一个不错的功能是,它可以在检查堆栈时跳过OpCode(操作码)。Nikolaj- k制作过一个针对Neo-Debugger的视频教程。
% w, S& y, p; Y  aFabio也用类似的想法做了一个不错的项目SCTracker,但是当他知道Neo-Debugger的存在的时候,他决定跳过这个项目。但还是要感谢他的贡献。
# k- o0 l! j9 ^. ~  T3 @, gNeunity.Adapter
. N2 V7 k( m) |+ x! H& a4 QNeo-Debugger在NeoVM级别的调试方面做得很好,但是它仍然有一些局限性。例如,它还不支持变量监视、断点或功能级别的测试用例。0 Q' o- M! S9 z' N
由Norchain.io创建的框架Neunity的Adapter层正在采用了不同的本地调试方式。 Neunity.Adapter的思路是:3 S1 G. O! j( [; A( `+ g  _  ^
引入适配器层来隔离NeoVM和普通.Net项目之间的差异。 我们有两个适配器Neunity.Adapter.NEO和Neunity.Adapter.Unity,它们具有相同的方法签名的集合,同时具有不同的命名空间和实现。 它们分别用于NEO智能合约和Unity项目(实际上也适用于许多其他.Net项目)。 这些方法大多数都与类型转换,运算符或系统调用模拟有关。然后我们可以在适配器层上编写应用层逻辑。 显然,通过简单地更改命名空间,这个应用层逻辑可以被智能合约或普通的.Net项目使用。现在我们可以使用功能级别测试驱动开发(TDD),甚至可以与C#Dapp客户端共享逻辑。
5 G2 h- X6 N. i3 F我制作了一个视频教程来演示如何使用Neunity.Adapter来执行功能级别的TDD,执行测试步骤,同时监视变量和调用堆栈。
6 \  h5 P" N$ w& f
, b/ Z8 @, p/ W5 {1 P* Z+ j2 K% u  ~" R! v- q7 u' Y2 X9 S) C
与下表相比,我们可以相应看到Neo-Debugger和Neunity.Adapter的优势。根据我们的经验,Neo-Debugger更适合小规模项目,因为它不消耗GAS,而Neunity.Adapter更适合较大规模或更复杂的项目,因为它更好地支持TDD,多类,断点,变量跟踪等。/ B. h* H. {; ^

+ T  b, E, F) U6 P( JNeunity的设计实践了大规模软件的项目方法学(我指的是系统逻辑的规模,并不意味着单个调用必须复杂或者昂贵的)。通过适配器层的使用迈出了缩小.Net开发者和NEO开发者之间差距的重要的一步。与此同时,Neunity还提供了一个Neunity.Tools层,它具有灵活的序列化工具(NuSD),类HTTP的通信协议(NuTP),类URI的存储管理器(NuIO)等。我们希望能够助力更多的NEO区块链Dapps的落地。$ D( f- |. E4 a/ {% u: H- [2 B
私人测试
+ k4 ?9 z2 L; J$ ~+ a- I! o1 f通过迭代编码和调试阶段完成逻辑后,我们可以转到私人测试阶段并开始与区块链进行交互。我们建议使用私人测试网络或NeoCompiler Eco进行私人测试,因为它们的环境简单且易于交互和管理。
0 t, R1 l4 R4 fNeoResearch公司开发的NeoCompiler Eco公共测试网络是新的、特殊的。它不需要使用GAS,同时提供了一整套基于Web的GUI工具,包括编译,导入OpCode,部署,调用,交易,转换等.NeoResearch最近还集成了gitter.im用于即时聊天,以便更好地与开发者沟通。 Igor有一个很好的教程来介绍它的基本功能。/ ~: N3 j$ e4 E1 I/ D
这个测试网络的另一个优点是,区块生成的时间间隔是5-7秒,几乎比正常情况快5倍。它缩短了等待时间,几乎不会出现开发者在同一个区块发生调用冲突的情况,这使得测试几乎与私人测试网络一样简单。这就是为什么我们建议将其视为私人测试选项的原因。
* ^( R2 _; ^6 |  X7 _$ \, h- ]9 O! JBeta测试1 ~# @0 u2 Y$ A& e# v. r: p( J7 ]" J
如果成功完成了在私人测试阶段的所有功能测试,我们就可以进入最后的一个阶段,之后就可上线Dapp。 公共测试网络是最适合于Beta测试的地方,因为它类似于主网环境。 另一个好处是你还可以邀请你的朋友来帮忙测试。 你的智能合约还要能沉着地面对来自并行调用、潜在盲区或者无效输入等的挑战。
+ v$ G% p$ o9 |9 i$ n4 S6 m$ d% e4 n总结  G8 ?" a5 c6 w8 n9 y( M( Q
与许多其他公有链项目相比,NEO具有许多优势:诸如高交易速度,相对友好的开发语言(C#,Python),国际化且活跃的社区氛围。. d$ P  E% f5 P# R3 t2 n
改进开发工作流程有助于提高NEO的语言优势,同时可以将出色的想法与有生命力的项目相结合,而无需花费太多时间来解决琐碎的问题。
3 w. W5 a7 Y* L7 e; n本人知识有限,希望本教程可以给大家提供些许帮助。感谢Fabio和Relfos对本教程提供的帮助。 欢迎任何建议和意见。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

枪手本色戮 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    11