Dramatically accelerate chain_test, fix core asset burn bug

When generating blocks until a timestamp, we now generate one block
immediately, then skip blocks until the timestamp, and generate a
final block then.

Also, this exposed a bug in the witness budget handling which
caused the undesired burning of core asset. This bug is now fixed.
This commit is contained in:
Nathan Hourt 2015-06-17 12:14:28 -04:00
parent c9328cc7f4
commit 8f739ac767
5 changed files with 13 additions and 8 deletions

View file

@ -272,8 +272,7 @@ void database::process_budget()
});
modify(dpo, [&]( dynamic_global_property_object& _dpo )
{
// Should this be +=?
_dpo.witness_budget = witness_budget;
_dpo.witness_budget += witness_budget;
_dpo.last_budget_time = now;
});
@ -406,8 +405,10 @@ void database::perform_chain_maintenance(const signed_block& next_block, const g
next_maintenance_time = time_point_sec() +
(((next_block.timestamp.sec_since_epoch() / maintenance_interval) + 1) * maintenance_interval);
else
next_maintenance_time += maintenance_interval;
assert( next_maintenance_time > next_block.timestamp );
// It's possible we have missed blocks for at least a maintenance interval.
// In this case, we'll need to bump the next maintenance time more than once.
do next_maintenance_time += maintenance_interval;
while( next_maintenance_time < head_block_time() );
}
modify(get_dynamic_global_properties(), [next_maintenance_time](dynamic_global_property_object& d) {

View file

@ -274,8 +274,9 @@ void database_fixture::generate_blocks(fc::time_point_sec timestamp, bool miss_i
{
if( miss_intermediate_blocks )
{
generate_block();
auto slots_to_miss = db.get_slot_at_time(timestamp) - 1;
assert(slots_to_miss > 0);
if( slots_to_miss <= 0 ) return;
generate_block(~0, generate_private_key("genesis"), slots_to_miss);
return;
}

View file

@ -126,7 +126,7 @@ struct database_fixture {
* @brief Generates blocks until the head block time matches or exceeds timestamp
* @param timestamp target time to generate blocks until
*/
void generate_blocks(fc::time_point_sec timestamp, bool miss_intermediate_blocks = false);
void generate_blocks(fc::time_point_sec timestamp, bool miss_intermediate_blocks = true);
account_create_operation make_account(
const std::string& name = "nathan",

View file

@ -568,7 +568,7 @@ BOOST_FIXTURE_TEST_CASE( short_order_expiration, database_fixture )
BOOST_CHECK_EQUAL( get_balance(*nathan, *core), 49500 );
auto id = short_itr->id;
generate_blocks(op.expiration);
generate_blocks(op.expiration, false);
test = &get_asset("TEST");
core = &asset_id_type()(db);
nathan = &get_account("nathan");
@ -611,7 +611,7 @@ BOOST_FIXTURE_TEST_CASE( limit_order_expiration, database_fixture )
BOOST_CHECK_EQUAL( get_balance(*nathan, *core), 49500 );
auto id = limit_itr->id;
generate_blocks(op.expiration);
generate_blocks(op.expiration, false);
test = &get_asset("TEST");
core = &asset_id_type()(db);
nathan = &get_account("nathan");

View file

@ -671,9 +671,12 @@ BOOST_AUTO_TEST_CASE( refund_worker_test )
}
// auto supply = asset_id_type()(db).dynamic_data(db).current_supply;
verify_asset_supplies();
generate_blocks(db.get_dynamic_global_properties().next_maintenance_time);
verify_asset_supplies();
BOOST_CHECK_EQUAL(worker_id_type()(db).worker.get<refund_worker_type>().total_burned.value, 1000);
generate_blocks(db.get_dynamic_global_properties().next_maintenance_time);
verify_asset_supplies();
BOOST_CHECK_EQUAL(worker_id_type()(db).worker.get<refund_worker_type>().total_burned.value, 2000);
generate_blocks(db.get_dynamic_global_properties().next_maintenance_time);
BOOST_CHECK(!db.get(worker_id_type()).is_active(db.head_block_time()));