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

...略...

eos wasm虚拟机相关接口定义实现的更多相关文章

  1. Spring中Aware相关接口原理

    Spring中提供一些Aware相关接口,像是BeanFactoryAware. ApplicationContextAware.ResourceLoaderAware.ServletContextA ...

  2. Servlet相关接口和Servlet的生命周期

    http://www.cnblogs.com/luotaoyeah/p/3860292.html Servlet相关接口和Servlet的生命周期 创建一个Servlet类最直接的方式是实现javax ...

  3. USB 3.0连接器引脚、接口定义及封装尺寸

    上篇整理了USB 2.0A型.B型和Mini USB接口定义及封装,本文补充USB 3.0接口定义,USB 3.0采用的双总线结构,在速率上已经达到4.8Gbps,所以称为Super speed,在U ...

  4. USB 2.0 A型、B型、Mini和Micro接口定义及封装

    USB全称Universal Serial Bus(通用串行总线),目前USB 2.0接口分为四种类型A型.B型.Mini型还有后来补充的Micro型接口,每种接口都分插头和插座两个部分,Micro还 ...

  5. 数据结构 链式哈希表(Hash Table)的接口定义与实现分析(完整代码)

    链式哈希表的接口定义 关于哈希表与链式哈希表的描述可以参阅:http://www.cnblogs.com/idreamo/p/7990860.html 链式哈希表的操作与属性有:初始化.销毁.插入元素 ...

  6. 开地址哈希表(Hash Table)的接口定义与实现分析

    开地址哈希函数的接口定义 基本的操作包括:初始化开地址哈希表.销毁开地址哈希表.插入元素.删除元素.查找元素.获取元素个数. 各种操作的定义如下: ohtbl_init int ohtbl_init ...

  7. 【Android 应用开发】Android 网络编程 API笔记 - java.net 包相关 接口 api

    Android 网络编程相关的包 : 9 包, 20 接口, 103 类, 6 枚举, 14异常; -- Java包 : java.net 包 (6接口, 34类, 2枚举, 12异常); -- An ...

  8. 【Spring源码分析系列】ApplicationContext 相关接口架构分析

    [原创文章,转载请注明出处][本文地址]http://www.cnblogs.com/zffenger/p/5813470.html 在使用Spring的时候,我们经常需要先得到一个Applicati ...

  9. Android 网络编程 API笔记 - java.net 包相关 接口 api

    Android 网络编程相关的包 : 9 包, 20 接口, 103 类, 6 枚举, 14异常; -- Java包 : java.net 包 (6接口, 34类, 2枚举, 12异常); -- An ...

随机推荐

  1. CentOS 7 编译安装最新版git

    安装wget yum install wget -y 下载最新版本的git源码,并解压 cd /usr/local/src/ wget https://mirrors.edge.kernel.org/ ...

  2. Redis 配置登录密码

    1. 通过配置文件进行配置 打开 redis.conf,找到 #requirepass foobared 去掉行前的注释,并修改密码为所需的密码,保存文件 重启redis sudo service r ...

  3. [笔记]《算法图解》第十章 K最近邻算法

    K最近邻算法 简称KNN,计算与周边邻居的距离的算法,用于创建分类系统.机器学习等. 算法思路:首先特征化(量化) 然后在象限中选取目标点,然后通过目标点与其n个邻居的比较,得出目标的特征. 余弦相似 ...

  4. Strut 2 ValueStack传送带机制

    源码与jar包下载(将rar改成jar,直接放在WEB_INF\lib目录中即可)    众所周知,Strut 2的Action类通过属性可以获得所有相关的值,如请求参数.Action配置参数.向其他 ...

  5. 【转】Unity3D学习日记(二)使用UGUI制作虚拟摇杆控制摄像机

    http://blog.csdn.net/begonia__z/article/details/51178907 前天撸了一个简单的UGUI虚拟摇杆,今天我就利用前天做的虚拟摇杆做了一个简单的摄像机控 ...

  6. BZOJ 1083:[SCOI2005]繁忙的都市(最小生成树)

    1083: [SCOI2005]繁忙的都市 Description 城市C是一个非常繁忙的大都市,城市中的道路十分的拥挤,于是市长决定对其中的道路进行改造.城市C的道路是这样分布的:城市中有n个交叉路 ...

  7. 查看端口被占用并结束进程 mac

  8. 深入理解 Flutter 的编译原理与优化

    阿里妹导读:对于开发者而言,Flutter工程和我们的Android/iOS工程有何差别?Flutter的渲染和事件传递机制如何工作?构建缓慢或出错又如何去定位,修改和生效呢?凡此种种,都需要对Flu ...

  9. 刷题总结——纸带(NOIP赛前模拟)

    题目: 有一个无限长的纸带··上面被划分为若干个格子··现在进行N次操作,第i次操作在L到R上擦出曾经写上的数字(如果有),并写上数字i,询问最终可以看到多少个数字 N小于10^6 题解: 首先毫无疑 ...

  10. cf 235C 后缀自动机

    题目大意 给定字符串\(S\)与\(n<=10^5\)个串\(x_1,x_2...x_n\)(总长\(\le10^6\)) 对于每个\(x_i\),输出有多少个\(S\)的子串与\(x_i\)循 ...