From 7db477b9d7860a4f0a5a56be21a280e1c6cd4af2 Mon Sep 17 00:00:00 2001 From: theoreticalbts Date: Wed, 26 Aug 2015 16:59:22 -0400 Subject: [PATCH] Implement witness_update_operation #258 --- libraries/app/impacted.cpp | 9 +++++- libraries/chain/db_init.cpp | 3 +- .../graphene/chain/protocol/operations.hpp | 1 + .../graphene/chain/protocol/witness.hpp | 29 ++++++++++++++++++- .../graphene/chain/witness_evaluator.hpp | 9 ++++++ libraries/chain/protocol/witness.cpp | 7 +++++ libraries/chain/witness_evaluator.cpp | 21 ++++++++++++++ 7 files changed, 76 insertions(+), 3 deletions(-) diff --git a/libraries/app/impacted.cpp b/libraries/app/impacted.cpp index 7fb87397..9b49ef7a 100644 --- a/libraries/app/impacted.cpp +++ b/libraries/app/impacted.cpp @@ -92,7 +92,14 @@ struct get_impacted_account_visitor void operator()( const asset_settle_operation& op ) {} void operator()( const asset_global_settle_operation& op ) {} void operator()( const asset_publish_feed_operation& op ) {} - void operator()( const witness_create_operation& op ) {} + void operator()( const witness_create_operation& op ) + { + _impacted.insert( op.witness_account ); + } + void operator()( const witness_update_operation& op ) + { + _impacted.insert( op.witness_account ); + } void operator()( const proposal_create_operation& op ) { diff --git a/libraries/chain/db_init.cpp b/libraries/chain/db_init.cpp index c69e7b91..d3cefd02 100644 --- a/libraries/chain/db_init.cpp +++ b/libraries/chain/db_init.cpp @@ -139,9 +139,10 @@ void database::initialize_evaluators() register_evaluator(); register_evaluator(); register_evaluator(); - register_evaluator(); register_evaluator(); register_evaluator(); + register_evaluator(); + register_evaluator(); register_evaluator(); register_evaluator(); register_evaluator(); diff --git a/libraries/chain/include/graphene/chain/protocol/operations.hpp b/libraries/chain/include/graphene/chain/protocol/operations.hpp index 68860bc2..fd5e8357 100644 --- a/libraries/chain/include/graphene/chain/protocol/operations.hpp +++ b/libraries/chain/include/graphene/chain/protocol/operations.hpp @@ -45,6 +45,7 @@ namespace graphene { namespace chain { asset_global_settle_operation, asset_publish_feed_operation, witness_create_operation, + witness_update_operation, proposal_create_operation, proposal_update_operation, proposal_delete_operation, diff --git a/libraries/chain/include/graphene/chain/protocol/witness.hpp b/libraries/chain/include/graphene/chain/protocol/witness.hpp index 57d5a1ee..f976b857 100644 --- a/libraries/chain/include/graphene/chain/protocol/witness.hpp +++ b/libraries/chain/include/graphene/chain/protocol/witness.hpp @@ -25,10 +25,37 @@ namespace graphene { namespace chain { void validate()const; }; + /** + * @brief Update a witness object's URL and block signing key. + * @ingroup operations + */ + struct witness_update_operation : public base_operation + { + struct fee_parameters_type + { + share_type fee = 20 * GRAPHENE_BLOCKCHAIN_PRECISION; + }; + + asset fee; + /// The witness object to update. + witness_id_type witness; + /// The account which owns the witness. This account pays the fee for this operation. + account_id_type witness_account; + /// The new URL. + optional< string > new_url; + /// The new block signing key. + optional< public_key_type > new_signing_key; + + account_id_type fee_payer()const { return witness_account; } + void validate()const; + }; + /// TODO: witness_resign_operation : public base_operation } } // graphene::chain FC_REFLECT( graphene::chain::witness_create_operation::fee_parameters_type, (fee) ) - FC_REFLECT( graphene::chain::witness_create_operation, (fee)(witness_account)(url)(block_signing_key)(initial_secret) ) + +FC_REFLECT( graphene::chain::witness_update_operation::fee_parameters_type, (fee) ) +FC_REFLECT( graphene::chain::witness_update_operation, (fee)(witness)(witness_account)(new_url)(new_signing_key) ) diff --git a/libraries/chain/include/graphene/chain/witness_evaluator.hpp b/libraries/chain/include/graphene/chain/witness_evaluator.hpp index 4e98cd56..dd10ba06 100644 --- a/libraries/chain/include/graphene/chain/witness_evaluator.hpp +++ b/libraries/chain/include/graphene/chain/witness_evaluator.hpp @@ -30,4 +30,13 @@ namespace graphene { namespace chain { object_id_type do_apply( const witness_create_operation& o ); }; + class witness_update_evaluator : public evaluator + { + public: + typedef witness_update_operation operation_type; + + void_result do_evaluate( const witness_update_operation& o ); + void_result do_apply( const witness_update_operation& o ); + }; + } } // graphene::chain diff --git a/libraries/chain/protocol/witness.cpp b/libraries/chain/protocol/witness.cpp index 12d7ecb0..e7e8a75e 100644 --- a/libraries/chain/protocol/witness.cpp +++ b/libraries/chain/protocol/witness.cpp @@ -9,4 +9,11 @@ void witness_create_operation::validate() const FC_ASSERT(url.size() < GRAPHENE_MAX_URL_LENGTH ); } +void witness_update_operation::validate() const +{ + FC_ASSERT(fee.amount >= 0); + if( new_url.valid() ) + FC_ASSERT(new_url->size() < GRAPHENE_MAX_URL_LENGTH ); +} + } } // graphene::chain diff --git a/libraries/chain/witness_evaluator.cpp b/libraries/chain/witness_evaluator.cpp index cd7787a4..d0e733f1 100644 --- a/libraries/chain/witness_evaluator.cpp +++ b/libraries/chain/witness_evaluator.cpp @@ -47,4 +47,25 @@ object_id_type witness_create_evaluator::do_apply( const witness_create_operatio return new_witness_object.id; } FC_CAPTURE_AND_RETHROW( (op) ) } +void_result witness_update_evaluator::do_evaluate( const witness_update_operation& op ) +{ try { + FC_ASSERT(db().get(op.witness).witness_account == op.witness_account); + return void_result(); +} FC_CAPTURE_AND_RETHROW( (op) ) } + +void_result witness_update_evaluator::do_apply( const witness_update_operation& op ) +{ try { + database& _db = db(); + _db.modify( + _db.get(op.witness), + [&]( witness_object& wit ) + { + if( op.new_url.valid() ) + wit.url = *op.new_url; + if( op.new_signing_key.valid() ) + wit.signing_key = *op.new_signing_key; + }); + return void_result(); +} FC_CAPTURE_AND_RETHROW( (op) ) } + } } // graphene::chain