From f05475cc8f929f882cb32a3dfce074df33cb5402 Mon Sep 17 00:00:00 2001 From: Daniel Larimer Date: Wed, 7 Oct 2015 09:10:03 -0400 Subject: [PATCH] Fix #355 - Test Net HARDFORK at block 58500 --- libraries/chain/db_block.cpp | 20 ++++++++++++++++++-- libraries/chain/db_witness_schedule.cpp | 14 +++++--------- 2 files changed, 23 insertions(+), 11 deletions(-) diff --git a/libraries/chain/db_block.cpp b/libraries/chain/db_block.cpp index e19c218d..2c4c5843 100644 --- a/libraries/chain/db_block.cpp +++ b/libraries/chain/db_block.cpp @@ -630,14 +630,30 @@ const witness_object& database::validate_block_header( uint32_t skip, const sign if( !(skip&skip_witness_signature) ) FC_ASSERT( next_block.validate_signee( witness.signing_key ) ); - if( !skip_witness_schedule_check ) + if( !(skip&skip_witness_schedule_check) ) { uint32_t slot_num = get_slot_at_time( next_block.timestamp ); FC_ASSERT( slot_num > 0 ); witness_id_type scheduled_witness = get_scheduled_witness( slot_num ); - FC_ASSERT( next_block.witness == scheduled_witness ); + +#warning REMOVE HARDFORK in final release check + if( next_block.block_num() > 58500 ) { + FC_ASSERT( next_block.witness == scheduled_witness, "Witness produced block at wrong time", + ("block witness",next_block.witness)("scheduled",scheduled_witness)("slot_num",slot_num) ); + } + } /*else { + uint32_t slot_num = get_slot_at_time( next_block.timestamp ); + FC_ASSERT( slot_num > 0 ); + + const witness_schedule_object& wso = witness_schedule_id_type()(*this); + const dynamic_global_property_object& dpo = get_dynamic_global_properties(); + + witness_id_type scheduled_witness = get_scheduled_witness( slot_num ); + if( next_block.witness != scheduled_witness ) + edump( (next_block.block_num())(next_block.witness)(scheduled_witness)(slot_num)(wso)(dpo.current_aslot) ); } + */ return witness; } diff --git a/libraries/chain/db_witness_schedule.cpp b/libraries/chain/db_witness_schedule.cpp index 7ff53896..5ea26560 100644 --- a/libraries/chain/db_witness_schedule.cpp +++ b/libraries/chain/db_witness_schedule.cpp @@ -49,23 +49,19 @@ fc::time_point_sec database::get_slot_time(uint32_t slot_num)const return genesis_time + slot_num * interval; } - auto head_block_abs_slot = head_block_time().sec_since_epoch() / interval; + int64_t head_block_abs_slot = head_block_time().sec_since_epoch() / interval; fc::time_point_sec head_slot_time(head_block_abs_slot * interval); const global_property_object& gpo = get_global_properties(); + if( dpo.dynamic_flags & dynamic_global_property_object::maintenance_flag ) + slot_num += gpo.parameters.maintenance_skip_slots; + // "slot 0" is head_slot_time // "slot 1" is head_slot_time, // plus maint interval if head block is a maint block // plus block interval if head block is not a maint block - return head_slot_time - + (slot_num + - ( - (dpo.dynamic_flags & dynamic_global_property_object::maintenance_flag) - ? gpo.parameters.maintenance_skip_slots : 0 - ) - ) * interval - ; + return head_slot_time + (slot_num * interval); } uint32_t database::get_slot_at_time(fc::time_point_sec when)const