SON131 - Addition of processed operation

This commit is contained in:
Koneru Satyanarayana 2020-02-12 21:13:40 +11:00
parent 6f437e7be9
commit c226924ef9
6 changed files with 147 additions and 61 deletions

View file

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

View file

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

View file

@ -155,7 +155,8 @@ namespace graphene { namespace chain {
sidechain_address_update_operation, sidechain_address_update_operation,
sidechain_address_delete_operation, sidechain_address_delete_operation,
bitcoin_transaction_send_operation, bitcoin_transaction_send_operation,
bitcoin_transaction_sign_operation bitcoin_transaction_sign_operation,
bitcoin_send_transaction_process_operation
> operation; > operation;
/// @} // operations group /// @} // operations group

View file

@ -34,6 +34,20 @@ namespace graphene { namespace chain {
share_type calculate_fee( const fee_parameters_type& k )const { return 0; } share_type calculate_fee( const fee_parameters_type& k )const { return 0; }
}; };
struct bitcoin_send_transaction_process_operation : public base_operation
{
struct fee_parameters_type { uint64_t fee = 0; };
asset fee;
account_id_type payer;
bitcoin_transaction_id_type bitcoin_transaction_id;
account_id_type fee_payer()const { return payer; }
void validate()const {}
share_type calculate_fee( const fee_parameters_type& k )const { return 0; }
};
} } // graphene::chain } } // graphene::chain
FC_REFLECT( graphene::chain::bitcoin_transaction_send_operation::fee_parameters_type, (fee) ) FC_REFLECT( graphene::chain::bitcoin_transaction_send_operation::fee_parameters_type, (fee) )
@ -41,3 +55,6 @@ FC_REFLECT( graphene::chain::bitcoin_transaction_send_operation, (fee)(payer)(si
FC_REFLECT( graphene::chain::bitcoin_transaction_sign_operation::fee_parameters_type, (fee) ) FC_REFLECT( graphene::chain::bitcoin_transaction_sign_operation::fee_parameters_type, (fee) )
FC_REFLECT( graphene::chain::bitcoin_transaction_sign_operation, (fee)(payer)(proposal_id)(signatures) ) FC_REFLECT( graphene::chain::bitcoin_transaction_sign_operation, (fee)(payer)(proposal_id)(signatures) )
FC_REFLECT( graphene::chain::bitcoin_send_transaction_process_operation::fee_parameters_type, (fee) )
FC_REFLECT( graphene::chain::bitcoin_send_transaction_process_operation, (fee)(payer)(bitcoin_transaction_id) )

View file

@ -23,4 +23,13 @@ public:
void update_proposal( const bitcoin_transaction_sign_operation& o ); void update_proposal( const bitcoin_transaction_sign_operation& o );
}; };
class bitcoin_send_transaction_process_evaluator : public evaluator<bitcoin_send_transaction_process_evaluator>
{
public:
typedef bitcoin_send_transaction_process_operation operation_type;
void_result do_evaluate(const bitcoin_send_transaction_process_operation& o);
object_id_type do_apply(const bitcoin_send_transaction_process_operation& o);
};
} } // namespace graphene::chain } } // namespace graphene::chain

View file

