/** * Removes the most recent block from the database and * undoes any changes it made. */ void database::pop_block() { try { _pending_tx_session.reset(); auto head_id = head_block_id(); optional<signed_block> head_block = fetch_block_by_id( head_id ); GRAPHENE_ASSERT( head_block.valid(), pop_empty_chain, "there are no blocks to pop" ); _fork_db.pop_block(); _block_id_to_block.remove( head_id ); pop_undo(); _popped_tx.insert( _popped_tx.begin(), head_block->transactions.begin(), head_block->transactions.end() ); } FC_CAPTURE_AND_RETHROW() }
void database::debug_update( const fc::variant_object& update ) { block_id_type head_id = head_block_id(); auto it = _node_property_object.debug_updates.find( head_id ); if( it == _node_property_object.debug_updates.end() ) it = _node_property_object.debug_updates.emplace( head_id, std::vector< fc::variant_object >() ).first; it->second.emplace_back( update ); optional<signed_block> head_block = fetch_block_by_id( head_id ); FC_ASSERT( head_block.valid() ); // What the last block does has been changed by adding to node_property_object, so we have to re-apply it pop_block(); push_block( *head_block ); }