From 695978cfa1e698c64aaf823dcac47780c4a51735 Mon Sep 17 00:00:00 2001 From: theoreticalbts Date: Wed, 26 Aug 2015 17:30:44 -0400 Subject: [PATCH] Implement committee_member_update operation #258 --- libraries/app/impacted.cpp | 9 ++++++- .../chain/committee_member_evaluator.cpp | 19 ++++++++++++++ libraries/chain/db_init.cpp | 1 + .../chain/committee_member_evaluator.hpp | 10 ++++++- .../chain/protocol/committee_member.hpp | 26 ++++++++++++++++++- .../graphene/chain/protocol/operations.hpp | 1 + libraries/chain/protocol/committee_member.cpp | 8 +++++- 7 files changed, 70 insertions(+), 4 deletions(-) diff --git a/libraries/app/impacted.cpp b/libraries/app/impacted.cpp index 9b49ef7a..c0674621 100644 --- a/libraries/app/impacted.cpp +++ b/libraries/app/impacted.cpp @@ -133,7 +133,14 @@ struct get_impacted_account_visitor _impacted.insert( op.authorized_account ); } - void operator()( const committee_member_create_operation& op ) {} + void operator()( const committee_member_create_operation& op ) + { + _impacted.insert( op.committee_member_account ); + } + void operator()( const committee_member_update_operation& op ) + { + _impacted.insert( op.committee_member_account ); + } void operator()( const committee_member_update_global_parameters_operation& op ) {} void operator()( const vesting_balance_create_operation& op ) diff --git a/libraries/chain/committee_member_evaluator.cpp b/libraries/chain/committee_member_evaluator.cpp index 12f901e7..861e766d 100644 --- a/libraries/chain/committee_member_evaluator.cpp +++ b/libraries/chain/committee_member_evaluator.cpp @@ -48,6 +48,25 @@ object_id_type committee_member_create_evaluator::do_apply( const committee_memb return new_del_object.id; } FC_CAPTURE_AND_RETHROW( (op) ) } +void_result committee_member_update_evaluator::do_evaluate( const committee_member_update_operation& op ) +{ try { + FC_ASSERT(db().get(op.committee_member).committee_member_account == op.committee_member_account); + return void_result(); +} FC_CAPTURE_AND_RETHROW( (op) ) } + +void_result committee_member_update_evaluator::do_apply( const committee_member_update_operation& op ) +{ try { + database& _db = db(); + _db.modify( + _db.get(op.committee_member), + [&]( committee_member_object& com ) + { + if( op.new_url.valid() ) + com.url = *op.new_url; + }); + return void_result(); +} FC_CAPTURE_AND_RETHROW( (op) ) } + void_result committee_member_update_global_parameters_evaluator::do_evaluate(const committee_member_update_global_parameters_operation& o) { try { FC_ASSERT(trx_state->_is_proposed_trx); diff --git a/libraries/chain/db_init.cpp b/libraries/chain/db_init.cpp index d3cefd02..71cb12c7 100644 --- a/libraries/chain/db_init.cpp +++ b/libraries/chain/db_init.cpp @@ -118,6 +118,7 @@ void database::initialize_evaluators() register_evaluator(); register_evaluator(); register_evaluator(); + register_evaluator(); register_evaluator(); register_evaluator(); register_evaluator(); diff --git a/libraries/chain/include/graphene/chain/committee_member_evaluator.hpp b/libraries/chain/include/graphene/chain/committee_member_evaluator.hpp index 1728e77e..eecc860f 100644 --- a/libraries/chain/include/graphene/chain/committee_member_evaluator.hpp +++ b/libraries/chain/include/graphene/chain/committee_member_evaluator.hpp @@ -30,6 +30,15 @@ namespace graphene { namespace chain { object_id_type do_apply( const committee_member_create_operation& o ); }; + class committee_member_update_evaluator : public evaluator + { + public: + typedef committee_member_update_operation operation_type; + + void_result do_evaluate( const committee_member_update_operation& o ); + void_result do_apply( const committee_member_update_operation& o ); + }; + class committee_member_update_global_parameters_evaluator : public evaluator { public: @@ -39,5 +48,4 @@ namespace graphene { namespace chain { void_result do_apply( const committee_member_update_global_parameters_operation& o ); }; - } } // graphene::chain diff --git a/libraries/chain/include/graphene/chain/protocol/committee_member.hpp b/libraries/chain/include/graphene/chain/protocol/committee_member.hpp index 0b774468..9fdf2e35 100644 --- a/libraries/chain/include/graphene/chain/protocol/committee_member.hpp +++ b/libraries/chain/include/graphene/chain/protocol/committee_member.hpp @@ -24,6 +24,28 @@ namespace graphene { namespace chain { void validate()const; }; + /** + * @brief Update a committee_member object. + * @ingroup operations + * + * Currently the only field which can be updated is the `url` + * field. + */ + struct committee_member_update_operation : public base_operation + { + struct fee_parameters_type { uint64_t fee = 20 * GRAPHENE_BLOCKCHAIN_PRECISION; }; + + asset fee; + /// The committee member to update. + committee_member_id_type committee_member; + /// The account which owns the committee_member. This account pays the fee for this operation. + account_id_type committee_member_account; + optional< string > new_url; + + account_id_type fee_payer()const { return committee_member_account; } + void validate()const; + }; + /** * @brief Used by committee_members to update the global parameters of the blockchain. * @ingroup operations @@ -50,10 +72,12 @@ namespace graphene { namespace chain { } } // graphene::chain FC_REFLECT( graphene::chain::committee_member_create_operation::fee_parameters_type, (fee) ) +FC_REFLECT( graphene::chain::committee_member_update_operation::fee_parameters_type, (fee) ) FC_REFLECT( graphene::chain::committee_member_update_global_parameters_operation::fee_parameters_type, (fee) ) FC_REFLECT( graphene::chain::committee_member_create_operation, (fee)(committee_member_account)(url) ) - +FC_REFLECT( graphene::chain::committee_member_update_operation, + (fee)(committee_member)(committee_member_account)(new_url) ) FC_REFLECT( graphene::chain::committee_member_update_global_parameters_operation, (fee)(new_parameters) ); diff --git a/libraries/chain/include/graphene/chain/protocol/operations.hpp b/libraries/chain/include/graphene/chain/protocol/operations.hpp index fd5e8357..b60504bd 100644 --- a/libraries/chain/include/graphene/chain/protocol/operations.hpp +++ b/libraries/chain/include/graphene/chain/protocol/operations.hpp @@ -54,6 +54,7 @@ namespace graphene { namespace chain { withdraw_permission_claim_operation, withdraw_permission_delete_operation, committee_member_create_operation, + committee_member_update_operation, committee_member_update_global_parameters_operation, vesting_balance_create_operation, vesting_balance_withdraw_operation, diff --git a/libraries/chain/protocol/committee_member.cpp b/libraries/chain/protocol/committee_member.cpp index 75b9193a..01d9d22e 100644 --- a/libraries/chain/protocol/committee_member.cpp +++ b/libraries/chain/protocol/committee_member.cpp @@ -9,11 +9,17 @@ void committee_member_create_operation::validate()const FC_ASSERT(url.size() < GRAPHENE_MAX_URL_LENGTH ); } +void committee_member_update_operation::validate()const +{ + FC_ASSERT( fee.amount >= 0 ); + if( new_url.valid() ) + FC_ASSERT(new_url->size() < GRAPHENE_MAX_URL_LENGTH ); +} + void committee_member_update_global_parameters_operation::validate() const { FC_ASSERT( fee.amount >= 0 ); new_parameters.validate(); } - } } // graphene::chain