我们这篇文章通过分析NEO的虚拟机原理,来了解下智能合约的技术实现原理。其实智能合约的雏形就是比特币交易中的验证脚本。只不过比特币只提供了有限的指令,是非图灵完备的,所以功能有限。
大家也知道以太坊的智能合约是运行在以太坊的虚拟机(EVM)中,还专门发明了运行在EVM上的语言(solidity),而NEO是可以直接用C#,JAVA来编写的。在NEO中虚拟机我们称作AVM。
现在我们就看下面这张图:
这张图整体描述了智能合约的工作原理,这张图包括三部分内容:
1,智能合约编译器(Compiler)
2, 虚拟机执行和计算引擎(AVM)
3, 虚拟机的互操作层(interop Service)
其中智能合约编译器就是我们编写智能合约的地方,现在NEO支持C#,JAVA。这部分的功能就是要将我们用C#写的程序翻译成虚拟机可以认识并执行的操作码(OPCODE)。
neo提供了编译器项目源码:https://github.com/neo-project/neo-compiler。是C#写的,原理就是将C#的中间语言MSIL通过Mono.Ceill转换成Neo虚拟机的字节码。请看下图
我们简单解释下上面的流程:
1,我们编写的C#合约被VisualStudo 编译成中间语言 MSIL
2,通过Mono.ceil将msil翻译并解释为我们的操作指令码。(关于Mono,大家可以百度下),Mono可以读取和修改MSIL。十分强大 。最后生成我们的虚拟机可以执行的文件.avm.
3,在虚拟机中,每个操作指令对应着对栈里的数据的操作方法。如图中的NOP对应着opNop。这样就可以实现基于堆栈的有限状态机的逻辑处理。
编译器部分就解释到这里。我们现在看虚拟机的实现原理,大家看第一张图,虚拟机部分分为:执行引擎(Execution Engine);计算栈(Evaluation Stack);互操作层(Interop Service)。
我们就简单将这三部分的功能做个说明:
Execution Engine:负责读取.avm文件或操作指令码,并根据操作指令(opCode)负责对栈数据的操作。
Evaluation Stack:存储和计算数据的结构,被执行引擎管理.
Interop Service: 互操作服务层,可以访问区块链帐本数据和外部数据的接口层.
所以这部分的逻辑就是:通过执行引擎加载指令序列码,并存储栈里,然后从栈顶取指令并根据指令一步一步执行对栈数据的操作。来完成相应的代码逻辑。代码里需要访问的数据是从互操作层提供的接口中访问的。
我的截图可能有点大,下载慢请大家耐心等待!呵呵。。
作者:区块链研习社比特币源码研读班,black