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智能合约执行流程的更多相关文章

  1. eos智能合约与主进程交互

    eos智能合约与主进程交互 1.启动wasm 参考eos智能合约执行流程.md 2.智能合约调用主进程api 如何实现wasm代码与eos宿主交互还需要摸索! 大致:在wasm_interface.c ...

  2. 【精解】EOS智能合约演练

    EOS,智能合约,abi,wasm,cleos,eosiocpp,开发调试,钱包,账户,签名权限 热身 本文旨在针对EOS智能合约进行一个完整的实操演练,过程中深入熟悉掌握整个EOS智能合约的流程,过 ...

  3. EOS智能合约存储实例讲解

    EOS智能合约存储实例 智能合约中的基础功能之一是token在某种规则下转移.以EOS提供的token.cpp为例,定义了eos token的数据结构:typedef eos::token<ui ...

  4. EOS 智能合约编写(一)

    本文编写了一个简单的EOS智能合约,实现用户管理和资产管理,包括存钱,取钱,转帐的功能,旨在学习如何编写自己的EOS合约功能. 系统:Ubuntu      EOS版本:v1.1.1 一.智能合约代码 ...

  5. eos 智能合约开发体验

    eos编译安装 eos 特性 数据存储 eos投票智能合约开发 eos投票智能合约部署测试 注意避坑 eos编译安装 ERROR: Could not find a package configura ...

  6. EOS智能合约授权限制和数据存储

    EOS智能合约授权限制和数据存储 在EOS合约中,调用合约需要来自账户的授权,同时还要指定需要调用的动作.当然,有的合约并不是所有账户都可以调用的,这就需要用到授权限制.接下来我们就来看看如何限制合约 ...

  7. EOS智能合约开发(四):智能合约部署及调试(附编程示例)

    EOS智能合约开发(一):EOS环境搭建和创建节点 EOS智能合约开发(二):EOS创建和管理钱包 EOS智能合约开发(三):EOS创建和管理账号 部署智能合约的示例代码如下: $ cleos set ...

  8. EOS智能合约开发(三):EOS创建和管理账号

    没有看前面文章的小伙伴可以看一下 EOS智能合约开发(一):EOS环境搭建和启动节点 EOS智能合约开发(二):EOS创建和管理钱包 创建好钱包.密钥之后,接下来你就可以创建账号了,账号是什么?账号保 ...

  9. EOS智能合约开发(二):EOS创建和管理钱包

    上节介绍了EOS智能合约开发之EOS环境搭建及启动节点 那么,节点启动后我们要做的第一件事儿是什么呢?就是我们首先要有账号,但是有账号的前提是什么呢?倒不是先创建账号,而是先要有自己的一组私钥,有了私 ...

随机推荐

  1. Atom-无懈可击的Markdown编辑器

    备战美赛期间,向岳神学习,搞了Atom玩协作开发,第一次没有自动补全的手撸了遗传算法.今天发现Atom还有写Markdown的妙用,遂拿来练手. 1. 安装Atom 下载安装Atom:https:// ...

  2. Hadoop架构的初略总结(2)

    Hadoop架构的初略总结(2) 回顾一下前文,我们总结了以下几个方面.我们为什么需要Hadoop:Hadoop2.0生态系统的构成:Hadoop1.0中HDFS和MapReduce的结构模型. 我们 ...

  3. Spring整合hibernate -SessionFactory

    本文目录 1  本文采用 hibernate4 整合 Spring3.1 2 把Spring获取datasource通过class="org.springframework.orm.hibe ...

  4. php添加扩展模块swoole

    php添加扩展模块swoole 应开发同事要求,需要安装php的扩展模块swoole.swoole是一种PHP高级Web开发框架,框架不是为了提升网站的性能,而是为了提升网站的开发效率,以最少的性能损 ...

  5. Mysql架构之主从复制

    author:JevonWei 版权声明:原创作品 主从复制架构 架构角色 mysql-master:192.168.198.139 mysql-slave:192.168.198.128 主数据库和 ...

  6. Proteus中常用元器件名字

    运放   OPAMP 稳压管  zener MOS管 IRC 串口  COMPIM

  7. [BZOJ1280][POJ1149]Emmy卖猪pigs

    [BZOJ1280][POJ1149]Emmy卖猪pigs 试题描述 Emmy在一个养猪场工作.这个养猪场有 \(M\) 个锁着的猪圈,但Emmy并没有钥匙.顾客会到养猪场来买猪,一个接着一个.每一位 ...

  8. P1558 色板游戏 (线段树)

    题目链接 Solution 一个简单的 或 线段树.竟然坑了我一个小时... 因为颜色很小,所以把状态压起来. 然后每个节点上的数值代表当前颜色状态. 然后节点合并很简单,直接或起来. 需要注意一下的 ...

  9. StringBuilder与StringBuffer

    转:http://www.cnblogs.com/pepcod/archive/2013/02/16/2913557.html JAVA中用于处理字符串常用的有三个类: java.lang.Strin ...

  10. 【HDOJ5956】The Elder(树形DP,斜率优化)

    题意:有一棵n个点的有根树,每条边上有一个边权.给定P,从i跳到它的祖先j的费用是距离的平方+P,问所有点中到根节点1的总花费最大值 n<=1e5,p<=1e6,w<=1e2 思路: ...