From 7428c104140c5ce1f3628c291e67399cbd430d39 Mon Sep 17 00:00:00 2001 From: Alexander Suslikov Date: Fri, 8 Feb 2019 18:18:41 +0300 Subject: [PATCH] Added resend flag into info_for_vin, changed comparer, made test for comparer --- .../chain/bitcoin_transaction_evaluator.cpp | 8 ++-- .../chain/info_for_used_vin_object.hpp | 4 +- .../sidechain/input_withdrawal_info.hpp | 11 ++--- libraries/sidechain/input_withdrawal_info.cpp | 14 +++--- .../input_withdrawal_info_tests.cpp | 44 +++++++++++++++++++ .../sidechain_operation_tests.cpp | 2 - 6 files changed, 62 insertions(+), 21 deletions(-) diff --git a/libraries/chain/bitcoin_transaction_evaluator.cpp b/libraries/chain/bitcoin_transaction_evaluator.cpp index 00b22b3d..0de58848 100644 --- a/libraries/chain/bitcoin_transaction_evaluator.cpp +++ b/libraries/chain/bitcoin_transaction_evaluator.cpp @@ -257,13 +257,11 @@ void_result bitcoin_transaction_revert_evaluator::do_apply( const bitcoin_transa for( const auto& vin_id : btc_trx_obj.vins ) { const auto& vin_obj = *vins_info_idx.find( vin_id ); + if( trx_info.valid_vins.count( fc::sha256 ( vin_obj.out.hash_tx ) ) ) { - d.modify( vin_obj, [&]( info_for_used_vin_object& obj ){ - obj.resend = true; - }); - } else { - d.remove( vin_obj ); + d.i_w_info.insert_info_for_vin( vin_obj.out, vin_obj.address, vin_obj.script, true ); } + d.remove( vin_obj ); } d.bitcoin_confirmations.remove( trx_info.transaction_id ); d.remove( btc_trx_obj ); diff --git a/libraries/chain/include/graphene/chain/info_for_used_vin_object.hpp b/libraries/chain/include/graphene/chain/info_for_used_vin_object.hpp index 5da7314b..abd4ff67 100644 --- a/libraries/chain/include/graphene/chain/info_for_used_vin_object.hpp +++ b/libraries/chain/include/graphene/chain/info_for_used_vin_object.hpp @@ -20,8 +20,6 @@ class info_for_used_vin_object : public abstract_object, member>, ordered_unique, member>, - ordered_non_unique, identity< info_for_vin >, info_for_vin::comparer > + ordered_non_unique, identity< info_for_vin >, info_for_vin::comparer > > >; @@ -69,7 +70,7 @@ public: fc::optional get_info_for_pw_vin(); - void insert_info_for_vin( const prev_out& out, const std::string& address, bytes script = bytes() ); + void insert_info_for_vin( const prev_out& out, const std::string& address, bytes script = bytes(), bool resend = false ); void modify_info_for_vin( const info_for_vin& obj, const std::function& func ); @@ -110,4 +111,4 @@ private: } -FC_REFLECT( sidechain::info_for_vin, (identifier)(out)(address)(script)(used) ) \ No newline at end of file +FC_REFLECT( sidechain::info_for_vin, (identifier)(out)(address)(script)(used)(resend) ) \ No newline at end of file diff --git a/libraries/sidechain/input_withdrawal_info.cpp b/libraries/sidechain/input_withdrawal_info.cpp index 7eebf539..63592291 100644 --- a/libraries/sidechain/input_withdrawal_info.cpp +++ b/libraries/sidechain/input_withdrawal_info.cpp @@ -9,8 +9,8 @@ namespace sidechain { uint64_t info_for_vin::count_id_info_for_vin = 0; uint64_t bitcoin_transaction_confirmations::count_id_tx_conf = 0; -info_for_vin::info_for_vin( const prev_out& _out, const std::string& _address, bytes _script ) : - id( count_id_info_for_vin++ ), out( _out ), address( _address ), script( _script ) +info_for_vin::info_for_vin( const prev_out& _out, const std::string& _address, bytes _script, bool _resend ) : + id( count_id_info_for_vin++ ), out( _out ), address( _address ), script( _script ), resend( _resend ) { identifier = fc::sha256::hash( out.hash_tx + std::to_string( out.n_vout ) ); } @@ -33,6 +33,8 @@ bool info_for_vin::comparer::operator() ( const info_for_vin& lhs, const info_fo { if( lhs.used != rhs.used ) { return lhs.used < rhs.used; + } else if ( lhs.resend != rhs.resend ) { + return lhs.resend > rhs.resend; } return lhs.id < rhs.id; } @@ -75,9 +77,9 @@ fc::optional input_withdrawal_info::get_info_for_pw_vin() return vin; } -void input_withdrawal_info::insert_info_for_vin( const prev_out& out, const std::string& address, bytes script ) +void input_withdrawal_info::insert_info_for_vin( const prev_out& out, const std::string& address, bytes script, bool resend ) { - info_for_vins.insert( info_for_vin( out, address, script ) ); + info_for_vins.insert( info_for_vin( out, address, script, resend ) ); } void input_withdrawal_info::modify_info_for_vin( const info_for_vin& obj, const std::function& func ) @@ -114,8 +116,8 @@ std::vector input_withdrawal_info::get_info_for_vins() std::vector result; const auto max_vins = db.get_sidechain_params().maximum_condensing_tx_vins; - info_for_vins.safe_for( [&]( info_for_vin_index::index::type::iterator itr_b, - info_for_vin_index::index::type::iterator itr_e ) + info_for_vins.safe_for( [&]( info_for_vin_index::index::type::iterator itr_b, + info_for_vin_index::index::type::iterator itr_e ) { for( size_t i = 0; itr_b != itr_e && i < max_vins && !itr_b->used; i++ ) { info_for_vin vin; diff --git a/tests/sidechain_tests/input_withdrawal_info_tests.cpp b/tests/sidechain_tests/input_withdrawal_info_tests.cpp index 05d43a85..c658e542 100644 --- a/tests/sidechain_tests/input_withdrawal_info_tests.cpp +++ b/tests/sidechain_tests/input_withdrawal_info_tests.cpp @@ -227,4 +227,48 @@ BOOST_AUTO_TEST_CASE( input_withdrawal_info_get_info_for_vouts_test ) BOOST_CHECK( vouts2.size() == 3 ); } +BOOST_AUTO_TEST_CASE( info_for_vin_comparer_tests ) +{ + input_withdrawal_info infos( db ); + + auto vins_checker = [&]( std::vector vins_id ) { + auto vins = infos.get_info_for_vins(); + auto i = 0; + for( uint32_t j : vins_id ) { + BOOST_CHECK( vins[i].out.hash_tx == std::to_string( j ) ); + BOOST_CHECK( vins[i].out.n_vout == j ); + BOOST_CHECK( vins[i].out.amount == j ); + BOOST_CHECK( vins[i].address == "addr" + std::to_string( j ) ); + i++; + } + }; + + for( size_t i = 0; i < 10; i++ ) { + prev_out out = { std::to_string( i ), static_cast( i ), static_cast< uint64_t >( i ) }; + bool resend = ( i % 2 == 0 ) ? true : false; + infos.insert_info_for_vin( out, "addr" + std::to_string( i ), { 0x01, 0x02, 0x03 }, resend ); + } + vins_checker( { 0, 2, 4, 6, 8 } ); + + for( size_t i = 0; i < 5; i++ ) { + auto identifier = fc::sha256::hash( std::to_string( i ) + std::to_string( i ) ); + auto iter = infos.find_info_for_vin( identifier ); + infos.mark_as_used_vin( *iter ); + } + vins_checker( { 6, 8, 5, 7, 9 } ); + + for( auto i : { 6, 8 } ) { + auto identifier = fc::sha256::hash( std::to_string( i ) + std::to_string( i ) ); + auto iter = infos.find_info_for_vin( identifier ); + infos.mark_as_used_vin( *iter ); + } + vins_checker( { 5, 7, 9 } ); + + for( size_t i = 10; i < 14; i++ ) { + prev_out out = { std::to_string( i ), static_cast( i ), static_cast< uint64_t >( i ) }; + infos.insert_info_for_vin( out, "addr" + std::to_string( i ), { 0x01, 0x02, 0x03 }, true ); + } + vins_checker( { 10, 11, 12, 13, 5 } ); +} + BOOST_AUTO_TEST_SUITE_END() diff --git a/tests/sidechain_tests/sidechain_operation_tests.cpp b/tests/sidechain_tests/sidechain_operation_tests.cpp index bc5f6aa6..8eb5b28d 100644 --- a/tests/sidechain_tests/sidechain_operation_tests.cpp +++ b/tests/sidechain_tests/sidechain_operation_tests.cpp @@ -216,8 +216,6 @@ BOOST_AUTO_TEST_CASE( bitcoin_transaction_revert_operation_test ) auto vin_itr = vins_info_idx.find( fc::sha256( std::string( 64, '1' ) ) ); BOOST_CHECK( vin_itr != vins_info_idx.end() ); - BOOST_CHECK( vin_itr->resend ); - BOOST_CHECK( vouts_info_idx.size() == 3 ); auto vout_itr = vouts_info_idx.begin();