zoukankan      html  css  js  c++  java
  • 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;

       }

       ...

    }

  • 相关阅读:
    ROS tf 两个常用的函数
    C/C++ assert()函数用法总结
    drand48 等 随机数生成函数
    PF部分代码解读
    Error "Client wants topic A to have B, but our version has C. Dropping connection."
    launch 文件的写法
    Spring七大框架
    web.xml filter配置
    web.xml listener配置
    web.xml加载过程
  • 原文地址:https://www.cnblogs.com/SkyMouse/p/10105738.html
Copyright © 2011-2022 走看看