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;
}
网友评论