From 89f1a3479bc2af4d57df9373aa43dc645152c802 Mon Sep 17 00:00:00 2001 From: Wang Zhi Date: Fri, 19 Jul 2019 18:46:52 +0800 Subject: [PATCH] implement YTA chain BP election policy -- fix some bugs about vector usage --- contracts/eosio.system/voting.cpp | 183 +++++++++++++++++++++++++++--- 1 file changed, 169 insertions(+), 14 deletions(-) diff --git a/contracts/eosio.system/voting.cpp b/contracts/eosio.system/voting.cpp index 60cdfb490..63a804325 100644 --- a/contracts/eosio.system/voting.cpp +++ b/contracts/eosio.system/voting.cpp @@ -336,6 +336,12 @@ namespace eosiosystem { void system_contract::testnewelec() { require_auth( _self ); + block_timestamp block_time; + update_elected_producers_yta2( block_time ); + + + +/* std::vector< std::pair > top_producers; top_producers.reserve(21); @@ -375,6 +381,8 @@ namespace eosiosystem { print("\n"); } print("producers end------------------------------\n"); +*/ + } @@ -411,11 +419,82 @@ namespace eosiosystem { if (!_all_prods.exists()) return; + _all_prods_state = _all_prods.get(); + +/* + for(int i = 0 ; i < 3 ; i++) { + yta_prod_info info; + info.total_votes = 50000000000; + info.all_stake = 50000000000; + info.is_active = true; + info.is_in_grace = false; + _all_prods_state.prods_l1.push_back(info); + } + _all_prods_state.prods_l1[0].owner = N(producer1); + _all_prods_state.prods_l1[0].is_active = false; + _all_prods_state.prods_l1[1].owner = N(producer2); + _all_prods_state.prods_l1[1].is_in_grace = true; + _all_prods_state.prods_l1[1].total_votes = 10000000000; + _all_prods_state.prods_l1[2].owner = N(producer3); + + + for(int i = 0 ; i < 6 ; i++) { + yta_prod_info info; + info.total_votes = 20000000000; + info.all_stake = 20000000000; + info.is_active = true; + info.is_in_grace = false; + _all_prods_state.prods_l2.push_back(info); + } + _all_prods_state.prods_l2[0].owner = N(producer11); + _all_prods_state.prods_l2[1].owner = N(producer12); + _all_prods_state.prods_l2[2].owner = N(producer13); + _all_prods_state.prods_l2[3].owner = N(producer14); + _all_prods_state.prods_l2[3].is_in_grace = true; + _all_prods_state.prods_l2[3].total_votes = 15000000000; + _all_prods_state.prods_l2[4].owner = N(producer15); + _all_prods_state.prods_l2[5].owner = N(producer1a); + + for(int i = 0 ; i < 2 ; i++) { + yta_prod_info info; + info.total_votes = 10000000000; + info.all_stake = 10000000000; + info.is_active = true; + info.is_in_grace = false; + _all_prods_state.prods_l3.push_back(info); + } + _all_prods_state.prods_l3[0].owner = N(producer21); + _all_prods_state.prods_l3[0].total_votes = 21000000000; + _all_prods_state.prods_l3[1].owner = N(producer22); + + print("before-----------------------------------\n"); + print("level 1-----------------------------------\n"); for( auto it =_all_prods_state.prods_l1.begin(); it != _all_prods_state.prods_l1.end(); it++ ) { + print("producer - ", (name{it->owner}), "--", (int64_t)it->total_votes, " --\n"); + } + print("level 2-----------------------------------\n"); + for( auto it =_all_prods_state.prods_l2.begin(); it != _all_prods_state.prods_l2.end(); it++ ) { + print("producer - ", (name{it->owner}), "--", (int64_t)it->total_votes, " --\n"); + } + print("level 3-----------------------------------\n"); + for( auto it =_all_prods_state.prods_l3.begin(); it != _all_prods_state.prods_l3.end(); it++ ) { + print("producer - ", (name{it->owner}), "--", (int64_t)it->total_votes, " --\n"); + } + + print("level 1 again-----------------------------------\n"); + for( auto it =_all_prods_state.prods_l1.begin(); it != _all_prods_state.prods_l1.end(); it++ ) { + print("producer - ", (name{it->owner}), "--", (int64_t)it->total_votes, " --\n"); + } +*/ + + for( auto it =_all_prods_state.prods_l1.begin(); it != _all_prods_state.prods_l1.end();) { bool is_remove = false; if(!it->is_active) is_remove = true; - if(it->total_votes < 50000000000) { + + //print("-----level1 down--", (name{it->owner}), "---",(int64_t)it->total_votes ,"\n"); + if((int64_t)it->total_votes < 50000000000) { + //print("-----level1 down--", (name{it->owner}), "votes not enough\n"); if(it->is_in_grace) { if(current_time() - it->grace_start_time > useconds_per_day_v) { is_remove = true; @@ -433,15 +512,35 @@ namespace eosiosystem { if(is_remove) { _all_prods_state.prods_l3.push_back(*it); - _all_prods_state.prods_l1.erase(it); + it = _all_prods_state.prods_l1.erase(it); + } else { + ++it; } } +/* + print("step 1-----------------------------------\n"); + print("level 1-----------------------------------\n"); + for( auto it =_all_prods_state.prods_l1.begin(); it != _all_prods_state.prods_l1.end(); it++ ) { + print("producer - ", (name{it->owner}), "--", (int64_t)it->total_votes, " --\n"); + } + print("level 2-----------------------------------\n"); for( auto it =_all_prods_state.prods_l2.begin(); it != _all_prods_state.prods_l2.end(); it++ ) { + print("producer - ", (name{it->owner}), "--", (int64_t)it->total_votes, " --\n"); + } + print("level 3-----------------------------------\n"); + for( auto it =_all_prods_state.prods_l3.begin(); it != _all_prods_state.prods_l3.end(); it++ ) { + print("producer - ", (name{it->owner}), "--", (int64_t)it->total_votes, " --\n"); + } +*/ + + for( auto it =_all_prods_state.prods_l2.begin(); it != _all_prods_state.prods_l2.end();) { bool is_remove = false; if(!it->is_active) is_remove = true; - if(it->total_votes < 20000000000) { + //print("-----level2 down--", (name{it->owner}), "---",(int64_t)it->total_votes ,"\n"); + if((int64_t)it->total_votes < 20000000000) { + //print("-----level2 down--", (name{it->owner}), "votes not enough\n"); if(it->is_in_grace) { if(current_time() - it->grace_start_time > useconds_per_day_v) { is_remove = true; @@ -459,36 +558,92 @@ namespace eosiosystem { if(is_remove) { _all_prods_state.prods_l3.push_back(*it); - _all_prods_state.prods_l2.erase(it); + it = _all_prods_state.prods_l2.erase(it); + } else { + ++it; } } + +/* + print("step 2-----------------------------------\n"); + for( auto it =_all_prods_state.prods_l1.begin(); it != _all_prods_state.prods_l1.end(); it++ ) { + print("producer - ", (name{it->owner}), "--", (int64_t)it->total_votes, " --\n"); + } + print("level 2-----------------------------------\n"); + for( auto it =_all_prods_state.prods_l2.begin(); it != _all_prods_state.prods_l2.end(); it++ ) { + print("producer - ", (name{it->owner}), "--", (int64_t)it->total_votes, " --\n"); + } + print("level 3-----------------------------------\n"); + for( auto it =_all_prods_state.prods_l3.begin(); it != _all_prods_state.prods_l3.end(); it++ ) { + print("producer - ", (name{it->owner}), "--", (int64_t)it->total_votes, " --\n"); + } +*/ std::sort(_all_prods_state.prods_l2.begin(), _all_prods_state.prods_l2.end(), [&](yta_prod_info lhs, yta_prod_info rhs){return lhs.total_votes > rhs.total_votes;}); - for( auto it =_all_prods_state.prods_l2.begin(); it != _all_prods_state.prods_l2.end(); it++ ) { - if(it->total_votes >= 50000000000) { + for( auto it =_all_prods_state.prods_l2.begin(); it != _all_prods_state.prods_l2.end();) { + //print("-----level2 up--", (name{it->owner}), "---",(int64_t)it->total_votes ,"\n"); + if((int64_t)it->total_votes >= 50000000000) { + //print("-----level2 up--", (name{it->owner}), "votes execeed\n"); if(_all_prods_state.prods_l1.size() < 21) { _all_prods_state.prods_l1.push_back(*it); - _all_prods_state.prods_l2.erase(it); + it = _all_prods_state.prods_l2.erase(it); } else { break; } + } else { + ++it; } } - std::sort(_all_prods_state.prods_l3.begin(), _all_prods_state.prods_l3.end(), [&](yta_prod_info lhs, yta_prod_info rhs){return lhs.total_votes > rhs.total_votes;}); +/* + print("step 3-----------------------------------\n"); + for( auto it =_all_prods_state.prods_l1.begin(); it != _all_prods_state.prods_l1.end(); it++ ) { + print("producer - ", (name{it->owner}), "--", (int64_t)it->total_votes, " --\n"); + } + print("level 2-----------------------------------\n"); + for( auto it =_all_prods_state.prods_l2.begin(); it != _all_prods_state.prods_l2.end(); it++ ) { + print("producer - ", (name{it->owner}), "--", (int64_t)it->total_votes, " --\n"); + } + print("level 3-----------------------------------\n"); for( auto it =_all_prods_state.prods_l3.begin(); it != _all_prods_state.prods_l3.end(); it++ ) { - if(it->total_votes >= 20000000000) { - if(_all_prods_state.prods_l3.size() < 105) { + print("producer - ", (name{it->owner}), "--", (int64_t)it->total_votes, " --\n"); + } +*/ + + std::sort(_all_prods_state.prods_l3.begin(), _all_prods_state.prods_l3.end(), [&](yta_prod_info lhs, yta_prod_info rhs){return lhs.total_votes > rhs.total_votes;}); + for( auto it =_all_prods_state.prods_l3.begin(); it != _all_prods_state.prods_l3.end();) { + //print("-----level3 up--", (name{it->owner}), "---",(int64_t)it->total_votes ,"\n"); + if((int64_t)it->total_votes >= 20000000000 && it->is_active) { + //print("-----level3 up--", (name{it->owner}), "votes execeed\n"); + if(_all_prods_state.prods_l2.size() < 105) { _all_prods_state.prods_l2.push_back(*it); - _all_prods_state.prods_l3.erase(it); + it = _all_prods_state.prods_l3.erase(it); } else { break; } + } else { + ++it; } } _all_prods.set(_all_prods_state, _self); +/* + print("after-----------------------------------\n"); + for( auto it =_all_prods_state.prods_l1.begin(); it != _all_prods_state.prods_l1.end(); it++ ) { + print("producer - ", (name{it->owner}), "--", (int64_t)it->total_votes, " --\n"); + } + print("level 2-----------------------------------\n"); + for( auto it =_all_prods_state.prods_l2.begin(); it != _all_prods_state.prods_l2.end(); it++ ) { + print("producer - ", (name{it->owner}), "--", (int64_t)it->total_votes, " --\n"); + } + print("level 3-----------------------------------\n"); + for( auto it =_all_prods_state.prods_l3.begin(); it != _all_prods_state.prods_l3.end(); it++ ) { + print("producer - ", (name{it->owner}), "--", (int64_t)it->total_votes, " --\n"); + } + return; +*/ + ///--------------------------------------------------- _gstate.last_producer_schedule_update = block_time; @@ -660,8 +815,8 @@ namespace eosiosystem { void system_contract::voteproducer( const account_name voter_name, const account_name proxy, const std::vector& producers ) { require_auth( voter_name ); ///@@@@@@@@@@@@@@@@@@@@@ - //eosio_assert(1 == 2, "can not vote now."); - //return; + eosio_assert(1 == 2, "can not vote now."); + return; ///@@@@@@@@@@@@@@@@@@@@ update_votes( voter_name, proxy, producers, true ); @@ -677,7 +832,7 @@ namespace eosiosystem { //##YTA-Change start: //eosio_assert( producers.size() <= 30, "attempt to vote for too many producers" ); // One voter can only vote for one producer - eosio_assert( producers.size() <= 30, "attempt to vote for too many producers" ); + eosio_assert( producers.size() <= 1, "attempt to vote for too many producers" ); //##YTA-Change end: for( size_t i = 1; i < producers.size(); ++i ) { eosio_assert( producers[i-1] < producers[i], "producer votes must be unique and sorted" ); -- GitLab