千家信息网

Neo虚拟机怎么实现

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,这篇"Neo虚拟机怎么实现"文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇"Neo虚拟机
千家信息网最后更新 2026年11月01日Neo虚拟机怎么实现

这篇"Neo虚拟机怎么实现"文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇"Neo虚拟机怎么实现"文章吧。

框架

虚拟机所处的位置

在框架图中,我们可以看出Virtual Machine有以下作用

  1. 读取Opcode(smart contract),在Execution Engine中执行

  2. Execution Engine可以进行逻辑运算

  3. Interop Service可以调用External Data

  4. 系统调用(OP_SYSCALL)可以访问区块链账本的信息

下面我们先看一下虚拟机如何读取Opcode。

VM对象关系

关键的几个对象

  1. Execution Engine:执行引擎

  2. Execution Context:执行上下文

  3. Stack Item:堆栈的一条数据

  4. Crypto:C#的加密库

执行引擎
  1. IScriptTable里面存贮了AppCall命令可以调用的其他contract的代码,这一块需要研究一下区块链的实现,这个以后再仔细研究。

  2. InteropService专门用来响应SYSCALL,具体有哪些是系统调用,用来干什么的,后面通过例子再来说明。

  3. InvocationStack是调用栈,传入参数,调用其他合约都会有一个新的调用栈

  4. EvaluationStack是计算栈,用来执行操作

  5. AltStack是备用栈,计算栈算出的中间结果可以保存在备用栈

执行上下文

每个变量都蛮好理解的,重点是下面看看怎么用的。

vm代码执行流程

  1. 构造,此时可以传入script container,script table,后面我们看看在区块链上这些都是从哪里来的,这里只专注于vm的执行流程,暂且不深究了。
    2.加载.avm,avm是编译器编译出来的一串数字,通过engine.LoadScript可以加载。

  2. execute开始执行, 下面看一下代码

   public void Execute()        {            State &= ~VMState.BREAK;            while (!State.HasFlag(VMState.HALT) && !State.HasFlag(VMState.FAULT) && !State.HasFlag(VMState.BREAK))                StepInto();        }
 public void StepInto()        {            if (InvocationStack.Count == 0) State |= VMState.HALT;            if (State.HasFlag(VMState.HALT) || State.HasFlag(VMState.FAULT)) return;            OpCode opcode = CurrentContext.InstructionPointer >= CurrentContext.Script.Length ? OpCode.RET : (OpCode)CurrentContext.OpReader.ReadByte();            try            {                ExecuteOp(opcode, CurrentContext);            }            catch            {                State |= VMState.FAULT;            }        }

看一下这行代码,OpCode opcode = CurrentContext.InstructionPointer >= CurrentContext.Script.Length ? OpCode.RET : (OpCode)CurrentContext.OpReader.ReadByte();

  1. 代码执行完了以后,插入OpCode.RET

  2. 如果不是RET,则read一个字节的opcode

ExecuteOp函数就是具体的执行OpCode的语义,我们通过一个例子来说明

具体的一个例子

还是上次的那个代码

using Neo.SmartContract.Framework;using Neo.SmartContract.Framework.Services.Neo;public class Sum : SmartContract{    public static int Main(int a, int b)    {        return a + b;    }}

测试虚拟机的代码

using System;using System.IO;using System.Linq;using Neo;using Neo.VM;using Neo.Cryptography;namespace ConsoleApplication1{    class Program    {        static void Main(string[] args)        {            var engine = new ExecutionEngine(null, Crypto.Default);            engine.LoadScript(File.ReadAllBytes(@"C:\……\Test1.avm"));             using (ScriptBuilder sb = new ScriptBuilder())            {                sb.EmitPush(4); // 对应形参 b                sb.EmitPush(3); // 对应形参 a                engine.LoadScript(sb.ToArray());            }            engine.Execute(); // 开始执行            var result = engine.EvaluationStack.Peek().GetBigInteger(); // 在这里设置返回值            Console.WriteLine($"执行结果 {result}");            Console.ReadLine();        }    }}

以上就是关于"Neo虚拟机怎么实现"这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注行业资讯频道。

代码 内容 例子 区块 上下 上下文 对象 就是 引擎 文章 框架 流程 知识 篇文章 系统 结果 形参 备用 研究 编译 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网科技公司简介 广州万易互联网科技有限公司 科技互联网产品 河南真二互联网科技有限公司 关于新基建和互联网科技 高科技与互联网 沃里互联网科技 互联网金融和金融科技 互联网科技公司做什么 深圳国际航运科技和互联网 重庆威客帮互联网科技 科技互联网大厂 移动互联网年度科技创新 天津腾达互联网科技有限公司 中和天地互联网科技有限公司 工业互联网山东科技大学 众联互联网络科技 上海旺乐尼互联网科技有限公司 互联网的黑科技实验室 银川新华互联网科技学校招聘 互联网是第几次科技革命的成果 世界互联网领先科技成果 华脉科技工业互联网产品 团飞科技与伯堂互联网服务平台 以后互联网后是啥科技 互联网科技资金流入 福建互联网展示科技馆设计 易租星互联网科技有限公司 互联网金融金融科技 互联网科技快速发展优美句子
0