智能合约与NEO(2)之初见合约

naoye 10月前 427

这波我们不啰嗦,直接干:

首先分两个,先讲怎么部署环境(简单说下,因为NEO官网资料很多),再重点分析实现流程和机制。


生产环境篇:

官网传送门:NEO 智能合约

  1. Win10 x64 + VS2017 + .net core 1.0 或2.0

  2. 插件NeoContractPlugin

关键步骤 step.1:

下载:neo-project/neo-compiler

并将neon发布出来,当然为了奖赏你看我的blog,我为win10 x64的玩家编译好了一份

传送门: NEON

关键步骤 step.2:

添加环境变量,具体到neon.exe的根目录

然后重新打开Cmd,撸命令,直到出现下面为止,不然就是错的,根据官网慢慢折腾~


关键步骤 step.3:

安装插件:NeoContractPlugin


关键步骤 step.4:



关键步骤 step.5:

i).创建好项目,修改main里面的函数体,进行你的第一次智能合约编程

ii).默认项目应该是报错的,所以需要你手动build一下 直到log框出现下面的提示

iii).avm文件就是你的合约文件了,具体怎么用参考官网

ps:就是在钱包里发布一下,你发给谁,谁就要帮你执行这个合约(这个是收费的哦)




自此,我们的环境部署就讲到这里,官网资料多,现在我们来点高级的,好好研究下neo的流程:

智能合约一顿分析猛虎如篇

经过一顿操作猛如虎,一看不造生成啥。

让我们来简单看看刚才是做了啥:

1.编译出出neon.exe

2.用插件创建好工程

3.build工程

这时候,就有好奇同学问:为啥buid一下就能生成.avm文件啊,平时我就是生成avi dll啊?

我:这位同学问题提的很好

首先我们打开最后新建工程的.csproj看看~

<ItemGroup>
    <Content Include="Neo.ConvertTask.dll" />
  </ItemGroup>
  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
  <Import Project="Build.tasks" />
  <Target Name="AfterBuild">
    <Message Text="Start NeoContract converter, Source File: $(TargetPath)" Importance="high">
    </Message>
    <ConvertTask DataSource="$(TargetPath)" />
  </Target>

不用找了,答案就在最后一行:

  1. 注意省题,他先在After build之后 (此时你的dll已经生成完毕),输出了一行 message“start *******”

  2. 紧接着新建Convert Task对象 成员变量赋值 = targetpath,也就是你生成dll的路径街

接下来我们看看这个ConvertTask 是个什么东东:

再项目里面找到Neo.ConvertTask.dll,然后反编译出代码。里面就一个类,我就直接贴上来了:




聪明的同学可能已经发现了:


其实就是调用了 neon的cli啊,然后把dll路径传进去了,

其实你自己执行这个也一样能生成.avm。

绕了一圈,又回来了...


好吧 ,我们接着找Neon工程!!!!!!


NEON篇

翻出几行核心代码:





就这两玩意,生成了.avm~

为了让小伙伴,进一步看里面做了啥,我作了一个死摁了下F12

...

...

...

...

好了,此篇结束~









那是不可能的~


因为里面都是一些编译类的服务,我就简单梳理下流程:

1.首先mod.loadMoudle 是做了一个简单的筛选,把所有需要进行解析的函数提取出来,只能导出C#的static函数

2. 然后conv.Convert(mod),再次进行剔除,

i)筛选出是否继承智能合约的类SmartContract

ii)将事件参数等,转换成neovm类型, 保存函数签名(返回值,形参),并且生成了neovm的操作指令

iii)拼接,并找到主入口函数

iv)最后am.buid() 将之前生成的neocode,转化成byte并保存本地~


打完收工,虽然机智的我大概能明白这些设计,剩下机智的你呢?是不是发现了点什么?


总结下:

钱包文件抛开钱包的金融属性不说,就是包含了一个neovm的虚拟机,.avm就是将cs代码转化成neovm所需要的指令的文件。

紧接着这就够了么?

不,离我们智能抓小黄...哦不..是福利图,还远着呢?


比如我生成的智能合约代码,里面引用了一个第三方库,难道第三方库也要运行在vm环境里面么?如果这个第三方库是C++写的呢?

从此看来,这个vm只能实现一些同类型简单逻辑层的处理,然后调用一些钱包提供的接口。

这样看来离我们抓福利图的合约计划,貌似又远了一步!!

话说回来,这套东西,是不是像极了我们游戏的代码热更?


路漫漫其修远兮,今天的智能合约吹逼,就到此结束了~


作者:B道友


最后于 9月前 被naoye编辑 ,原因:
最新回复 (0)
全部楼主
返回