diff --git a/libraries/chain/chain_controller.cpp b/libraries/chain/chain_controller.cpp index 27236123171244fd9adb0b94fb51721137a3f23d..9cfed8f118a024fb04eaf1cc8489875def0bb2dd 100644 --- a/libraries/chain/chain_controller.cpp +++ b/libraries/chain/chain_controller.cpp @@ -256,7 +256,7 @@ transaction_trace chain_controller::push_transaction(const packed_transaction& t }); } FC_CAPTURE_AND_RETHROW() } -transaction_trace chain_controller::_push_transaction(const packed_transaction& trx) +transaction_trace chain_controller::_push_transaction(const packed_transaction& trx) { try { transaction_metadata mtrx( trx, get_chain_id(), head_block_time()); @@ -339,7 +339,7 @@ block_header chain_controller::head_block_header() const { auto b = _fork_db.fetch_block(head_block_id()); if( b ) return b->data; - + if (auto head_block = fetch_block_by_id(head_block_id())) return *head_block; return block_header(); @@ -467,9 +467,8 @@ void chain_controller::_apply_cycle_trace( const cycle_trace& res ) * After applying all transactions successfully we can update * the current block time, block number, producer stats, etc */ -void chain_controller::_finalize_block( const block_trace& trace ) { try { +void chain_controller::_finalize_block( const block_trace& trace, const producer_object& signing_producer ) { try { const auto& b = trace.block; - const producer_object& signing_producer = validate_block_header(_skip_flags, b); update_global_properties( b ); update_global_dynamic_data( b ); @@ -506,6 +505,7 @@ signed_block chain_controller::_generate_block( block_timestamp_type when, { try { try { + FC_ASSERT( head_block_time() < (fc::time_point)when, "block must be generated at a timestamp after the head block time" ); uint32_t skip = _skip_flags; uint32_t slot_num = get_slot_at_time( when ); FC_ASSERT( slot_num > 0 ); @@ -541,7 +541,7 @@ signed_block chain_controller::_generate_block( block_timestamp_type when, if( !(skip & skip_producer_signature) ) _pending_block->sign( block_signing_key ); - _finalize_block( *_pending_block_trace ); + _finalize_block( *_pending_block_trace, producer_obj ); _pending_block_session->push(); @@ -628,6 +628,8 @@ void chain_controller::__apply_block(const signed_block& next_block) uint32_t skip = _skip_flags; + const producer_object& signing_producer = validate_block_header(skip, next_block); + /* FC_ASSERT((skip & skip_merkle_check) || next_block.transaction_merkle_root == next_block.calculate_merkle_root(), @@ -635,8 +637,6 @@ void chain_controller::__apply_block(const signed_block& next_block) ("calc",next_block.calculate_merkle_root())("next_block",next_block)("id",next_block.id())); */ - const producer_object& signing_producer = validate_block_header(skip, next_block); - /// regions must be listed in order for( uint32_t i = 1; i < next_block.regions.size(); ++i ) FC_ASSERT( next_block.regions[i-1].region < next_block.regions[i].region ); @@ -767,7 +767,7 @@ void chain_controller::__apply_block(const signed_block& next_block) FC_ASSERT(next_block.action_mroot == next_block_trace.calculate_action_merkle_root()); FC_ASSERT( transaction_metadata::calculate_transaction_merkle_root(input_metas) == next_block.transaction_mroot, "merkle root does not match" ); - _finalize_block( next_block_trace ); + _finalize_block( next_block_trace, signing_producer ); } FC_CAPTURE_AND_RETHROW( (next_block.block_num()) ) } flat_set chain_controller::get_required_keys(const transaction& trx, @@ -872,8 +872,8 @@ void chain_controller::validate_uniqueness( const transaction& trx )const { EOS_ASSERT(transaction == nullptr, tx_duplicate, "transaction is not unique"); } -void chain_controller::record_transaction(const transaction& trx) -{ +void chain_controller::record_transaction(const transaction& trx) +{ try { _db.create([&](transaction_object& transaction) { transaction.trx_id = trx.id(); @@ -881,10 +881,10 @@ void chain_controller::record_transaction(const transaction& trx) }); } catch ( ... ) { EOS_ASSERT( false, transaction_exception, - "duplicate transaction ${id}", + "duplicate transaction ${id}", ("id", trx.id() ) ); } -} +} void chain_controller::validate_tapos(const transaction& trx)const { @@ -1473,7 +1473,7 @@ static void log_handled_exceptions(const transaction& trx) { } FC_CAPTURE_AND_LOG((trx)); } -transaction_trace chain_controller::__apply_transaction( transaction_metadata& meta ) +transaction_trace chain_controller::__apply_transaction( transaction_metadata& meta ) { try { transaction_trace result(meta.id); @@ -1517,7 +1517,7 @@ transaction_trace chain_controller::__apply_transaction( transaction_metadata& m return result; } FC_CAPTURE_AND_RETHROW() } -transaction_trace chain_controller::_apply_transaction( transaction_metadata& meta ) +transaction_trace chain_controller::_apply_transaction( transaction_metadata& meta ) { try { try { auto temp_session = _db.start_undo_session(true); diff --git a/libraries/chain/include/eosio/chain/chain_controller.hpp b/libraries/chain/include/eosio/chain/chain_controller.hpp index f2bd35af1d5fba8a70adf1a42c4d02ae87ebff5c..35020b74c01d819ee1d33064117a4e831dee8a4c 100644 --- a/libraries/chain/include/eosio/chain/chain_controller.hpp +++ b/libraries/chain/include/eosio/chain/chain_controller.hpp @@ -267,7 +267,7 @@ namespace eosio { namespace chain { uint32_t head_block_num()const; block_id_type head_block_id()const; account_name head_block_producer()const; - block_header head_block_header()const; + block_header head_block_header()const; uint32_t last_irreversible_block_num() const; @@ -387,7 +387,6 @@ namespace eosio { namespace chain { ///Steps involved in applying a new block ///@{ const producer_object& validate_block_header(uint32_t skip, const signed_block& next_block)const; - const producer_object& _validate_block_header(const signed_block& next_block)const; void create_block_summary(const signed_block& next_block); void update_global_properties(const signed_block& b); @@ -407,7 +406,7 @@ namespace eosio { namespace chain { void _start_pending_shard(); void _finalize_pending_cycle(); void _apply_cycle_trace( const cycle_trace& trace ); - void _finalize_block( const block_trace& b ); + void _finalize_block( const block_trace& b, const producer_object& signing_producer ); transaction _get_on_block_transaction(); void _apply_on_block_transaction();