diff --git a/libraries/chain/CMakeLists.txt b/libraries/chain/CMakeLists.txt index 4e3d4625..bba9e7f1 100644 --- a/libraries/chain/CMakeLists.txt +++ b/libraries/chain/CMakeLists.txt @@ -19,6 +19,7 @@ if( GRAPHENE_DISABLE_UNITY_BUILD ) db_maint.cpp db_management.cpp db_market.cpp + db_sidechain.cpp db_update.cpp db_witness_schedule.cpp ) diff --git a/libraries/chain/database.cpp b/libraries/chain/database.cpp index 7711f543..36e2a161 100644 --- a/libraries/chain/database.cpp +++ b/libraries/chain/database.cpp @@ -31,6 +31,7 @@ #include "db_maint.cpp" #include "db_management.cpp" #include "db_market.cpp" +#include "db_sidechain.cpp" #include "db_update.cpp" #include "db_witness_schedule.cpp" #include "db_notify.cpp" \ No newline at end of file diff --git a/libraries/chain/db_maint.cpp b/libraries/chain/db_maint.cpp index db8db162..ce62a5f3 100644 --- a/libraries/chain/db_maint.cpp +++ b/libraries/chain/db_maint.cpp @@ -461,18 +461,8 @@ void database::update_active_sons() bool son_sets_equal = (cur_active_sons.size() == new_active_sons.size()); if (son_sets_equal) { - for( size_t i = 0; i < cur_active_sons.size(); i++ ) - { - son_sets_equal = son_sets_equal && - cur_active_sons.at(i).son_id == new_active_sons.at(i).son_id && - cur_active_sons.at(i).total_votes == new_active_sons.at(i).total_votes && - cur_active_sons.at(i).signing_key == new_active_sons.at(i).signing_key; - - if (cur_active_sons.at(i).sidechain_public_keys.size() == new_active_sons.at(i).sidechain_public_keys.size()) { - - } else { - son_sets_equal = false; - } + for( size_t i = 0; i < cur_active_sons.size(); i++ ) { + son_sets_equal = son_sets_equal && cur_active_sons.at(i) == new_active_sons.at(i); } } diff --git a/libraries/chain/db_management.cpp b/libraries/chain/db_management.cpp index 029a55d4..f6d164d2 100644 --- a/libraries/chain/db_management.cpp +++ b/libraries/chain/db_management.cpp @@ -40,6 +40,7 @@ database::database() : { initialize_indexes(); initialize_evaluators(); + initialize_db_sidechain(); } database::~database() diff --git a/libraries/chain/db_sidechain.cpp b/libraries/chain/db_sidechain.cpp new file mode 100644 index 00000000..77594b3f --- /dev/null +++ b/libraries/chain/db_sidechain.cpp @@ -0,0 +1,10 @@ +#include + +namespace graphene { namespace chain { + +void database::initialize_db_sidechain() +{ + recreate_primary_wallet = false; +} + +} } diff --git a/libraries/chain/include/graphene/chain/database.hpp b/libraries/chain/include/graphene/chain/database.hpp index 719c6240..78d05ef9 100644 --- a/libraries/chain/include/graphene/chain/database.hpp +++ b/libraries/chain/include/graphene/chain/database.hpp @@ -40,6 +40,8 @@ #include +#include + #include #include @@ -600,6 +602,13 @@ namespace graphene { namespace chain { * database::close() has not been called, or failed during execution. */ bool _opened = false; + + /////////////////////// db_sidechain.cpp //////////////////// + public: + bool recreate_primary_wallet; + void initialize_db_sidechain(); + protected: + private: }; namespace detail diff --git a/libraries/chain/include/graphene/chain/protocol/types.hpp b/libraries/chain/include/graphene/chain/protocol/types.hpp index 5b040850..1d056740 100644 --- a/libraries/chain/include/graphene/chain/protocol/types.hpp +++ b/libraries/chain/include/graphene/chain/protocol/types.hpp @@ -147,6 +147,7 @@ namespace graphene { namespace chain { bet_object_type, son_object_type, son_proposal_object_type, + son_wallet_object_type, sidechain_address_object_type, OBJECT_TYPE_COUNT ///< Sentry value which contains the number of different object types }; @@ -211,6 +212,7 @@ namespace graphene { namespace chain { class bet_object; class son_object; class son_proposal_object; + class son_wallet_object; class sidechain_address_object; typedef object_id< protocol_ids, account_object_type, account_object> account_id_type; @@ -240,6 +242,7 @@ namespace graphene { namespace chain { typedef object_id< protocol_ids, bet_object_type, bet_object> bet_id_type; typedef object_id< protocol_ids, son_object_type, son_object> son_id_type; typedef object_id< protocol_ids, son_proposal_object_type, son_proposal_object> son_proposal_id_type; + typedef object_id< protocol_ids, son_wallet_object_type, son_wallet_object> son_wallet_id_type; typedef object_id< protocol_ids, sidechain_address_object_type, sidechain_address_object> sidechain_address_id_type; // implementation types diff --git a/libraries/chain/include/graphene/chain/son_info.hpp b/libraries/chain/include/graphene/chain/son_info.hpp index 8200ffa2..d30f0f6b 100644 --- a/libraries/chain/include/graphene/chain/son_info.hpp +++ b/libraries/chain/include/graphene/chain/son_info.hpp @@ -15,6 +15,19 @@ namespace graphene { namespace chain { uint64_t total_votes = 0; public_key_type signing_key; flat_map sidechain_public_keys; + + bool operator==(const son_info& rhs) { + bool son_sets_equal = + (son_id == rhs.son_id) && + (total_votes == rhs.total_votes) && + (signing_key == rhs.signing_key) && + (sidechain_public_keys.size() == rhs.sidechain_public_keys.size()); + + if (son_sets_equal) { + // Compare sidechain public keys + } + return son_sets_equal; + } }; } } diff --git a/libraries/chain/include/graphene/chain/son_wallet_object.hpp b/libraries/chain/include/graphene/chain/son_wallet_object.hpp new file mode 100644 index 00000000..c3ea204d --- /dev/null +++ b/libraries/chain/include/graphene/chain/son_wallet_object.hpp @@ -0,0 +1,36 @@ +#pragma once +#include +#include + +namespace graphene { namespace chain { + using namespace graphene::db; + + /** + * @class son_wallet_object + * @brief tracks information about a SON wallet. + * @ingroup object + */ + class son_wallet_object : public abstract_object + { + public: + static const uint8_t space_id = protocol_ids; + static const uint8_t type_id = son_wallet_object_type; + + flat_map addresses; + }; + + struct by_sidechain_type; + struct by_address; + using son_wallet_multi_index_type = multi_index_container< + son_wallet_object, + indexed_by< + ordered_unique< tag, + member + > + > + >; + using son_wallet_index = generic_index; +} } // graphene::chain + +FC_REFLECT_DERIVED( graphene::chain::son_wallet_object, (graphene::db::object), + (addresses) )