Added resend flag into info_for_vin, changed comparer, made test for comparer
This commit is contained in:
parent
774e7b34cb
commit
7428c10414
6 changed files with 62 additions and 21 deletions
|
|
@ -257,13 +257,11 @@ void_result bitcoin_transaction_revert_evaluator::do_apply( const bitcoin_transa
|
||||||
|
|
||||||
for( const auto& vin_id : btc_trx_obj.vins ) {
|
for( const auto& vin_id : btc_trx_obj.vins ) {
|
||||||
const auto& vin_obj = *vins_info_idx.find( vin_id );
|
const auto& vin_obj = *vins_info_idx.find( vin_id );
|
||||||
|
|
||||||
if( trx_info.valid_vins.count( fc::sha256 ( vin_obj.out.hash_tx ) ) ) {
|
if( trx_info.valid_vins.count( fc::sha256 ( vin_obj.out.hash_tx ) ) ) {
|
||||||
d.modify( vin_obj, [&]( info_for_used_vin_object& obj ){
|
d.i_w_info.insert_info_for_vin( vin_obj.out, vin_obj.address, vin_obj.script, true );
|
||||||
obj.resend = true;
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
d.remove( vin_obj );
|
|
||||||
}
|
}
|
||||||
|
d.remove( vin_obj );
|
||||||
}
|
}
|
||||||
d.bitcoin_confirmations.remove<sidechain::by_hash>( trx_info.transaction_id );
|
d.bitcoin_confirmations.remove<sidechain::by_hash>( trx_info.transaction_id );
|
||||||
d.remove( btc_trx_obj );
|
d.remove( btc_trx_obj );
|
||||||
|
|
|
||||||
|
|
@ -20,8 +20,6 @@ class info_for_used_vin_object : public abstract_object<info_for_used_vin_object
|
||||||
sidechain::prev_out out;
|
sidechain::prev_out out;
|
||||||
std::string address;
|
std::string address;
|
||||||
sidechain::bytes script;
|
sidechain::bytes script;
|
||||||
|
|
||||||
bool resend = false;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct by_id;
|
struct by_id;
|
||||||
|
|
@ -38,4 +36,4 @@ typedef generic_index<info_for_used_vin_object, info_for_used_vin_multi_index_co
|
||||||
|
|
||||||
} } // graphene::chain
|
} } // graphene::chain
|
||||||
|
|
||||||
FC_REFLECT_DERIVED( graphene::chain::info_for_used_vin_object, (graphene::chain::object), (identifier)(out)(address)(script)(resend) )
|
FC_REFLECT_DERIVED( graphene::chain::info_for_used_vin_object, (graphene::chain::object), (identifier)(out)(address)(script) )
|
||||||
|
|
|
||||||
|
|
@ -22,7 +22,7 @@ struct info_for_vin
|
||||||
{
|
{
|
||||||
info_for_vin() = default;
|
info_for_vin() = default;
|
||||||
|
|
||||||
info_for_vin( const prev_out& _out, const std::string& _address, bytes _script = bytes() );
|
info_for_vin( const prev_out& _out, const std::string& _address, bytes _script = bytes(), bool _resend = false );
|
||||||
|
|
||||||
bool operator!=( const info_for_vin& obj ) const;
|
bool operator!=( const info_for_vin& obj ) const;
|
||||||
|
|
||||||
|
|
@ -40,17 +40,18 @@ struct info_for_vin
|
||||||
bytes script;
|
bytes script;
|
||||||
|
|
||||||
bool used = false;
|
bool used = false;
|
||||||
|
bool resend = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct by_id;
|
struct by_id;
|
||||||
struct by_identifier;
|
struct by_identifier;
|
||||||
struct by_id_and_not_used;
|
struct by_id_resend_not_used;
|
||||||
|
|
||||||
using info_for_vin_index = boost::multi_index_container<info_for_vin,
|
using info_for_vin_index = boost::multi_index_container<info_for_vin,
|
||||||
indexed_by<
|
indexed_by<
|
||||||
ordered_unique<tag<by_id>, member<info_for_vin, uint64_t, &info_for_vin::id>>,
|
ordered_unique<tag<by_id>, member<info_for_vin, uint64_t, &info_for_vin::id>>,
|
||||||
ordered_unique<tag<by_identifier>, member<info_for_vin, fc::sha256, &info_for_vin::identifier>>,
|
ordered_unique<tag<by_identifier>, member<info_for_vin, fc::sha256, &info_for_vin::identifier>>,
|
||||||
ordered_non_unique<tag<by_id_and_not_used>, identity< info_for_vin >, info_for_vin::comparer >
|
ordered_non_unique<tag<by_id_resend_not_used>, identity< info_for_vin >, info_for_vin::comparer >
|
||||||
>
|
>
|
||||||
>;
|
>;
|
||||||
|
|
||||||
|
|
@ -69,7 +70,7 @@ public:
|
||||||
fc::optional<info_for_vin> get_info_for_pw_vin();
|
fc::optional<info_for_vin> 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<void( info_for_vin& e )>& func );
|
void modify_info_for_vin( const info_for_vin& obj, const std::function<void( info_for_vin& e )>& func );
|
||||||
|
|
||||||
|
|
@ -110,4 +111,4 @@ private:
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
FC_REFLECT( sidechain::info_for_vin, (identifier)(out)(address)(script)(used) )
|
FC_REFLECT( sidechain::info_for_vin, (identifier)(out)(address)(script)(used)(resend) )
|
||||||
|
|
@ -9,8 +9,8 @@ namespace sidechain {
|
||||||
uint64_t info_for_vin::count_id_info_for_vin = 0;
|
uint64_t info_for_vin::count_id_info_for_vin = 0;
|
||||||
uint64_t bitcoin_transaction_confirmations::count_id_tx_conf = 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 ) :
|
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 )
|
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 ) );
|
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 ) {
|
if( lhs.used != rhs.used ) {
|
||||||
return 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;
|
return lhs.id < rhs.id;
|
||||||
}
|
}
|
||||||
|
|
@ -75,9 +77,9 @@ fc::optional<info_for_vin> input_withdrawal_info::get_info_for_pw_vin()
|
||||||
return 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<void( info_for_vin& e )>& func )
|
void input_withdrawal_info::modify_info_for_vin( const info_for_vin& obj, const std::function<void( info_for_vin& e )>& func )
|
||||||
|
|
@ -114,8 +116,8 @@ std::vector<info_for_vin> input_withdrawal_info::get_info_for_vins()
|
||||||
std::vector<info_for_vin> result;
|
std::vector<info_for_vin> result;
|
||||||
const auto max_vins = db.get_sidechain_params().maximum_condensing_tx_vins;
|
const auto max_vins = db.get_sidechain_params().maximum_condensing_tx_vins;
|
||||||
|
|
||||||
info_for_vins.safe_for<by_id_and_not_used>( [&]( info_for_vin_index::index<by_id_and_not_used>::type::iterator itr_b,
|
info_for_vins.safe_for<by_id_resend_not_used>( [&]( info_for_vin_index::index<by_id_resend_not_used>::type::iterator itr_b,
|
||||||
info_for_vin_index::index<by_id_and_not_used>::type::iterator itr_e )
|
info_for_vin_index::index<by_id_resend_not_used>::type::iterator itr_e )
|
||||||
{
|
{
|
||||||
for( size_t i = 0; itr_b != itr_e && i < max_vins && !itr_b->used; i++ ) {
|
for( size_t i = 0; itr_b != itr_e && i < max_vins && !itr_b->used; i++ ) {
|
||||||
info_for_vin vin;
|
info_for_vin vin;
|
||||||
|
|
|
||||||
|
|
@ -227,4 +227,48 @@ BOOST_AUTO_TEST_CASE( input_withdrawal_info_get_info_for_vouts_test )
|
||||||
BOOST_CHECK( vouts2.size() == 3 );
|
BOOST_CHECK( vouts2.size() == 3 );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BOOST_AUTO_TEST_CASE( info_for_vin_comparer_tests )
|
||||||
|
{
|
||||||
|
input_withdrawal_info infos( db );
|
||||||
|
|
||||||
|
auto vins_checker = [&]( std::vector<uint32_t> 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<uint32_t>( 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<uint32_t>( 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()
|
BOOST_AUTO_TEST_SUITE_END()
|
||||||
|
|
|
||||||
|
|
@ -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' ) ) );
|
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 != vins_info_idx.end() );
|
||||||
BOOST_CHECK( vin_itr->resend );
|
|
||||||
|
|
||||||
BOOST_CHECK( vouts_info_idx.size() == 3 );
|
BOOST_CHECK( vouts_info_idx.size() == 3 );
|
||||||
|
|
||||||
auto vout_itr = vouts_info_idx.begin();
|
auto vout_itr = vouts_info_idx.begin();
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue