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环境搭建及启动节点 那么,节点启动后我们要做的第一件事儿是什么呢?就是我们首先要有账号,但是有账号的前提是什么呢?倒不是先创建账号,而是先要有自己的一组私钥,有了私 ...
随机推荐
- sql server备份
完全备份 declare @device varchar(255),@path varchar(255),@dbname varchar(255)set @dbname='MIS_TEMP'set @ ...
- python2.X中文乱码
在IDE下,加上# -- coding: UTF-8 -- 并且保证IDE也是utf-8编码. 在CMD下,这样执行会有乱码,为啥呢,因为cmd下是gbk编码的,你写的代码必须也是gbk编码的,你可以 ...
- git:多个sshkey配置
克隆项目: 使用git clone +项目.git地址 例如: 创建SSH Key: ssh-keygen -t rsa -C +邮箱地址 sshkey自定义保存:创建后在第二步(enter file ...
- Mac OS 添加 MySQL 环境变量
1.打开终端,输入: cd ~ 会进入~文件夹 2.如果 ~ 文件夹中已经存在 .bash_profile 文件,则在 : 后面追加你想要添加的路径, 3. 否则输入:touch .bash_prof ...
- 三种框架对比react vue 和Angular对比
https://blog.csdn.net/runOnWay/article/details/80103880 angular 优点 背靠谷歌 使用typescript 便于后端人员开发上手 完整 不 ...
- [ZJOI2011][bzoj2229] 最小割 [最小割树]
题面 传送门 思路 首先我们明确一点:这道题不是让你把$n^2$个最小割跑一遍[废话] 但是最小割过程是必要的,因为最小割并没有别的效率更高的算法(Stoer-Wagner之类的?) 那我们就要尽量找 ...
- 分布式文件系统之Glusterfs
1.环境规划如下 centos7.4 三个节点一块 sdb 3G大小的测试硬盘 2.Glusterfs 卷的类型比较多,这里我们测试最常用的一种 Distributed Replicate ...
- Window下安装使用RabbitMQ
RabbitMQ官网 http://www.rabbitmq.com 下载地址 http://www.rabbitmq.com/download.html 一 Windows下安装RabbitMq 1 ...
- cf 816E Karen and Supermarket
题目大意 给定\(n\)一颗树,每个点上有一个物品 每个物品有价格\(c[i]\) 有优惠券,能使价格减少\(d[i]\) 但是使用优惠券的前提时购买该物品,且父亲也使用优惠券 给定钱包余额\(lim ...
- using要写多少
原文发布时间为:2009-10-25 -- 来源于本人的百度文章 [由搬家工具导入] 有时候未必要像默认的这样要using这么多。。。 using System;using System.Data;u ...