From 5f5d819a1fc609b2fc5f3fcf59618568ec7bd2fc Mon Sep 17 00:00:00 2001 From: Nathan Hourt Date: Wed, 1 Jul 2015 12:10:17 -0400 Subject: [PATCH] Progress #98: Add public key to balance_claim_operation --- .../graphene/chain/balance_evaluator.hpp | 10 +++++- .../include/graphene/chain/operations.hpp | 4 ++- .../chain/transaction_evaluation_state.hpp | 32 ++++++++--------- .../chain/transaction_evaluation_state.cpp | 34 ++++++------------- tests/tests/operation_tests2.cpp | 2 ++ 5 files changed, 38 insertions(+), 44 deletions(-) diff --git a/libraries/chain/include/graphene/chain/balance_evaluator.hpp b/libraries/chain/include/graphene/chain/balance_evaluator.hpp index 5dc976c8..fb3276d6 100644 --- a/libraries/chain/include/graphene/chain/balance_evaluator.hpp +++ b/libraries/chain/include/graphene/chain/balance_evaluator.hpp @@ -21,7 +21,15 @@ public: database& d = db(); balance = &op.balance_to_claim(d); - FC_ASSERT(trx_state->signed_by( balance->owner, true /*maybe pts*/ )); + FC_ASSERT(op.balance_owner_key == balance->owner || + pts_address(op.balance_owner_key, false, 56) == balance->owner || + pts_address(op.balance_owner_key, true, 56) == balance->owner || + pts_address(op.balance_owner_key, false, 0) == balance->owner || + pts_address(op.balance_owner_key, true, 0) == balance->owner, + "balance_owner_key does not match balance's owner"); + if( !(d.get_node_properties().skip_flags & (database::skip_authority_check | + database::skip_transaction_signatures)) ) + FC_ASSERT(trx_state->signed_by(op.balance_owner_key)); FC_ASSERT(op.total_claimed.asset_id == balance->asset_type()); if( balance->vesting_policy.valid() ) { diff --git a/libraries/chain/include/graphene/chain/operations.hpp b/libraries/chain/include/graphene/chain/operations.hpp index 9b2e4e2d..cb0c5494 100644 --- a/libraries/chain/include/graphene/chain/operations.hpp +++ b/libraries/chain/include/graphene/chain/operations.hpp @@ -143,6 +143,7 @@ namespace graphene { namespace chain { asset fee; account_id_type deposit_to_account; balance_id_type balance_to_claim; + public_key_type balance_owner_key; asset total_claimed; account_id_type fee_payer()const { return deposit_to_account; } @@ -1651,7 +1652,8 @@ FC_REFLECT( graphene::chain::custom_operation, (fee)(payer)(required_auths)(id)( FC_REFLECT( graphene::chain::assert_operation, (fee)(fee_paying_account)(predicates)(required_auths) ) FC_REFLECT( graphene::chain::void_result, ) -FC_REFLECT( graphene::chain::balance_claim_operation, (fee)(deposit_to_account)(balance_to_claim)(total_claimed) ) +FC_REFLECT( graphene::chain::balance_claim_operation, + (fee)(deposit_to_account)(balance_to_claim)(balance_owner_key)(total_claimed) ) FC_REFLECT_TYPENAME( graphene::chain::operation ) FC_REFLECT_TYPENAME( graphene::chain::operation_result ) diff --git a/libraries/chain/include/graphene/chain/transaction_evaluation_state.hpp b/libraries/chain/include/graphene/chain/transaction_evaluation_state.hpp index 7c0ececd..6f914e2b 100644 --- a/libraries/chain/include/graphene/chain/transaction_evaluation_state.hpp +++ b/libraries/chain/include/graphene/chain/transaction_evaluation_state.hpp @@ -25,10 +25,8 @@ namespace graphene { namespace chain { struct signed_transaction; /** - * Place holder for state tracked while processing a - * transaction. This class provides helper methods - * that are common to many different operations and - * also tracks which keys have signed the transaction + * Place holder for state tracked while processing a transaction. This class provides helper methods that are + * common to many different operations and also tracks which keys have signed the transaction */ class transaction_evaluation_state { @@ -36,26 +34,24 @@ namespace graphene { namespace chain { transaction_evaluation_state( database* db = nullptr ) :_db(db){} - bool check_authority( const account_object&, authority::classification auth_class = authority::active, int depth = 0 ); + bool check_authority(const account_object&, + authority::classification auth_class = authority::active, + int depth = 0); database& db()const { FC_ASSERT( _db ); return *_db; } - bool signed_by( key_id_type id ); - bool signed_by( const address& a, bool maybe_pts = false ); + bool signed_by(key_id_type id); + bool signed_by(const public_key_type& k); - /** derived from signatures on transaction - flat_set
signed_by; - */ - /** cached approval (accounts and keys) */ - flat_set< pair > approved_by; + /// cached approval (accounts and keys) + flat_set> approved_by; + + /// Used to look up new objects using transaction relative IDs + vector operation_results; /** - * Used to lookup new objects using transaction relative IDs - */ - vector operation_results; - - /** When an address is referenced via check authority it is flagged as being used, - * all addresses must be flagged as being used or the transaction will fail. + * When an address is referenced via check authority it is flagged as being used, all addresses must be + * flagged as being used or the transaction will fail. */ flat_map _sigs; const signed_transaction* _trx = nullptr; diff --git a/libraries/chain/transaction_evaluation_state.cpp b/libraries/chain/transaction_evaluation_state.cpp index e0e8fba4..4f3b10c8 100644 --- a/libraries/chain/transaction_evaluation_state.cpp +++ b/libraries/chain/transaction_evaluation_state.cpp @@ -94,35 +94,21 @@ namespace graphene { namespace chain { } return false; } - bool transaction_evaluation_state::signed_by( key_id_type id ) + bool transaction_evaluation_state::signed_by(key_id_type id) { assert(_trx); assert(_db); - //wdump((_sigs)(id(*_db).key_address())(*_trx) ); - auto itr = _sigs.find( id(*_db).key() ); + + return signed_by(id(*_db).key()); + } + bool transaction_evaluation_state::signed_by(const public_key_type& k) + { + assert(_db); + + auto itr = _sigs.find(k); if( itr != _sigs.end() ) return itr->second = true; - return false; - } - bool transaction_evaluation_state::signed_by( const address& a, bool maybe_pts ) - { - if( _db->get_node_properties().skip_flags & (database::skip_authority_check|database::skip_transaction_signatures) ) - return true; - for( auto itr = _sigs.begin(); itr != _sigs.end(); ++itr ) - { - if( itr->first == a ) return itr->second = true; - if( maybe_pts ) - { - //pts normal - if( pts_address( itr->first, false, 56 ) == a ) return itr->second = true; - //pts compressed - if( pts_address( itr->first, true, 56 ) == a ) return itr->second = true; - // btc normal - if( pts_address( itr->first, false, 0 ) == a ) return itr->second = true; - // btc compressed - if( pts_address( itr->first, true, 0 ) == a ) return itr->second = true; - } - } + return false; } diff --git a/tests/tests/operation_tests2.cpp b/tests/tests/operation_tests2.cpp index 86e660aa..c479356c 100644 --- a/tests/tests/operation_tests2.cpp +++ b/tests/tests/operation_tests2.cpp @@ -993,12 +993,14 @@ BOOST_AUTO_TEST_CASE( balance_object_test ) op.deposit_to_account = db.get_index_type().indices().get().find("n")->get_id(); op.total_claimed = asset(1); op.balance_to_claim = balance_id_type(1); + op.balance_owner_key = generate_private_key("x").get_public_key(); trx.operations = {op}; trx.sign(generate_private_key("n")); // Fail because I'm claiming from an address which hasn't signed BOOST_CHECK_THROW(db.push_transaction(trx), fc::exception); trx.clear(); op.balance_to_claim = balance_id_type(); + op.balance_owner_key = generate_private_key("n").get_public_key(); trx.operations = {op}; trx.sign(generate_private_key("n")); db.push_transaction(trx);