From a84be56768868b89d140a54dc239b0746e363a77 Mon Sep 17 00:00:00 2001 From: Daniel Larimer Date: Wed, 19 Apr 2017 17:09:33 -0400 Subject: [PATCH] define a means to register handlers for actions on particular contracts --- .../chain/include/eos/chain/database.hpp | 53 +++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git a/libraries/chain/include/eos/chain/database.hpp b/libraries/chain/include/eos/chain/database.hpp index 7d80273b5..ea4a91f03 100644 --- a/libraries/chain/include/eos/chain/database.hpp +++ b/libraries/chain/include/eos/chain/database.hpp @@ -39,16 +39,69 @@ #include namespace eos { namespace chain { + + class database; + + class message_validate_context { + public: + message_validate_context( const transaction& t, const message& m ) + :trx(t),msg(m){} + + const transaction& trx; + const message& msg; + }; + + + class state_validate_context : public message_validate_context { + public: + state_validate_context( const database& d, const transaction& t, const message& m ) + :message_validate_context(t,m),db(d){} + + const database& db; + }; + + class apply_context : public state_validate_context { + public: + apply_context( database& d, const transaction& t, const message& m ) + :state_validate_context(d,t,m),mutable_db(d){} + + database& mutable_db; + }; + + typedef std::function message_validate_handler; + typedef std::function state_validate_handler; + typedef std::function apply_handler; + typedef string action_type; + /** * @class database * @brief tracks the blockchain state in an extensible manner */ class database : public chainbase::database { + map< account_name, map > message_validate_handlers; + map< account_name, map > state_validate_handlers; + map< account_name, map > apply_handlers; + public: database(); ~database(); + /** + * The database can override any script handler with native code. + */ + ///@{ + void set_validate_handler( const account_name& contract, const action_type& action, message_validate_handler v ) { + message_validate_handlers[contract][action] = v; + } + void set_state_validate_handler( const account_name& contract, const action_type& action, state_validate_handler v ) { + state_validate_handlers[contract][action] = v; + } + void set_apply_handler( const account_name& contract, const action_type& action, apply_handler v ) { + apply_handlers[contract][action] = v; + } + //@} + enum validation_steps { skip_nothing = 0, -- GitLab