eos智能合约执行流程
eos智能合约执行
1. 执行流程
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运行时库开始执行具体函数
2. 分析exec_one
/**
* IMPORTENT:执行具体action
*/
void apply_context::exec_one(action_trace &trace)
{
auto start = fc::time_point::now();
...略
const auto &cfg = control.get_global_properties().configuration;
try
{
try
{
/**
* 接收者信息,智能合约账号?应该是对应为eosio
*/
const auto &a = control.get_account(receiver);
privileged = a.privileged;
/**
* IMPORTENT:智能合约查找apply_handler,Native是原生api
*/
auto native = control.find_apply_handler(receiver, act.account, act.name);
if (native)
{
...略...
...内置API调用
(*native)(*this);
}
/**
* IMPORTENT:智能合约,a.code?这部分是代码?智能合约账号对应code就是合约代码
*/
if (a.code.size() > 0 && !(act.account == config::system_account_name && act.name == N(setcode) &&
receiver == config::system_account_name))
{
...略...
try
{
/**
* IMPORTENT:执行智能合约
*/
control.get_wasm_interface().apply(a.code_version, a.code, *this);
}
catch (const wasm_exit &)
{
}
}
}
FC_RETHROW_EXCEPTIONS(warn, "pending console output: ${console}", ("console", _pending_console_output.str()))
}
catch (fc::exception &e)
{
...
throw;
}
...
}
eos智能合约执行流程的更多相关文章
- eos智能合约与主进程交互
eos智能合约与主进程交互 1.启动wasm 参考eos智能合约执行流程.md 2.智能合约调用主进程api 如何实现wasm代码与eos宿主交互还需要摸索! 大致:在wasm_interface.c ...
- 【精解】EOS智能合约演练
EOS,智能合约,abi,wasm,cleos,eosiocpp,开发调试,钱包,账户,签名权限 热身 本文旨在针对EOS智能合约进行一个完整的实操演练,过程中深入熟悉掌握整个EOS智能合约的流程,过 ...
- EOS智能合约存储实例讲解
EOS智能合约存储实例 智能合约中的基础功能之一是token在某种规则下转移.以EOS提供的token.cpp为例,定义了eos token的数据结构:typedef eos::token<ui ...
- EOS 智能合约编写(一)
本文编写了一个简单的EOS智能合约,实现用户管理和资产管理,包括存钱,取钱,转帐的功能,旨在学习如何编写自己的EOS合约功能. 系统:Ubuntu EOS版本:v1.1.1 一.智能合约代码 ...
- eos 智能合约开发体验
eos编译安装 eos 特性 数据存储 eos投票智能合约开发 eos投票智能合约部署测试 注意避坑 eos编译安装 ERROR: Could not find a package configura ...
- EOS智能合约授权限制和数据存储
EOS智能合约授权限制和数据存储 在EOS合约中,调用合约需要来自账户的授权,同时还要指定需要调用的动作.当然,有的合约并不是所有账户都可以调用的,这就需要用到授权限制.接下来我们就来看看如何限制合约 ...
- EOS智能合约开发(四):智能合约部署及调试(附编程示例)
EOS智能合约开发(一):EOS环境搭建和创建节点 EOS智能合约开发(二):EOS创建和管理钱包 EOS智能合约开发(三):EOS创建和管理账号 部署智能合约的示例代码如下: $ cleos set ...
- EOS智能合约开发(三):EOS创建和管理账号
没有看前面文章的小伙伴可以看一下 EOS智能合约开发(一):EOS环境搭建和启动节点 EOS智能合约开发(二):EOS创建和管理钱包 创建好钱包.密钥之后,接下来你就可以创建账号了,账号是什么?账号保 ...
- EOS智能合约开发(二):EOS创建和管理钱包
上节介绍了EOS智能合约开发之EOS环境搭建及启动节点 那么,节点启动后我们要做的第一件事儿是什么呢?就是我们首先要有账号,但是有账号的前提是什么呢?倒不是先创建账号,而是先要有自己的一组私钥,有了私 ...
随机推荐
- Python框架之Django学习笔记(十四)
Django站点管理(续·完) 本想昨天更新的,谁曾想昨天竟然是工作日!我就不吐槽昨天加班到十一点多了,需求增加无疑让我等蛋疼不已,忽而想起一首打油诗: 明月几时有,把酒问群友.不知这次版本,今晚能出 ...
- IOS笔记047-代理传值和block传值
在两个不同的控制器之间传递数据,可以使用代理传值或者block传值. 例子是一个简单通讯录. 主界面如下: 添加联系人界面 查看/编辑联系人界面:默认是查看模式,点击编辑后进入编辑模式 编辑模式 数据 ...
- android 内存说明
MemoryInfo的Field如下 dalvikPrivateDirty: The private dirty pages used by dalvik. dalvikPss :The propor ...
- [oldboy-django][2深入django]django 官方中文文档 --扩展User
https://docs.djangoproject.com/en/2.0/topics/auth/customizing/#extending-the-existing-user-model # 另 ...
- SQL中GETDATE()一些操作
Sql Server 中一个非常强大的日期格式化函数Select CONVERT(varchar(100), GETDATE(), 0): 05 16 2006 10:57AMSelect CONVE ...
- web标准,可用性和可访问性
web标准,简单的说,是指html,css,JavaScript三者的分离. 网页由三部分组成:结构,表现和行为.对应的标准分为三方面: 1.结构化标准语言XHTML和XML2.表现标准语言主要包括c ...
- Java众神之路(3)-关键字(上)
关键字(上) 1.final ① 对于基本类型前加以final修饰,表示被修饰的变量为常数,不可以修改.一个既是static又是final的字段表示只占据一段不能改变的存储空间. ② final用于对 ...
- python爬虫异常处理
import urllib2 try: response = urllib2.urlopen('http://www.baidu.com') except urllib2.URLError, e: p ...
- Jib构建你的第一个java镜像
jib Official:GoogleContainerTools/jib 本文示例完整demo github地址 github.com/moxingwang/- 想要了解并且使用jib,首先你得知道 ...
- jQuery 拖动排序
原文发布时间为:2010-04-11 -- 来源于本人的百度文章 [由搬家工具导入] <!DOCTYPE html><html lang="en">< ...