From c43c71372d2371c0d984e670bd516142229e0c94 Mon Sep 17 00:00:00 2001 From: theoreticalbts Date: Tue, 23 Jun 2015 13:11:38 -0400 Subject: [PATCH] assert_evaluator.cpp: Remove skip_unknown_predicate flag, add max_predicate_opcode check --- libraries/chain/assert_evaluator.cpp | 22 ++++++++++--------- .../chain/include/graphene/chain/database.hpp | 3 +-- 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/libraries/chain/assert_evaluator.cpp b/libraries/chain/assert_evaluator.cpp index aa6862c4..f7c44dd9 100644 --- a/libraries/chain/assert_evaluator.cpp +++ b/libraries/chain/assert_evaluator.cpp @@ -24,13 +24,13 @@ namespace graphene { namespace chain { -struct predicate_visitor +struct predicate_visitor { typedef bool result_type; const database& db; predicate_visitor( const database& d ):db(d){} - + bool operator()( const verify_account_name& p )const { return p.account_id(db).name == p.account_name; @@ -45,6 +45,7 @@ void_result assert_evaluator::do_evaluate( const assert_operation& o ) { const database& _db = db(); uint32_t skip = _db.get_node_properties().skip_flags; + auto max_predicate_opcode = _db.get_global_properties().parameters.max_predicate_opcode; if( skip & database::skip_assert_evaluation ) return void_result(); @@ -53,14 +54,15 @@ void_result assert_evaluator::do_evaluate( const assert_operation& o ) { fc::datastream ds( pdata.data(), pdata.size() ); predicate p; - try { - fc::raw::unpack( ds, p ); - } catch ( const fc::exception& e ) - { - if( skip & database::skip_unknown_predicate ) - continue; - throw; - } + // + // FC_ASSERT deep in the bowels of static_variant implementation + // will trip if we get a predicate which isn't in our code's + // static_variant. This is desired behavior. + // + fc::raw::unpack( ds, p ); + + FC_ASSERT( p.which() >= 0 ); + FC_ASSERT( unsigned(p.which()) < max_predicate_opcode ); FC_ASSERT( p.visit( predicate_visitor( _db ) ) ); } return void_result(); diff --git a/libraries/chain/include/graphene/chain/database.hpp b/libraries/chain/include/graphene/chain/database.hpp index 41c4b3a6..2d340c00 100644 --- a/libraries/chain/include/graphene/chain/database.hpp +++ b/libraries/chain/include/graphene/chain/database.hpp @@ -118,8 +118,7 @@ namespace graphene { namespace chain { skip_tapos_check = 0x80, ///< used while reindexing -- note this skips expiration check as well skip_authority_check = 0x100, ///< used while reindexing -- disables any checking of authority on transactions skip_merkle_check = 0x200, ///< used while reindexing - skip_assert_evaluation = 0x400, ///< used while reindexing - skip_unknown_predicate = 0x800 ///< used by non-witness nodes to allow unknown predicates + skip_assert_evaluation = 0x400 ///< used while reindexing }; void open(const fc::path& data_dir, const genesis_state_type& initial_allocation = genesis_state_type());