提交 73b4f458 编写于 作者: W Wang Zhi

update BP rewards policy

上级 4462b188
......@@ -231,18 +231,23 @@ namespace eosiosystem {
auto to_per_block_pay = to_producers / 4;
auto to_per_vote_pay = to_producers - to_per_block_pay;
INLINE_ACTION_SENDER(eosio::token, issue)( N(eosio.token), {{N(eosio),N(active)}},
{N(eosio), asset(new_tokens), std::string("issue tokens for producer pay")} );
INLINE_ACTION_SENDER(eosio::token, transfer)( N(eosio.token), {N(eosio),N(active)},
{ N(eosio), N(hddbasefound), asset(to_per_base_pay), "fund per-base bucket" } );
INLINE_ACTION_SENDER(eosio::token, transfer)( N(eosio.token), {N(eosio),N(active)},
{ N(eosio), N(eosio.bpay), asset(to_per_block_pay), "fund per-block bucket" } );
INLINE_ACTION_SENDER(eosio::token, transfer)( N(eosio.token), {N(eosio),N(active)},
{ N(eosio), N(eosio.vpay), asset(to_per_vote_pay), "fund per-vote bucket" } );
_gstateex.perbase_bucket += to_per_base_pay;
_gstate.pervote_bucket += to_per_vote_pay;
_gstate.perblock_bucket += to_per_block_pay;
......@@ -251,30 +256,47 @@ namespace eosiosystem {
}
int64_t producer_total_base_pay = _gstateex.perbase_bucket;
int64_t producer_total_block_pay = _gstate.pervote_bucket;
int64_t producer_total_vote_pay = _gstate.perblock_bucket;
int64_t producer_total_block_pay = _gstate.perblock_bucket;
int64_t producer_total_vote_pay = _gstate.pervote_bucket;
print("producer_total_base_pay -- ", producer_total_base_pay , "\n");
print("producer_total_block_pay -- ", producer_total_block_pay , "\n");
print("producer_total_vote_pay -- ", producer_total_vote_pay , "\n");
int64_t producer_already_base_pay = 0;
int64_t producer_already_block_pay = 0;
int64_t producer_already_vote_pay = 0;
uint32_t total_unpaid_blocks = _gstate.total_unpaid_blocks;
uint32_t total_unpaid_base_cnt = _gstateex.total_unpaid_base_cnt;
for( auto it = _producers.begin(); it != _producers.end(); it++ ) {
if(!(it->active()))
continue;
auto prodex = _producersext.get(it->owner);
auto& prodex = _producersext.get(it->owner);
int64_t producer_per_base_pay = 0;
if( _gstateex.total_unpaid_base_cnt > 0 ) {
producer_per_base_pay = (_gstateex.perbase_bucket * prodex.unpaid_base_cnt) / _gstateex.total_unpaid_base_cnt;
producer_per_base_pay = (_gstateex.perbase_bucket * prodex.unpaid_base_cnt) / total_unpaid_base_cnt;
}
int64_t producer_per_block_pay = 0;
if( _gstate.total_unpaid_blocks > 0 ) {
producer_per_block_pay = (_gstate.perblock_bucket * it->unpaid_blocks) / _gstate.total_unpaid_blocks;
producer_per_block_pay = (_gstate.perblock_bucket * it->unpaid_blocks) / total_unpaid_blocks;
}
int64_t producer_per_vote_pay = 0;
if( _gstate.total_producer_vote_weight > 0 ) {
producer_per_vote_pay = int64_t((_gstate.pervote_bucket * it->total_votes ) / _gstate.total_producer_vote_weight);
}
print("producer_per_base_pay -- ", producer_per_base_pay , "\n");
print("producer_per_block_pay -- ", producer_per_block_pay , "\n");
print("producer_per_vote_pay -- ", producer_per_vote_pay , "\n");
_gstate.total_unpaid_blocks -= it->unpaid_blocks;
_gstateex.total_unpaid_base_cnt -= prodex.unpaid_base_cnt;
_producers.modify( it, 0, [&](auto& p) {
p.last_claim_time = ct;
p.unpaid_blocks = 0;
......@@ -284,32 +306,40 @@ namespace eosiosystem {
p.unpaid_base_cnt = 0;
});
_gstate.total_unpaid_blocks -= it->unpaid_blocks;
_gstateex.total_unpaid_base_cnt -= prodex.unpaid_base_cnt;
if( producer_per_base_pay > 0 && ((producer_per_base_pay + producer_already_base_pay) <= producer_total_base_pay) ) {
producer_already_base_pay += producer_per_base_pay;
INLINE_ACTION_SENDER(eosio::token, transfer)( N(eosio.token), {N(hddbasefound),N(active)},
{ N(hddbasefound), it->owner, asset(producer_per_base_pay), std::string("producer base pay") } );
}
if( producer_per_block_pay > 0 && ((producer_per_block_pay + producer_already_block_pay) <= producer_total_block_pay) ) {
producer_already_block_pay += producer_per_block_pay;
INLINE_ACTION_SENDER(eosio::token, transfer)( N(eosio.token), {N(eosio.bpay),N(active)},
{ N(eosio.bpay), it->owner, asset(producer_per_block_pay), std::string("producer block pay") } );
}
if( producer_per_vote_pay > 0 && ((producer_per_vote_pay + producer_already_vote_pay) <= producer_total_vote_pay) ) {
producer_already_vote_pay += producer_per_vote_pay;
INLINE_ACTION_SENDER(eosio::token, transfer)( N(eosio.token), {N(eosio.vpay),N(active)},
{ N(eosio.vpay), it->owner, asset(producer_per_vote_pay), std::string("producer vote pay") } );
}
}
_gstateex.perbase_bucket -= producer_already_base_pay;
_gstate.pervote_bucket -= producer_already_block_pay;
_gstate.perblock_bucket -= producer_already_vote_pay;
_gstate.pervote_bucket -= producer_already_vote_pay;
_gstate.perblock_bucket -= producer_already_block_pay;
if(_gstateex.perbase_bucket < 0 )
_gstateex.perbase_bucket = 0;
if(_gstate.pervote_bucket < 0 )
_gstate.pervote_bucket = 0;
if(_gstate.perblock_bucket < 0 )
_gstate.perblock_bucket = 0;
}
......
......@@ -107,8 +107,16 @@ namespace eosiosystem {
void system_contract::clsprods2() {
require_auth( _self );
while (_producersext.begin() != _producersext.end())
while (_producersext.begin() != _producersext.end()) {
auto it = _producersext.begin();
//it->out_votes
const auto& prod = _producers.get( it->owner, "producer not found" );
_producers.modify( prod, 0, [&]( producer_info& info ){
info.total_votes -= it->out_votes;
});
_gstate.total_producer_vote_weight -= it->out_votes;
_producersext.erase(_producersext.begin());
}
for( uint16_t seq = 1; seq <= 21; seq++ ) {
producers_seq_table _prod_seq( _self, seq );
......@@ -376,9 +384,9 @@ namespace eosiosystem {
const auto& prod = _producers.get( producer, "producer not found" );
//auto it = _producers.find(producer);
//eosio_assert( it != _producers.end() , "producer not found");
int64_t vote_delta = 0;
_producers.modify( prod, 0, [&]( producer_info& info ){
int64_t vote_delta = 0;
auto pitr2 = _producersext.find( producer);
if( pitr2 != _producersext.end() ) {
vote_delta = tickets - pitr2->out_votes;
......@@ -389,7 +397,7 @@ namespace eosiosystem {
update_producers_seq_totalvotes(pitr2->seq_num, producer, info.total_votes);
}
});
_gstate.total_producer_vote_weight += tickets;
_gstate.total_producer_vote_weight += vote_delta;
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册