提交 89f1a347 编写于 作者: W Wang Zhi

implement YTA chain BP election policy -- fix some bugs about vector usage

上级 fbd30bad
......@@ -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<eosio::producer_key,uint16_t> > 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<account_name>& 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" );
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册