From c49fbd87e77bc36c972b51266a1848d73bfe806f Mon Sep 17 00:00:00 2001 From: Daniel Larimer Date: Thu, 9 Jul 2015 14:09:21 -0400 Subject: [PATCH] adding checkpoints #121 to database --- libraries/chain/db_block.cpp | 22 +++++++++++++++++++ .../chain/include/graphene/chain/database.hpp | 5 +++++ .../graphene/chain/protocol/fee_schedule.hpp | 2 +- 3 files changed, 28 insertions(+), 1 deletion(-) diff --git a/libraries/chain/db_block.cpp b/libraries/chain/db_block.cpp index 574c7d6f..36760a03 100644 --- a/libraries/chain/db_block.cpp +++ b/libraries/chain/db_block.cpp @@ -82,6 +82,7 @@ const signed_transaction& database::get_recent_transaction(const transaction_id_ */ bool database::push_block(const signed_block& new_block, uint32_t skip) { + bool result; with_skip_flags( skip, [&]() { @@ -365,6 +366,21 @@ const vector& database::get_applied_operations() const void database::apply_block( const signed_block& next_block, uint32_t skip ) { + auto block_num = next_block.block_num(); + if( _checkpoints.size() ) + { + auto itr = _checkpoints.find( block_num ); + if( itr != _checkpoints.end() ) + FC_ASSERT( next_block.id() == itr->second, "Block did not match checkpoint", ("checkpoint",*itr)("block_id",next_block.id()) ); + + auto last = _checkpoints.rbegin(); + if( last->first >= block_num ) + { + // WE CAN SKIP ALMOST EVERYTHING + skip = ~0; + } + } + with_skip_flags( skip, [&]() { _apply_block( next_block ); @@ -649,4 +665,10 @@ void database::create_block_summary(const signed_block& next_block) FC_ASSERT( sum.id.instance() == next_block.block_num(), "", ("summary.id",sum.id)("next.block_num",next_block.block_num()) ); } +void database::add_checkpoints( const flat_map& checkpts ) +{ + for( const auto& i : checkpts ) + _checkpoints[i.first] = i.second; +} + } } diff --git a/libraries/chain/include/graphene/chain/database.hpp b/libraries/chain/include/graphene/chain/database.hpp index 1483bc89..491761d7 100644 --- a/libraries/chain/include/graphene/chain/database.hpp +++ b/libraries/chain/include/graphene/chain/database.hpp @@ -136,6 +136,9 @@ namespace graphene { namespace chain { optional fetch_block_by_number( uint32_t num )const; const signed_transaction& get_recent_transaction( const transaction_id_type& trx_id )const; + void add_checkpoints( const flat_map& checkpts ); + const flat_map get_checkpoints()const { return _checkpoints; } + bool push_block( const signed_block& b, uint32_t skip = skip_nothing ); processed_transaction push_transaction( const signed_transaction& trx, uint32_t skip = skip_nothing ); bool _push_block( const signed_block& b ); @@ -470,6 +473,8 @@ namespace graphene { namespace chain { vector _committee_count_histogram_buffer; uint64_t _total_voting_stake; + flat_map _checkpoints; + node_property_object _node_property_object; }; diff --git a/libraries/chain/include/graphene/chain/protocol/fee_schedule.hpp b/libraries/chain/include/graphene/chain/protocol/fee_schedule.hpp index 67570998..5cbb5abd 100644 --- a/libraries/chain/include/graphene/chain/protocol/fee_schedule.hpp +++ b/libraries/chain/include/graphene/chain/protocol/fee_schedule.hpp @@ -54,5 +54,5 @@ namespace graphene { namespace chain { } } // graphene::chain FC_REFLECT_TYPENAME( graphene::chain::fee_parameters ) -FC_REFLECT( graphene::chain::fee_schedule, (parameters) ) +FC_REFLECT( graphene::chain::fee_schedule, (parameters)(scale) )