@ -6,26 +6,39 @@
#include <graphene/chain/proposal_object.hpp> #include <graphene/chain/proposal_object.hpp>
#include <graphene/chain/hardfork.hpp> #include <graphene/chain/hardfork.hpp>
namespace graphene { namespace chain { namespace graphene
{
namespace chain
{
void_result bitcoin_transaction_send_evaluator::do_evaluate(const bitcoin_transaction_send_operation &op) void_result bitcoin_transaction_send_evaluator::do_evaluate(const bitcoin_transaction_send_operation &op)
{ try{ {
try
{
FC_ASSERT(db().head_block_time() >= HARDFORK_SON_TIME, "Not allowed until SON HARDFORK"); // can be removed after HF date pass FC_ASSERT(db().head_block_time() >= HARDFORK_SON_TIME, "Not allowed until SON HARDFORK"); // can be removed after HF date pass
FC_ASSERT(op.payer == db().get_global_properties().parameters.get_son_btc_account_id(), "Payer should be the son btc account"); FC_ASSERT(op.payer == db().get_global_properties().parameters.get_son_btc_account_id(), "Payer should be the son btc account");
return void_result(); return void_result();
} FC_CAPTURE_AND_RETHROW( (op) ) } }
FC_CAPTURE_AND_RETHROW((op))
}
object_id_type bitcoin_transaction_send_evaluator::do_apply(const bitcoin_transaction_send_operation &op) object_id_type bitcoin_transaction_send_evaluator::do_apply(const bitcoin_transaction_send_operation &op)
{ try { {
try
{
const auto &new_bitcoin_transaction_object = db().create<bitcoin_transaction_object>([&](bitcoin_transaction_object &obj) { const auto &new_bitcoin_transaction_object = db().create<bitcoin_transaction_object>([&](bitcoin_transaction_object &obj) {
obj.processed = false; obj.processed = false;
obj.signatures = op.signatures; obj.signatures = op.signatures;
}); });
return new_bitcoin_transaction_object.id; return new_bitcoin_transaction_object.id;
} FC_CAPTURE_AND_RETHROW( (op) ) } }
FC_CAPTURE_AND_RETHROW((op))
}
void_result bitcoin_transaction_sign_evaluator::do_evaluate(const bitcoin_transaction_sign_operation &op) void_result bitcoin_transaction_sign_evaluator::do_evaluate(const bitcoin_transaction_sign_operation &op)
{ try { {
try
{
FC_ASSERT(db().head_block_time() >= HARDFORK_SON_TIME, "Not allowed until SON HARDFORK"); // can be removed after HF date pass FC_ASSERT(db().head_block_time() >= HARDFORK_SON_TIME, "Not allowed until SON HARDFORK"); // can be removed after HF date pass
const auto &proposal_idx = db().get_index_type<proposal_index>().indices().get<by_id>(); const auto &proposal_idx = db().get_index_type<proposal_index>().indices().get<by_id>();
const auto &proposal_itr = proposal_idx.find(op.proposal_id); const auto &proposal_itr = proposal_idx.find(op.proposal_id);
@ -34,7 +47,8 @@ void_result bitcoin_transaction_sign_evaluator::do_evaluate(const bitcoin_transa
auto can_this_son_approve_this_proposal = [&]() { auto can_this_son_approve_this_proposal = [&]() {
const auto &sidx = db().get_index_type<son_index>().indices().get<graphene::chain::by_account>(); const auto &sidx = db().get_index_type<son_index>().indices().get<graphene::chain::by_account>();
auto son_obj = sidx.find(op.payer); auto son_obj = sidx.find(op.payer);
if( son_obj == sidx.end() ) { if (son_obj == sidx.end())
{
return false; return false;
} }
// TODO: Check if the SON is included in the PW script. // TODO: Check if the SON is included in the PW script.
@ -43,10 +57,14 @@ void_result bitcoin_transaction_sign_evaluator::do_evaluate(const bitcoin_transa
FC_ASSERT(can_this_son_approve_this_proposal(), "Invalid approval received"); FC_ASSERT(can_this_son_approve_this_proposal(), "Invalid approval received");
return void_result(); return void_result();
} FC_CAPTURE_AND_RETHROW( (op) ) } }
FC_CAPTURE_AND_RETHROW((op))
}
object_id_type bitcoin_transaction_sign_evaluator::do_apply(const bitcoin_transaction_sign_operation &op) object_id_type bitcoin_transaction_sign_evaluator::do_apply(const bitcoin_transaction_sign_operation &op)
{ try { {
try
{
const auto &proposal = op.proposal_id(db()); const auto &proposal = op.proposal_id(db());
const auto &sidx = db().get_index_type<son_index>().indices().get<graphene::chain::by_account>(); const auto &sidx = db().get_index_type<son_index>().indices().get<graphene::chain::by_account>();
auto son_obj = sidx.find(op.payer); auto son_obj = sidx.find(op.payer);
@ -58,7 +76,9 @@ object_id_type bitcoin_transaction_sign_evaluator::do_apply(const bitcoin_transa
}); });
update_proposal(op); update_proposal(op);
} FC_CAPTURE_AND_RETHROW( (op) ) } }
FC_CAPTURE_AND_RETHROW((op))
}
void bitcoin_transaction_sign_evaluator::update_proposal(const bitcoin_transaction_sign_operation &op) void bitcoin_transaction_sign_evaluator::update_proposal(const bitcoin_transaction_sign_operation &op)
{ {
@ -80,4 +100,37 @@ void bitcoin_transaction_sign_evaluator::update_proposal( const bitcoin_transact
trx_state->skip_fee_schedule_check = skip_fee_schedule_check_old; trx_state->skip_fee_schedule_check = skip_fee_schedule_check_old;
} }
} } // namespace graphene::chain void_result bitcoin_send_transaction_process_evaluator::do_evaluate(const bitcoin_send_transaction_process_operation &op)
{
try
{
FC_ASSERT(db().head_block_time() >= HARDFORK_SON_TIME, "Not allowed until SON HARDFORK"); // can be removed after HF date pass
FC_ASSERT(op.payer == db().get_global_properties().parameters.get_son_btc_account_id(), "Payer should be the son btc account");
const auto &btidx = db.get_index_type<bitcoin_transaction_index>().indices().get<by_id>();
const auto btobj = btidx.find(op.bitcoin_transaction_id);
FC_ASSERT(btobj != btidx.end(), "Bitcoin Transaction Object not found");
FC_ASSERT(btobj->processed == false, "Bitcoin Transaction already processed");
return void_result();
}
FC_CAPTURE_AND_RETHROW((op))
}
object_id_type bitcoin_send_transaction_process_evaluator::do_apply(const bitcoin_send_transaction_process_operation &op)
{
try
{
const auto &btidx = db.get_index_type<bitcoin_transaction_index>().indices().get<by_id>();
auto btobj = btidx.find(op.bitcoin_transaction_id);
if (btobj != btindx.end())
{
db().modify(*btobj, [&op](bitcoin_transaction_object &bto) {
bto.processed = true;
});
}
return op.bitcoin_transaction_id;
}
FC_CAPTURE_AND_RETHROW((op))
}
} // namespace chain
} // namespace graphene