Added bitcoin_transaction_revert_operation with evaluator

This commit is contained in:
Alexander Suslikov 2019-02-07 17:06:03 +03:00 committed by Anzhy Cherrnyavski
parent ec3b7e8b80
commit 7a78d95241
8 changed files with 104 additions and 4 deletions

View file

@ -298,7 +298,11 @@ struct get_impacted_account_visitor
{
_impacted.insert( op.payer );
}
void operator()( const bitcoin_issue_operation& op )
void operator()( const bitcoin_issue_operation& op )
{
_impacted.insert( op.payer );
}
void operator()( const bitcoin_transaction_revert_operation& op )
{
_impacted.insert( op.payer );
}

View file

@ -212,4 +212,59 @@ bool bitcoin_transaction_sign_evaluator::check_sigs( const bytes& key_data, cons
return true;
}
void_result bitcoin_transaction_revert_evaluator::do_evaluate( const bitcoin_transaction_revert_operation& op )
{ try {
database& d = db();
const auto& btc_trx_idx = d.get_index_type<bitcoin_transaction_index>().indices().get<by_transaction_id>();
const auto& vouts_info_idx = d.get_index_type<info_for_vout_index>().indices().get<by_id>();
const auto& vins_info_idx = d.get_index_type<info_for_used_vin_index>().indices().get<by_identifier>();
const auto& btc_itr = btc_trx_idx.find( op.transaction_id );
FC_ASSERT( btc_itr != btc_trx_idx.end() );
for( const auto& vout_id : btc_itr->vouts ) {
FC_ASSERT( vouts_info_idx.find( vout_id ) != vouts_info_idx.end() );
}
for( const auto& vout_id : btc_itr->vins ) {
FC_ASSERT( vins_info_idx.find( vout_id ) != vins_info_idx.end() );
}
return void_result();
} FC_CAPTURE_AND_RETHROW( (op) ) }
void_result bitcoin_transaction_revert_evaluator::do_apply( const bitcoin_transaction_revert_operation& op )
{ try {
database& d = db();
const auto& btc_trx_idx = d.get_index_type<bitcoin_transaction_index>().indices().get<by_transaction_id>();
const auto& vouts_info_idx = d.get_index_type<info_for_vout_index>().indices().get<by_id>();
const auto& vins_info_idx = d.get_index_type<info_for_used_vin_index>().indices().get<by_identifier>();
const auto& btc_trx_obj = *btc_trx_idx.find( op.transaction_id );
for( const auto& vout_id : btc_trx_obj.vouts ) {
const auto& vout_obj = *vouts_info_idx.find( vout_id );
d.modify( vout_obj, [&]( info_for_vout_object& obj ){
obj.used = false;
});
}
for( const auto& vin_id : btc_trx_obj.vins ) {
const auto& vin_obj = *vins_info_idx.find( vin_id );
if( op.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.bitcoin_confirmations.remove<sidechain::by_hash>( op.transaction_id );
d.remove( btc_trx_obj );
return void_result();
} FC_CAPTURE_AND_RETHROW( (op) ) }
} }

View file

@ -253,6 +253,7 @@ void database::initialize_evaluators()
register_evaluator<bitcoin_transaction_send_evaluator>();
register_evaluator<bitcoin_transaction_sign_evaluator>();
register_evaluator<bitcoin_issue_evaluator>();
register_evaluator<bitcoin_transaction_revert_evaluator>();
}
void database::initialize_indexes()

View file

@ -289,6 +289,10 @@ struct get_impacted_account_visitor
{
_impacted.insert( op.payer );
}
void operator()( const bitcoin_transaction_revert_operation& op )
{
_impacted.insert( op.payer );
}
};
void operation_get_impacted_accounts( const operation& op, flat_set<account_id_type>& result )

View file

@ -40,4 +40,16 @@ public:
};
class bitcoin_transaction_revert_evaluator : public evaluator<bitcoin_transaction_revert_evaluator>
{
public:
typedef bitcoin_transaction_revert_operation operation_type;
void_result do_evaluate( const bitcoin_transaction_revert_operation& op );
void_result do_apply( const bitcoin_transaction_revert_operation& op );
};
} } // graphene::chain

View file

@ -20,6 +20,8 @@ class info_for_used_vin_object : public abstract_object<info_for_used_vin_object
sidechain::prev_out out;
std::string address;
sidechain::bytes script;
bool resend = false;
};
struct by_id;
@ -36,4 +38,4 @@ typedef generic_index<info_for_used_vin_object, info_for_used_vin_multi_index_co
} } // graphene::chain
FC_REFLECT_DERIVED( graphene::chain::info_for_used_vin_object, (graphene::chain::object), (identifier)(out)(address)(script) )
FC_REFLECT_DERIVED( graphene::chain::info_for_used_vin_object, (graphene::chain::object), (identifier)(out)(address)(script)(resend) )

View file

@ -31,7 +31,6 @@ namespace graphene { namespace chain {
}
};
struct bitcoin_transaction_sign_operation : public base_operation
{
struct fee_parameters_type {
@ -49,6 +48,25 @@ namespace graphene { namespace chain {
share_type calculate_fee( const fee_parameters_type& k )const { return 0; }
};
struct bitcoin_transaction_revert_operation : public base_operation
{
struct fee_parameters_type {
uint64_t fee = 0;
uint32_t price_per_kbyte = 0;
};
asset fee;
account_id_type payer;
fc::sha256 transaction_id;
std::set< fc::sha256 > valid_vins;
account_id_type fee_payer()const { return payer; }
void validate()const {}
share_type calculate_fee( const fee_parameters_type& k )const { return k.fee; }
};
} } // graphene::chain
FC_REFLECT( graphene::chain::bitcoin_transaction_send_operation::fee_parameters_type, (fee)(price_per_kbyte) )
@ -56,3 +74,6 @@ FC_REFLECT( graphene::chain::bitcoin_transaction_send_operation, (fee)(payer)(vi
FC_REFLECT( graphene::chain::bitcoin_transaction_sign_operation::fee_parameters_type, (fee)(price_per_kbyte) )
FC_REFLECT( graphene::chain::bitcoin_transaction_sign_operation, (fee)(payer)(proposal_id)(signatures) )
FC_REFLECT( graphene::chain::bitcoin_transaction_revert_operation::fee_parameters_type, (fee)(price_per_kbyte) )
FC_REFLECT( graphene::chain::bitcoin_transaction_revert_operation, (fee)(payer)(transaction_id)(valid_vins) )

View file

@ -138,7 +138,8 @@ namespace graphene { namespace chain {
bitcoin_address_create_operation,
bitcoin_transaction_send_operation,
bitcoin_transaction_sign_operation,
bitcoin_issue_operation
bitcoin_issue_operation,
bitcoin_transaction_revert_operation
> operation;
/// @} // operations group