This commit is contained in:
Nathan Hourt 2015-06-18 15:51:11 -04:00
parent a14500a364
commit ec76179b0b
3 changed files with 50 additions and 11 deletions

View file

@ -515,6 +515,7 @@ processed_transaction database::_apply_transaction( const signed_transaction& tr
eval_state.operation_results.reserve( trx.operations.size() );
//Finally process the operations
processed_transaction ptrx(trx);
_current_op_in_trx = 0;
for( const auto& op : ptrx.operations )
@ -524,6 +525,11 @@ processed_transaction database::_apply_transaction( const signed_transaction& tr
}
ptrx.operation_results = std::move( eval_state.operation_results );
//Make sure the temp account has no non-zero balances
const auto& index = get_index_type<account_balance_index>().indices().get<by_account>();
auto range = index.equal_range(GRAPHENE_TEMP_ACCOUNT);
std::for_each(range.first, range.second, [](const account_balance_object& b) { FC_ASSERT(b.balance == 0); });
return ptrx;
} FC_CAPTURE_AND_RETHROW( (trx) ) }

View file

@ -155,8 +155,9 @@ void database::init_genesis(const genesis_state_type& genesis_state)
n.membership_expiration_date = time_point_sec::maximum();
n.network_fee_percentage = GRAPHENE_DEFAULT_NETWORK_PERCENT_OF_FEE;
n.lifetime_referrer_fee_percentage = GRAPHENE_100_PERCENT - GRAPHENE_DEFAULT_NETWORK_PERCENT_OF_FEE;
n.owner.weight_threshold = 1;
n.active.weight_threshold = 1;
n.name = "committee-account";
n.active = n.owner;
n.statistics = create<account_statistics_object>( [&](account_statistics_object& b){}).id;
});
FC_ASSERT(committee_account.get_id() == GRAPHENE_COMMITTEE_ACCOUNT);
@ -183,8 +184,8 @@ void database::init_genesis(const genesis_state_type& genesis_state)
FC_ASSERT(create<account_object>([this](account_object& a) {
a.name = "null-account";
a.statistics = create<account_statistics_object>([](account_statistics_object&){}).id;
a.owner.weight_threshold = 0;
a.active.weight_threshold = 0;
a.owner.weight_threshold = 1;
a.active.weight_threshold = 1;
a.registrar = a.lifetime_referrer = a.referrer = GRAPHENE_NULL_ACCOUNT;
a.membership_expiration_date = time_point_sec::maximum();
a.network_fee_percentage = GRAPHENE_DEFAULT_NETWORK_PERCENT_OF_FEE;

View file

@ -100,6 +100,34 @@ void database::update_active_witnesses()
auto wits = sort_votable_objects<witness_object>(std::max(witness_count*2+1, GRAPHENE_MIN_WITNESS_COUNT));
const global_property_object& gpo = get_global_properties();
// Update witness authority
modify( get(GRAPHENE_WITNESS_ACCOUNT), [&]( account_object& a ) {
uint64_t total_votes = 0;
map<account_id_type, uint64_t> weights;
a.active.weight_threshold = 0;
a.active.auths.clear();
for( const witness_object& wit : wits )
{
weights.emplace(wit.witness_account, _vote_tally_buffer[wit.vote_id]);
total_votes += _vote_tally_buffer[wit.vote_id];
}
// total_votes is 64 bits. Subtract the number of leading low bits from 64 to get the number of useful bits,
// then I want to keep the most significant 16 bits of what's left.
int8_t bits_to_drop = std::max(int(boost::multiprecision::detail::find_msb(total_votes)) - 15, 0);
for( const auto& weight : weights )
{
// Ensure that everyone has at least one vote. Zero weights aren't allowed.
uint16_t votes = std::max((weight.second >> bits_to_drop), uint64_t(1) );
a.active.auths[weight.first] += votes;
a.active.weight_threshold += votes;
}
a.active.weight_threshold /= 2;
a.active.weight_threshold += 1;
});
modify( gpo, [&]( global_property_object& gp ){
gp.active_witnesses.clear();
gp.active_witnesses.reserve( wits.size() );
@ -139,11 +167,12 @@ void database::update_active_delegates()
// Update genesis authorities
if( !delegates.empty() )
modify( get(account_id_type()), [&]( account_object& a ) {
{
modify( get(GRAPHENE_COMMITTEE_ACCOUNT), [&]( account_object& a ) {
uint64_t total_votes = 0;
map<account_id_type, uint64_t> weights;
a.owner.weight_threshold = 0;
a.owner.auths.clear();
a.active.weight_threshold = 0;
a.active.auths.clear();
for( const delegate_object& del : delegates )
{
@ -158,14 +187,17 @@ void database::update_active_delegates()
{
// Ensure that everyone has at least one vote. Zero weights aren't allowed.
uint16_t votes = std::max((weight.second >> bits_to_drop), uint64_t(1) );
a.owner.auths[weight.first] += votes;
a.owner.weight_threshold += votes;
a.active.auths[weight.first] += votes;
a.active.weight_threshold += votes;
}
a.owner.weight_threshold /= 2;
a.owner.weight_threshold += 1;
a.active = a.owner;
a.active.weight_threshold /= 2;
a.active.weight_threshold += 1;
});
modify( get(GRAPHENE_RELAXED_COMMITTEE_ACCOUNT), [&](account_object& a) {
a.active = get(GRAPHENE_COMMITTEE_ACCOUNT).active;
});
}
modify( get_global_properties(), [&]( global_property_object& gp ) {
gp.active_delegates.clear();
std::transform(delegates.begin(), delegates.end(),