Added bitcoin_transaction_revert_operation with evaluator
This commit is contained in:
parent
ec3b7e8b80
commit
7a78d95241
8 changed files with 104 additions and 4 deletions
|
|
@ -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 );
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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) ) }
|
||||
|
||||
} }
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -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 )
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
@ -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) )
|
||||
|
|
|
|||
|
|
@ -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) )
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in a new issue