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对象

......

posted @ 2018-12-11 22:27  Yarkin  阅读(546)  评论(0编辑  收藏  举报