From 293333ddea72d6e3a5c6c9b32ac209955bf0b51b Mon Sep 17 00:00:00 2001 From: satyakoneru Date: Thu, 30 Jan 2020 10:06:39 +0000 Subject: [PATCH] SON232 - Avoid duplicate proposals from sidechain plugin --- libraries/chain/db_getter.cpp | 18 +++++++++++++++++- libraries/chain/db_update.cpp | 1 + .../chain/include/graphene/chain/database.hpp | 1 + .../graphene/chain/proposal_evaluator.hpp | 1 + .../graphene/chain/son_proposal_object.hpp | 5 +++-- libraries/chain/proposal_evaluator.cpp | 9 +++++++++ .../peerplays_sidechain_plugin.cpp | 6 ++++-- 7 files changed, 36 insertions(+), 5 deletions(-) diff --git a/libraries/chain/db_getter.cpp b/libraries/chain/db_getter.cpp index a23ff6de..9749d642 100644 --- a/libraries/chain/db_getter.cpp +++ b/libraries/chain/db_getter.cpp @@ -179,6 +179,21 @@ std::set database::get_sons_to_be_deregistered() return ret; } +std::set database::get_sons_being_reported_down() +{ + std::set ret; + const auto& son_proposal_idx = get_index_type().indices().get< by_id >(); + + for( auto& son_proposal : son_proposal_idx ) + { + if(son_proposal.proposal_type == son_proposal_type::son_report_down_proposal) + { + ret.insert(son_proposal.son_id); + } + } + return ret; +} + fc::optional database::create_son_deregister_proposal(const son_id_type& son_id, const witness_object& current_witness ) { son_delete_operation son_dereg_op; @@ -235,7 +250,8 @@ void database::process_son_proposals( const witness_object& current_witness, con void database::remove_son_proposal( const proposal_object& proposal ) { try { if( proposal.proposed_transaction.operations.size() == 1 && - ( proposal.proposed_transaction.operations.back().which() == operation::tag::value) ) + ( proposal.proposed_transaction.operations.back().which() == operation::tag::value || + proposal.proposed_transaction.operations.back().which() == operation::tag::value) ) { const auto& son_proposal_idx = get_index_type().indices().get(); auto son_proposal_itr = son_proposal_idx.find( proposal.id ); diff --git a/libraries/chain/db_update.cpp b/libraries/chain/db_update.cpp index 7df02a39..b33e3819 100644 --- a/libraries/chain/db_update.cpp +++ b/libraries/chain/db_update.cpp @@ -224,6 +224,7 @@ void database::clear_expired_proposals() elog("Failed to apply proposed transaction on its expiration. Deleting it.\n${proposal}\n${error}", ("proposal", proposal)("error", e.to_detail_string())); } + remove_son_proposal(proposal); remove(proposal); } } diff --git a/libraries/chain/include/graphene/chain/database.hpp b/libraries/chain/include/graphene/chain/database.hpp index 78d05ef9..56a62577 100644 --- a/libraries/chain/include/graphene/chain/database.hpp +++ b/libraries/chain/include/graphene/chain/database.hpp @@ -300,6 +300,7 @@ namespace graphene { namespace chain { std::vector get_seeds( asset_id_type for_asset, uint8_t count_winners )const; uint64_t get_random_bits( uint64_t bound ); std::set get_sons_being_deregistered(); + std::set get_sons_being_reported_down(); std::set get_sons_to_be_deregistered(); fc::optional create_son_deregister_proposal(const son_id_type& son_id, const witness_object& current_witness ); signed_transaction create_signed_transaction( const fc::ecc::private_key& signing_private_key, const operation& op ); diff --git a/libraries/chain/include/graphene/chain/proposal_evaluator.hpp b/libraries/chain/include/graphene/chain/proposal_evaluator.hpp index a7b76471..7eb32489 100644 --- a/libraries/chain/include/graphene/chain/proposal_evaluator.hpp +++ b/libraries/chain/include/graphene/chain/proposal_evaluator.hpp @@ -43,6 +43,7 @@ namespace graphene { namespace chain { void operator()( const T &v ) const {} void operator()( const son_delete_operation &v ); + void operator()( const son_report_down_operation &v ); }; class proposal_create_evaluator : public evaluator diff --git a/libraries/chain/include/graphene/chain/son_proposal_object.hpp b/libraries/chain/include/graphene/chain/son_proposal_object.hpp index a8eb5384..7b1674b8 100644 --- a/libraries/chain/include/graphene/chain/son_proposal_object.hpp +++ b/libraries/chain/include/graphene/chain/son_proposal_object.hpp @@ -8,7 +8,8 @@ namespace graphene { namespace chain { enum class son_proposal_type { - son_deregister_proposal + son_deregister_proposal, + son_report_down_proposal }; class son_proposal_object : public abstract_object @@ -36,6 +37,6 @@ using son_proposal_index = generic_index([&]( son_proposal_object& son_prop ) { + son_prop.proposal_type = son_proposal_type::son_report_down_proposal; + son_prop.proposal_id = prop_id; + son_prop.son_id = v.son_id; + }); +} + void_result proposal_create_evaluator::do_evaluate(const proposal_create_operation& o) { try { const database& d = db(); diff --git a/libraries/plugins/peerplays_sidechain/peerplays_sidechain_plugin.cpp b/libraries/plugins/peerplays_sidechain/peerplays_sidechain_plugin.cpp index 2f57715a..59ea5786 100644 --- a/libraries/plugins/peerplays_sidechain/peerplays_sidechain_plugin.cpp +++ b/libraries/plugins/peerplays_sidechain/peerplays_sidechain_plugin.cpp @@ -248,10 +248,12 @@ void peerplays_sidechain_plugin_impl::create_son_down_proposals() chain::database& d = plugin.database(); const chain::global_property_object& gpo = d.get_global_properties(); const auto& idx = d.get_index_type().indices().get(); + std::set sons_being_reported_down = d.get_sons_being_reported_down(); chain::son_id_type my_son_id = *(_sons.begin()); for(auto son_inf: gpo.active_sons) { - if(my_son_id == son_inf.son_id) + if(my_son_id == son_inf.son_id || (sons_being_reported_down.find(son_inf.son_id) != sons_being_reported_down.end())){ continue; + } auto son_obj = idx.find( son_inf.son_id ); auto stats = son_obj->statistics(d); fc::time_point_sec last_active_ts = stats.last_active_timestamp; @@ -339,7 +341,7 @@ void peerplays_sidechain_plugin_impl::on_objects_new(const vector() ) { const object* obj = d.find_object(object_id); const chain::proposal_object* proposal = dynamic_cast(obj); - if(proposal == nullptr) { + if(proposal == nullptr || (proposal->available_active_approvals.find(son_obj->son_account) != proposal->available_active_approvals.end())) { return; }