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对象
...略...
eos wasm虚拟机相关接口定义实现的更多相关文章
- Spring中Aware相关接口原理
Spring中提供一些Aware相关接口,像是BeanFactoryAware. ApplicationContextAware.ResourceLoaderAware.ServletContextA ...
- Servlet相关接口和Servlet的生命周期
http://www.cnblogs.com/luotaoyeah/p/3860292.html Servlet相关接口和Servlet的生命周期 创建一个Servlet类最直接的方式是实现javax ...
- USB 3.0连接器引脚、接口定义及封装尺寸
上篇整理了USB 2.0A型.B型和Mini USB接口定义及封装,本文补充USB 3.0接口定义,USB 3.0采用的双总线结构,在速率上已经达到4.8Gbps,所以称为Super speed,在U ...
- USB 2.0 A型、B型、Mini和Micro接口定义及封装
USB全称Universal Serial Bus(通用串行总线),目前USB 2.0接口分为四种类型A型.B型.Mini型还有后来补充的Micro型接口,每种接口都分插头和插座两个部分,Micro还 ...
- 数据结构 链式哈希表(Hash Table)的接口定义与实现分析(完整代码)
链式哈希表的接口定义 关于哈希表与链式哈希表的描述可以参阅:http://www.cnblogs.com/idreamo/p/7990860.html 链式哈希表的操作与属性有:初始化.销毁.插入元素 ...
- 开地址哈希表(Hash Table)的接口定义与实现分析
开地址哈希函数的接口定义 基本的操作包括:初始化开地址哈希表.销毁开地址哈希表.插入元素.删除元素.查找元素.获取元素个数. 各种操作的定义如下: ohtbl_init int ohtbl_init ...
- 【Android 应用开发】Android 网络编程 API笔记 - java.net 包相关 接口 api
Android 网络编程相关的包 : 9 包, 20 接口, 103 类, 6 枚举, 14异常; -- Java包 : java.net 包 (6接口, 34类, 2枚举, 12异常); -- An ...
- 【Spring源码分析系列】ApplicationContext 相关接口架构分析
[原创文章,转载请注明出处][本文地址]http://www.cnblogs.com/zffenger/p/5813470.html 在使用Spring的时候,我们经常需要先得到一个Applicati ...
- Android 网络编程 API笔记 - java.net 包相关 接口 api
Android 网络编程相关的包 : 9 包, 20 接口, 103 类, 6 枚举, 14异常; -- Java包 : java.net 包 (6接口, 34类, 2枚举, 12异常); -- An ...
随机推荐
- IOS开发学习笔记022-imageView实现动画
这里要播放的动画是很多张连续的动画,连续播放就会显示出动画效果. 大概过程是: 新建一个single view application ,然后添加一个image View控件到视图.给image vi ...
- IOS开发学习笔记017-第一个IOS应用
第一个IOS应用程序,就从最简单的开始吧. 1.先了解一下开发环境,Xcode的相关组成 2.还有模拟器 3.运行与停止按钮 4.新建一个工程 5.看看main函数里都有啥 6.现在来添加一个控件 1 ...
- RHCE认证经典考题
1:按要求创建用户组及多个用户,设置用户的候选组,设置用户的默认shell. 创建组adminuser. 创建用户natasha和harry属于该组(该组为他们的第二个组). 创建用户sarah,不属 ...
- Codeforces 1139D(期望dp)
题意是模拟一个循环,一开始有一个空序列,之后每次循环: 1.从1到m中随机选出一个数字添加进去,每个数字被选的概率相同. 2.检查这个序列的gcd是否为1,如果为1则停止,若否则重复1操作直至gcd为 ...
- c++ STL sort struct comp
详细解说 STL 排序(Sort) http://www.cppblog.com/mzty/archive/2005/12/15/1770.html 详细解说 STL 排序(Sort) 作者Winte ...
- android TranslateAnimation动画执行时的坐标获取。
android 的Tween动画并不会改变控件的属性值,比如以下测试片段: 定义一个从屏幕右边进入,滚动到屏幕左边消失的一个TranslateAnimation动画: <?xml version ...
- Javascript 表达式和运算符
属性访问表达式: var o = {x:1, y:{z:3}};//示例对象 var a = [o, 4, [5,6]];//包含对象的数组 console.log(o["x"]) ...
- Struts2拦截器原理
拦截器是struts2处理的核心,本文主要说struts2的拦截器的基本原理/实现,其它框架处理的东西就不说了,得自己再看了.struts2版本:2.2.3当一个请求来了后,从org.apache.s ...
- POJ2796 Feel Good -- 单调队列
Feel Good Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 14489 Accepted: 4015 Case T ...
- selenium webdriver——元素定位
元素定位: >>WebDriver提供了八种元素定位方法,在Python语言中,所对应的方法如下: >>id属性定位:有唯一性 find_element_by_id(" ...