diff --git a/libraries/chain/account_evaluator.cpp b/libraries/chain/account_evaluator.cpp index 8ff2efcd..9eed05e1 100644 --- a/libraries/chain/account_evaluator.cpp +++ b/libraries/chain/account_evaluator.cpp @@ -191,18 +191,6 @@ object_id_type account_create_evaluator::do_apply( const account_create_operatio obj.active = o.active; obj.options = o.options; - if (!obj.options.extensions.value.num_son.valid()) - { - obj.options.extensions.value.num_son = []{ - flat_map num_son; - for(const auto& active_sidechain_type : all_sidechain_types){ - num_son[active_sidechain_type] = 0; - } - return num_son; - }(); - - } - obj.statistics = d.create([&obj](account_statistics_object& s){ s.owner = obj.id; s.name = obj.name; @@ -343,18 +331,6 @@ void_result account_update_evaluator::do_apply( const account_update_operation& } if( o.new_options ) a.options = *o.new_options; - if (!a.options.extensions.value.num_son.valid()) - { - a.options.extensions.value.num_son = []{ - flat_map num_son; - for(const auto& active_sidechain_type : all_sidechain_types){ - num_son[active_sidechain_type] = 0; - } - return num_son; - }(); - - } - if( o.extensions.value.owner_special_authority.valid() ) { a.owner_special_authority = *(o.extensions.value.owner_special_authority); diff --git a/libraries/chain/db_maint.cpp b/libraries/chain/db_maint.cpp index e4ccc45d..397e9ccd 100644 --- a/libraries/chain/db_maint.cpp +++ b/libraries/chain/db_maint.cpp @@ -2382,7 +2382,24 @@ void database::perform_chain_maintenance(const signed_block& next_block, const g if ( opinion_account.options.extensions.value.num_son.valid() ) { - for(const auto& num_sidechain_son : *opinion_account.options.extensions.value.num_son) { + auto active_sidechains = active_sidechain_types(d.head_block_time()); + auto num_son_map = *opinion_account.options.extensions.value.num_son; + + if ( num_son_map.size() != active_sidechains.size()) + { + for (const auto& num_sidechain_son : num_son_map) + { + FC_ASSERT(active_sidechains.find(num_sidechain_son.first) != active_sidechains.end()); + active_sidechains.erase(num_sidechain_son.first); + } + + for (auto missing_num_son : active_sidechains) + { + num_son_map[missing_num_son] = 0; + } + } + + for(const auto& num_sidechain_son : num_son_map) { const auto sidechain = num_sidechain_son.first; const auto& num_son = num_sidechain_son.second; if (num_son <= props.parameters.maximum_son_count()) { diff --git a/libraries/wallet/wallet.cpp b/libraries/wallet/wallet.cpp index e1363b0b..41522613 100644 --- a/libraries/wallet/wallet.cpp +++ b/libraries/wallet/wallet.cpp @@ -2838,8 +2838,24 @@ public: if (!votes_removed) FC_THROW("Account ${account} is already not voting for SON ${son}", ("account", voting_account)("son", son)); } + auto active_sidechains = active_sidechain_types(time_point::now()); + auto num_son_map = *voting_account_object.options.extensions.value.num_son; + + if ( num_son_map.size() != active_sidechains.size()) + { + for (const auto& num_sidechain_son : num_son_map) + { + FC_ASSERT(active_sidechains.find(num_sidechain_son.first) != active_sidechains.end()); + active_sidechains.erase(num_sidechain_son.first); + } + + for (auto missing_num_son : active_sidechains) + { + num_son_map[missing_num_son] = 0; + } + } FC_ASSERT( voting_account_object.options.extensions.value.num_son.valid() , "Invalid son number" ); - (*voting_account_object.options.extensions.value.num_son)[sidechain] = desired_number_of_sons; + num_son_map[sidechain] = desired_number_of_sons; account_update_operation account_update_op; account_update_op.account = voting_account_object.id;