NEO-智能合约JAVA c#环境

— NEO教程真的坑啊 —


前言

DAPP要迁移到NEO…找了整整两天资料真的是想死,教程几乎是没有的,用户是很少的,文档是没有的,有也是老外写的,哎….

看着官网教程弄的,但是有诸多坑


neo-compiler -> neoj

编译生成用于把.class变为虚拟机字节码的neoj

坑1

  • 对照官网教程,发布配置没有netcoreapp2.0选项,没有部署模式选项
  • 编译结果没有.exe

neoj项目 右键属性 -> 改为目标框架 .NET Core 2.0 输出类型 windows 应用程序

bug3.png

坑2

编译生成的neoj.exe win7 下报错

bug1.png

发布配置中可以改为win7*64

bug2.png

最终OK

bug4.png


neo-devpack-java -> jar包

java合约编写 与 neoj 需要使用的jar包

由于我是迁移了neoj.exe的位置,所以按照官网导出会显示找不到文件

bug5.png

我把 \neoj\bin\Release\PublishOutput(就是有neoj.exe的文件) 放到了别的地方 重命名为neoj文件夹

这里需要将 neo-devpack-java 中的 org.neo.smartcontract.framework 包 导出的 org.neo.smartcontract.framework.jar 放在neoj文件夹目录下就可以解决问题。

虽然我觉得官网教程中的 jar包在\neoj\bin\Release\netcoreapp1.1\win10-x64\publish\ ,neoj.exe在\neoj\bin\Release\PublishOutput,neoj.exe也是找不到会报错的,但是懒得去试了,总之都丢到一个文件夹下,neoj才是真正可以用了


创建项目引入包

坑1

创建一个neo合约项目,需要引入包之前编译的jar包,被官网教程各种误导
官网截图的引入包很奇怪,根本不是上面编译生成的org.neo.smartcontract.framework.jar而是一个neo-contract.jar的文件

我感觉是有问题的,也没管那么多,引入放在neoj.exe同目录下的org.neo.smartcontract.framework.jar

按照官网教程的代码,编译转化,成功

bug6.png

坑2

但是后来发现当需要引入其他包的文件时,就会出错。比如neo.runtime等等

这些函数并不在org.neo.smartcontract.framework里面,而在neo-devpack-java项目的其他包中。

解决办法:

  • 直接在neo-devpack-java项目内新建一个自己的包,直接引用其他包,就不需要编译了。
  • 导出neo-devpack-java所有其他包变为一个jar(现在知道那个neo-contract.jar是哪来的,就是这一个包,但是竟然没有说明啊啊啊),jar导入到新创建的neo合约项目,就可以使用了

小结

  • 导出 org.neo.smartcontract.framework 程序包,只是为了给 neoj 使用
  • java内的编写合约引用包,需要neo-devpack-java所有包
  • 合约写完编译后成.java后,再用neoj转化为.avm,再用neo-gui发布

如此才是真正的环境弄完了。。。

但是….也并没有用java写…因为java例子太少了…哎…入坑c#也许更轻松…


c#环境

本以为java弄好了挺好的,但是事实是java智能合约例子只有一个
官网API也是.net下c#的,教程也是c#的,就让人很头疼。

决定再三,还是去学一点c#,根据c#的例子来写智能合约

c# 的环境其实在经历过java环境搭建过后没有大坑。根据官网的也是比较详细的,根据它来就可以

但是在编译 c#例子 的时候,两个需要触发事件的智能合约例子出了问题。

问题截图忘保存了,大致就是找不到一个叫mscorlib.dll的文件

但是,dll文件是生成了,编译是成功的,但是neon xxx.dll的时候出现了以上问题

ps.当配置完环境后,c#开发智能合约利用官网的插件,是会在vs2017内直接编译成.dll文件,再调用neon命令直接转化为avm文件

在自己尝试后,发现只要把生成的几个dll文件(一般是两个,一个自己的xxx.dll,一个Neo.SmartContract.Framework.dll),移动到neon文件夹的目录下用命令./neno.exe xxx.dll,就可以成功转换

就是目录下找不到一些所用的文件,但是此处只把mscorlib.dll的文件拷贝到xxx.dll同目录下也是不行的。可能他还依赖其他一些文件。找到替代方法,也没有继续研究了。