• eos wasm虚拟机相关接口定义实现


    wasm虚拟机相关接口定义实现

    执行流程

    controller::push_transaction()  // 事务

      -> transaction_context::exec()  // 事务

        -> transaction_context::dispatch_action() // 通过便利transaction中的各个action来分发执行

          -> apply_context::exec() // action

            -> apply_context::exec_one() // action 执行具体的智能合约

              -> controller::get_wasm_interface()->apply() // 进入虚拟机开始执行对应智能合约

                -> wasm_interface_impl::get_instantiated_module()->apply() // 加载智能合约并执行

                  -> wavm_instantiated_module::apply() // 具体模块开始接收调用

                    -> wavm_instantiated_module::call() // 开始执行具体函数

                      -> Runtime::invokeFunction() // 进入到wasm运行时库开始执行具体函数

    接口定义

    • wasm_interface_impl wasm虚拟机实现类

    1.加载模块实现

    std::unique_ptr<wasm_instantiated_module_interface> &get_instantiated_module(const digest_type &code_id,const shared_string &code,transaction_context &trx_context)

    {

      ...

      IR::Module module;

      try

      {

        // 将模块序列化到内存并加载模块

        Serialization::MemoryInputStream stream((const U8 *)code.data(), code.size());

        WASM::serialize(stream, module);

        module.userSections.clear();

      }

      catch(...){

        ...

      }

     

      ...

      /**

      * 这里是注入拦截代码,用于拦截计算相应cpu和内存数据

      */

      wasm_injections::wasm_binary_injection injector(module); //如下

      injector.inject();

      ...

     

      

    }

    • wasm_eosio_injection wasm虚拟机注入
      • 默认通过内存计算
      • using standard_module_injectors = module_injectors<max_memory_injection_visitor>
    • max_memory_injection_visitor 最大内存拦截

    监控模块适用内存数

    void max_memory_injection_visitor::inject( Module& m ) {

       if(m.memories.defs.size() && m.memories.defs[0].type.size.max > maximum_linear_memory/wasm_page_size)

          m.memories.defs[0].type.size.max = maximum_linear_memory/wasm_page_size;

    }

    2.执行智能合约

    void wasm_interface::apply(const digest_type &code_id, const shared_string &code, apply_context &context)

    {

       // 智能合约虚拟机加载模块

       // 加载模块时会通过如下的injection来注入监控

       // 默认:eos监控最大使用内存:max_memory_injection_visitor

       // 通过apply来执行相应智能合约

       my->get_instantiated_module(code_id, code, context.trx_context)->apply(context);

    }

    • wasm_instantiated_module_interface wasm模块基类
    • wavm_instantiated_module wavm模块实现类
    • wavm_instantiated_module wavm模块实现类

    // 函数执行

    void apply(apply_context& context) override {

      // 默认3个参数

      // receiver/account/name

      // 其他参数通过context获取

      vector<Value> args = {Value(uint64_t(context.receiver)),

                          Value(uint64_t(context.act.account)),

                            Value(uint64_t(context.act.name))};

      call("apply", args, context);

    }

     

    void call(const string &entry_point, const vector <Value> &args, apply_context &context) {

      try {

          FunctionInstance* call = asFunctionNullable(getInstanceExport(_instance,entry_point));

            if( !call )

              return;

          

          the_running_instance_context.memory = default_mem;

          the_running_instance_context.apply_ctx = &context;

     

          // 加载instance

          resetGlobalInstances(_instance);

          // 调用初始化函数

          runInstanceStartFunc(_instance);

          // 这里就调用到了wasm runtime来调用智能合约

          Runtime::invokeFunction(call,args);

      }

     

    }

    • wabt_instantiated_module wabt模块

    整体实现过程同wavm,局部有差异

    虚拟机启动

    • controller_impl 控制器实现类

    controller构造函数中构建wasm_interface对象

    controller_impl( const controller::config& cfg, controller& s  )

    ......

      wasmif( cfg.wasm_runtime ), //根据配置来构建wasm_interface对象

    ......

  • 相关阅读:
    Java操作数据库——使用JDBC连接数据库
    MySQL入门——Linux下安装后的配置文件
    Linux上搭建SVN服务
    PHP包管理工具composer
    收藏博文
    Linux上软件安装
    nginx配置详解
    Linux文本编辑器Vim使用
    Linux常用命令整理
    Linux增加swap空间
  • 原文地址:https://www.cnblogs.com/SkyMouse/p/10105745.html
Copyright © 2020-2023  润新知