diff --git a/libraries/chain/db_maint.cpp b/libraries/chain/db_maint.cpp index d23b0fe2..b8908f11 100644 --- a/libraries/chain/db_maint.cpp +++ b/libraries/chain/db_maint.cpp @@ -653,7 +653,7 @@ void database::update_active_sons() const global_property_object& gpo = get_global_properties(); const chain_parameters& cp = gpo.parameters; - auto sons = sort_votable_objects(cp.maximum_son_count); + auto sons = sort_votable_objects(cp.maximum_son_count()); const auto& all_sons = get_index_type().indices(); @@ -1981,7 +1981,7 @@ void database::perform_chain_maintenance(const signed_block& next_block, const g d._vote_tally_buffer.resize(props.next_available_vote_id); d._witness_count_histogram_buffer.resize(props.parameters.maximum_witness_count / 2 + 1); d._committee_count_histogram_buffer.resize(props.parameters.maximum_committee_count / 2 + 1); - d._son_count_histogram_buffer.resize(props.parameters.maximum_son_count / 2 + 1); + d._son_count_histogram_buffer.resize(props.parameters.maximum_son_count() / 2 + 1); d._total_voting_stake = 0; auto balance_type = vesting_balance_type::normal; @@ -2093,7 +2093,7 @@ void database::perform_chain_maintenance(const signed_block& next_block, const g // same rationale as for witnesses d._committee_count_histogram_buffer[offset] += voting_stake; } - if( opinion_account.options.num_son <= props.parameters.maximum_son_count ) + if( opinion_account.options.num_son <= props.parameters.maximum_son_count() ) { uint16_t offset = std::min(size_t(opinion_account.options.num_son/2), d._son_count_histogram_buffer.size() - 1); @@ -2183,6 +2183,12 @@ void database::perform_chain_maintenance(const signed_block& next_block, const g p.pending_parameters->extensions.value.son_down_time = p.parameters.extensions.value.son_down_time; if( !p.pending_parameters->extensions.value.son_bitcoin_min_tx_confirmations.valid() ) p.pending_parameters->extensions.value.son_bitcoin_min_tx_confirmations = p.parameters.extensions.value.son_bitcoin_min_tx_confirmations; + if( !p.pending_parameters->extensions.value.son_account.valid() ) + p.pending_parameters->extensions.value.son_account = p.parameters.extensions.value.son_account; + if( !p.pending_parameters->extensions.value.btc_asset.valid() ) + p.pending_parameters->extensions.value.btc_asset = p.parameters.extensions.value.btc_asset; + if( !p.pending_parameters->extensions.value.maximum_son_count.valid() ) + p.pending_parameters->extensions.value.maximum_son_count = p.parameters.extensions.value.maximum_son_count; p.parameters = std::move(*p.pending_parameters); p.pending_parameters.reset(); } diff --git a/libraries/chain/include/graphene/chain/budget_record_object.hpp b/libraries/chain/include/graphene/chain/budget_record_object.hpp index 007d46a7..0da71ca5 100644 --- a/libraries/chain/include/graphene/chain/budget_record_object.hpp +++ b/libraries/chain/include/graphene/chain/budget_record_object.hpp @@ -76,7 +76,9 @@ FC_REFLECT(graphene::chain::budget_record, (total_budget) (witness_budget) (worker_budget) + (son_budget) (leftover_worker_funds) + (leftover_son_funds) (supply_delta) ) diff --git a/libraries/chain/include/graphene/chain/protocol/chain_parameters.hpp b/libraries/chain/include/graphene/chain/protocol/chain_parameters.hpp index 0dbf04bd..405704ed 100644 --- a/libraries/chain/include/graphene/chain/protocol/chain_parameters.hpp +++ b/libraries/chain/include/graphene/chain/protocol/chain_parameters.hpp @@ -68,6 +68,7 @@ namespace graphene { namespace chain { optional < account_id_type > son_account; optional < asset_id_type > btc_asset; + optional < uint16_t > maximum_son_count = GRAPHENE_DEFAULT_MAX_SONS; ///< maximum number of active SONS }; struct chain_parameters @@ -86,7 +87,6 @@ namespace graphene { namespace chain { uint8_t maximum_asset_feed_publishers = GRAPHENE_DEFAULT_MAX_ASSET_FEED_PUBLISHERS; ///< the maximum number of feed publishers for a given asset uint16_t maximum_witness_count = GRAPHENE_DEFAULT_MAX_WITNESSES; ///< maximum number of active witnesses uint16_t maximum_committee_count = GRAPHENE_DEFAULT_MAX_COMMITTEE; ///< maximum number of active committee_members - uint16_t maximum_son_count = GRAPHENE_DEFAULT_MAX_SONS; ///< maximum number of active SONS uint16_t maximum_authority_membership = GRAPHENE_DEFAULT_MAX_AUTHORITY_MEMBERSHIP; ///< largest number of keys/accounts an authority can have uint16_t reserve_percent_of_fee = GRAPHENE_DEFAULT_BURN_PERCENT_OF_FEE; ///< the percentage of the network's allocation of a fee that is taken out of circulation uint16_t network_percent_of_fee = GRAPHENE_DEFAULT_NETWORK_PERCENT_OF_FEE; ///< percent of transaction fees paid to network @@ -205,6 +205,9 @@ namespace graphene { namespace chain { inline asset_id_type btc_asset() const { return extensions.value.btc_asset.valid() ? *extensions.value.btc_asset : asset_id_type(); } + inline uint16_t maximum_son_count()const { + return extensions.value.maximum_son_count.valid() ? *extensions.value.maximum_son_count : GRAPHENE_DEFAULT_MAX_SONS; + } }; } } // graphene::chain @@ -237,6 +240,7 @@ FC_REFLECT( graphene::chain::parameter_extension, (son_bitcoin_min_tx_confirmations) (son_account) (btc_asset) + (maximum_son_count) ) FC_REFLECT( graphene::chain::chain_parameters, @@ -253,7 +257,6 @@ FC_REFLECT( graphene::chain::chain_parameters, (maximum_asset_feed_publishers) (maximum_witness_count) (maximum_committee_count) - (maximum_son_count) (maximum_authority_membership) (reserve_percent_of_fee) (network_percent_of_fee) diff --git a/libraries/chain/include/graphene/chain/witness_schedule_object.hpp b/libraries/chain/include/graphene/chain/witness_schedule_object.hpp index b934fd01..2eff563f 100644 --- a/libraries/chain/include/graphene/chain/witness_schedule_object.hpp +++ b/libraries/chain/include/graphene/chain/witness_schedule_object.hpp @@ -57,7 +57,7 @@ typedef generic_far_future_witness_scheduler< typedef generic_witness_scheduler< /* WitnessID = */ son_id_type, /* RNG = */ witness_scheduler_rng, - /* CountType = */ decltype( chain_parameters::maximum_son_count ), + /* CountType = */ decltype( chain_parameters::extensions.value.maximum_son_count )::value_type, /* OffsetType = */ uint32_t, /* debug = */ true > son_scheduler; @@ -65,7 +65,7 @@ typedef generic_witness_scheduler< typedef generic_far_future_witness_scheduler< /* WitnessID = */ son_id_type, /* RNG = */ witness_scheduler_rng, - /* CountType = */ decltype( chain_parameters::maximum_son_count ), + /* CountType = */ decltype( chain_parameters::extensions.value.maximum_son_count )::value_type, /* OffsetType = */ uint32_t, /* debug = */ true > far_future_son_scheduler; diff --git a/programs/witness_node/genesis.json b/programs/witness_node/genesis.json index 192a3879..1e0610f4 100644 --- a/programs/witness_node/genesis.json +++ b/programs/witness_node/genesis.json @@ -344,7 +344,6 @@ "maximum_asset_feed_publishers": 10, "maximum_witness_count": 1001, "maximum_committee_count": 1001, - "maximum_son_count": 15, "maximum_authority_membership": 10, "reserve_percent_of_fee": 2000, "network_percent_of_fee": 2000, @@ -392,7 +391,8 @@ "son_pay_time": 86400, "son_deregister_time": 43200, "son_heartbeat_frequency": 180, - "son_down_time": 360 + "son_down_time": 360, + "maximum_son_count": 15 } }, "initial_bts_accounts": [], diff --git a/tests/cli/son.cpp b/tests/cli/son.cpp index 87febbdd..7b6259d1 100644 --- a/tests/cli/son.cpp +++ b/tests/cli/son.cpp @@ -278,7 +278,7 @@ BOOST_FIXTURE_TEST_CASE( select_top_fifteen_sons, cli_fixture ) global_property_object gpo; gpo = con.wallet_api_ptr->get_global_properties(); - unsigned int son_number = gpo.parameters.maximum_son_count; + unsigned int son_number = gpo.parameters.maximum_son_count(); flat_map sidechain_public_keys; @@ -578,7 +578,7 @@ BOOST_FIXTURE_TEST_CASE( cli_list_active_sons, cli_fixture ) global_property_object gpo; gpo = con.wallet_api_ptr->get_global_properties(); - unsigned int son_number = gpo.parameters.maximum_son_count; + unsigned int son_number = gpo.parameters.maximum_son_count(); flat_map sidechain_public_keys; @@ -645,7 +645,7 @@ BOOST_AUTO_TEST_CASE( maintenance_test ) global_property_object gpo; gpo = con.wallet_api_ptr->get_global_properties(); - unsigned int son_number = gpo.parameters.maximum_son_count; + unsigned int son_number = gpo.parameters.maximum_son_count(); flat_map sidechain_public_keys;