Fix to roll in GPOS rules, carry votes from 6th sub-period

This commit is contained in:
pbattu123 2019-10-27 12:54:54 -03:00
parent aef57f1720
commit 5f1436b8be
2 changed files with 22 additions and 6 deletions

View file

@ -780,6 +780,16 @@ double database::calculate_vesting_factor(const account_object& stake_account)
uint32_t current_subperiod = get_gpos_current_subperiod(); uint32_t current_subperiod = get_gpos_current_subperiod();
if(current_subperiod == 0 || current_subperiod > number_of_subperiods) return 0; if(current_subperiod == 0 || current_subperiod > number_of_subperiods) return 0;
// On starting new vesting period, all votes become zero until some one votes, To avoid a situation of zero votes,
// changes done to roll in GPOS rules, the vesting factor will be 1 for who ever votes in 6th sub-period of last vesting period
// BLOCKBACK-174 fix
if(current_subperiod == 1 && this->head_block_time() >= HARDFORK_GPOS_TIME + vesting_period) //Applicable only from 2nd vesting period
{
if(last_date_voted > period_start - vesting_subperiod)
return 1; //return vesting factor as 1
}
if(last_date_voted < period_start) return 0; if(last_date_voted < period_start) return 0;
double numerator = number_of_subperiods; double numerator = number_of_subperiods;

View file

@ -110,6 +110,7 @@ struct gpos_fixture: database_fixture
op.account = account_id; op.account = account_id;
op.new_options = account_id(db).options; op.new_options = account_id(db).options;
op.new_options->votes.insert(vote_for); op.new_options->votes.insert(vote_for);
op.extensions.value.update_last_voting_time = true;
trx.operations.push_back(op); trx.operations.push_back(op);
set_expiration(db, trx); set_expiration(db, trx);
trx.validate(); trx.validate();
@ -640,18 +641,23 @@ BOOST_AUTO_TEST_CASE( voting )
BOOST_CHECK_EQUAL(db.get_global_properties().parameters.gpos_period_start(), now.sec_since_epoch()); BOOST_CHECK_EQUAL(db.get_global_properties().parameters.gpos_period_start(), now.sec_since_epoch());
advance_x_maint(5); advance_x_maint(5);
// a new GPOS period is in but vote from user is before the start so his voting power is 0 // a new GPOS period is in but vote from user is before the start. WHo ever votes in 6th sub-period, votes will carry
now = db.head_block_time(); now = db.head_block_time();
BOOST_CHECK_EQUAL(db.get_global_properties().parameters.gpos_period_start(), now.sec_since_epoch()); BOOST_CHECK_EQUAL(db.get_global_properties().parameters.gpos_period_start(), now.sec_since_epoch());
generate_block(); generate_block();
// we are in the second GPOS period, at subperiod 1,
witness1 = witness_id_type(1)(db); witness1 = witness_id_type(1)(db);
witness2 = witness_id_type(2)(db); witness2 = witness_id_type(2)(db);
BOOST_CHECK_EQUAL(witness1.total_votes, 0); BOOST_CHECK_EQUAL(witness1.total_votes, 0);
BOOST_CHECK_EQUAL(witness2.total_votes, 0); //It's critical here, since bob votes in 6th sub-period of last vesting period, witness2 should retain his votes
BOOST_CHECK_EQUAL(witness2.total_votes, 100);
// we are in the second GPOS period, at subperiod 2, lets vote here
// lets vote here from alice to generate votes for witness 1
//vote from bob to reatin VF 1
vote_for(alice_id, witness1.vote_id, alice_private_key);
vote_for(bob_id, witness2.vote_id, bob_private_key); vote_for(bob_id, witness2.vote_id, bob_private_key);
generate_block(); generate_block();
@ -661,7 +667,7 @@ BOOST_AUTO_TEST_CASE( voting )
witness1 = witness_id_type(1)(db); witness1 = witness_id_type(1)(db);
witness2 = witness_id_type(2)(db); witness2 = witness_id_type(2)(db);
BOOST_CHECK_EQUAL(witness1.total_votes, 0); BOOST_CHECK_EQUAL(witness1.total_votes, 100);
BOOST_CHECK_EQUAL(witness2.total_votes, 100); BOOST_CHECK_EQUAL(witness2.total_votes, 100);
advance_x_maint(10); advance_x_maint(10);
@ -669,7 +675,7 @@ BOOST_AUTO_TEST_CASE( voting )
witness1 = witness_id_type(1)(db); witness1 = witness_id_type(1)(db);
witness2 = witness_id_type(2)(db); witness2 = witness_id_type(2)(db);
BOOST_CHECK_EQUAL(witness1.total_votes, 0); BOOST_CHECK_EQUAL(witness1.total_votes, 83);
BOOST_CHECK_EQUAL(witness2.total_votes, 83); BOOST_CHECK_EQUAL(witness2.total_votes, 83);
vote_for(bob_id, witness2.vote_id, bob_private_key); vote_for(bob_id, witness2.vote_id, bob_private_key);
@ -680,7 +686,7 @@ BOOST_AUTO_TEST_CASE( voting )
witness1 = witness_id_type(1)(db); witness1 = witness_id_type(1)(db);
witness2 = witness_id_type(2)(db); witness2 = witness_id_type(2)(db);
BOOST_CHECK_EQUAL(witness1.total_votes, 0); BOOST_CHECK_EQUAL(witness1.total_votes, 66);
BOOST_CHECK_EQUAL(witness2.total_votes, 83); BOOST_CHECK_EQUAL(witness2.total_votes, 83);
// alice votes again, now for witness 2, her vote worth 100 now // alice votes again, now for witness 2, her vote worth 100 now