美文网首页
Eos源码阅读(native action的判断)

Eos源码阅读(native action的判断)

作者: 坠叶飘香 | 来源:发表于2019-02-15 14:27 被阅读0次

eos/libraries/chain/controller.cpp

1.数据结构

using apply_handler = std::function<void(apply_context&)>;  //处理方法
typedef pair<scope_name,action_name>                   handler_key;
map< account_name, map<handler_key, apply_handler> >   apply_handlers;

2.往map apply_handlers 注册

void set_apply_handler( account_name receiver, account_name contract, action_name action, apply_handler v ) {
      apply_handlers[receiver][make_pair(contract,action)] = v;
}
对应的apply_handler(函数名)为apply_eosio_xxx,比如apply_eosio_newaccount, apply_eosio_setcode……
#define SET_APP_HANDLER( receiver, contract, action) \
   set_apply_handler( #receiver, #contract, #action, &BOOST_PP_CAT(apply_, BOOST_PP_CAT(contract, BOOST_PP_CAT(_,action) ) ) )

   SET_APP_HANDLER( eosio, eosio, newaccount );
   SET_APP_HANDLER( eosio, eosio, setcode );
   SET_APP_HANDLER( eosio, eosio, setabi );
   SET_APP_HANDLER( eosio, eosio, updateauth );
   SET_APP_HANDLER( eosio, eosio, deleteauth );
   SET_APP_HANDLER( eosio, eosio, linkauth );
   SET_APP_HANDLER( eosio, eosio, unlinkauth );
/*
   SET_APP_HANDLER( eosio, eosio, postrecovery );
   SET_APP_HANDLER( eosio, eosio, passrecovery );
   SET_APP_HANDLER( eosio, eosio, vetorecovery );
*/

   SET_APP_HANDLER( eosio, eosio, canceldelay );

3. 遍历apply_handlers,判断一次action是否存在于apply_handlers

eos/libraries/chain/controller.cpp

const apply_handler* controller::find_apply_handler( account_name receiver, account_name scope, action_name act ) const {
   auto native_handler_scope = my->apply_handlers.find( receiver );
   if( native_handler_scope != my->apply_handlers.end() ) {
      auto handler = native_handler_scope->second.find( make_pair( scope, act ) );
      if( handler != native_handler_scope->second.end() )
         return &handler->second;
   }
   return nullptr;
}

相关文章

网友评论

      本文标题:Eos源码阅读(native action的判断)

      本文链接:https://www.haomeiwen.com/subject/fhgpeqtx.html