publish signed tx
This commit is contained in:
parent
682f64c8fc
commit
ab9a7f2fca
9 changed files with 80 additions and 4 deletions
|
|
@ -28,6 +28,7 @@ public:
|
|||
virtual void process_deposit(const son_wallet_deposit_object &swdo) = 0;
|
||||
virtual void process_withdrawal(const son_wallet_withdraw_object &swwo) = 0;
|
||||
virtual void process_signing() = 0;
|
||||
virtual void complete_signing() = 0;
|
||||
|
||||
protected:
|
||||
peerplays_sidechain_plugin &plugin;
|
||||
|
|
|
|||
|
|
@ -87,6 +87,7 @@ public:
|
|||
void process_deposit(const son_wallet_deposit_object &swdo) override;
|
||||
void process_withdrawal(const son_wallet_withdraw_object &swwo) override;
|
||||
void process_signing() override;
|
||||
void complete_signing() override;
|
||||
|
||||
private:
|
||||
std::string ip;
|
||||
|
|
@ -109,6 +110,7 @@ private:
|
|||
void transfer_all_btc(const std::string& from_address, const vector<son_info>& from_sons, const std::string& to_address);
|
||||
std::string transfer_deposit_to_primary_wallet(const son_wallet_deposit_object &swdo);
|
||||
std::string transfer_withdrawal_from_primary_wallet(const son_wallet_withdraw_object &swwo);
|
||||
void publish_btc_tx(const bitcoin_transaction_object &tx_object);
|
||||
|
||||
void handle_event(const std::string &event_data);
|
||||
std::vector<info_for_vin> extract_info_from_block(const std::string &_block);
|
||||
|
|
|
|||
|
|
@ -17,6 +17,7 @@ public:
|
|||
void process_deposit(const son_wallet_deposit_object &swdo) override;
|
||||
void process_withdrawal(const son_wallet_withdraw_object &swwo) override;
|
||||
void process_signing() override;
|
||||
void complete_signing() override;
|
||||
|
||||
private:
|
||||
std::string create_multisignature_wallet(const std::vector<std::string> public_keys) override;
|
||||
|
|
|
|||
|
|
@ -20,6 +20,7 @@ public:
|
|||
void process_deposits();
|
||||
void process_withdrawals();
|
||||
void process_signing();
|
||||
void complete_signing();
|
||||
|
||||
private:
|
||||
peerplays_sidechain_plugin &plugin;
|
||||
|
|
|
|||
|
|
@ -52,6 +52,7 @@ public:
|
|||
void process_deposits();
|
||||
void process_withdrawals();
|
||||
void process_signing();
|
||||
void complete_signing();
|
||||
|
||||
private:
|
||||
peerplays_sidechain_plugin &plugin;
|
||||
|
|
@ -350,6 +351,8 @@ void peerplays_sidechain_plugin_impl::son_processing() {
|
|||
|
||||
process_withdrawals();
|
||||
|
||||
complete_signing();
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -357,6 +360,10 @@ void peerplays_sidechain_plugin_impl::process_signing() {
|
|||
net_manager->process_signing();
|
||||
}
|
||||
|
||||
void peerplays_sidechain_plugin_impl::complete_signing() {
|
||||
net_manager->complete_signing();
|
||||
}
|
||||
|
||||
void peerplays_sidechain_plugin_impl::approve_proposals() {
|
||||
|
||||
auto approve_proposal = [&](const chain::son_id_type &son_id, const chain::proposal_id_type &proposal_id) {
|
||||
|
|
@ -442,6 +449,11 @@ void peerplays_sidechain_plugin_impl::approve_proposals() {
|
|||
approve_proposal(son_id, proposal.id);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (proposal.proposed_transaction.operations.size() == 1 && proposal.proposed_transaction.operations[0].which() == chain::operation::tag<chain::bitcoin_send_transaction_process_operation>::value) {
|
||||
approve_proposal(son_id, proposal.id);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,10 +1,8 @@
|
|||
#include <graphene/peerplays_sidechain/sidechain_net_handler.hpp>
|
||||
|
||||
#include <graphene/chain/sidechain_address_object.hpp>
|
||||
#include <graphene/chain/sidechain_transaction_object.hpp>
|
||||
#include <graphene/chain/son_wallet_deposit_object.hpp>
|
||||
#include <graphene/chain/son_wallet_withdraw_object.hpp>
|
||||
#include <graphene/peerplays_sidechain/bitcoin_utils.hpp>
|
||||
|
||||
#include <fc/log/logger.hpp>
|
||||
|
||||
|
|
|
|||
|
|
@ -673,12 +673,20 @@ void sidechain_net_handler_bitcoin::process_withdrawal(const son_wallet_withdraw
|
|||
transfer_withdrawal_from_primary_wallet(swwo);
|
||||
}
|
||||
|
||||
static bool has_enough_signatures(const bitcoin_transaction_object &tx_object) {
|
||||
// TODO: Verify with weights calculation
|
||||
bool has_empty = false;
|
||||
for(auto s: tx_object.signatures)
|
||||
has_empty |= s.second.empty();
|
||||
return !has_empty;
|
||||
}
|
||||
|
||||
void sidechain_net_handler_bitcoin::process_signing() {
|
||||
const auto &idx = plugin.database().get_index_type<bitcoin_transaction_index>().indices().get<by_processed>();
|
||||
const auto &idx_range = idx.equal_range(false);
|
||||
|
||||
std::for_each(idx_range.first, idx_range.second,
|
||||
[&](const bitcoin_transaction_object &tx_object) {
|
||||
// collect signatures
|
||||
auto sons = plugin.get_sons();
|
||||
for (son_id_type son_id : sons) {
|
||||
auto it = tx_object.signatures.find(son_id);
|
||||
|
|
@ -704,7 +712,40 @@ void sidechain_net_handler_bitcoin::process_signing() {
|
|||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
void sidechain_net_handler_bitcoin::complete_signing()
|
||||
{
|
||||
const auto &idx = plugin.database().get_index_type<bitcoin_transaction_index>().indices().get<by_processed>();
|
||||
const auto &idx_range = idx.equal_range(false);
|
||||
std::for_each(idx_range.first, idx_range.second,
|
||||
[&](const bitcoin_transaction_object &tx_object) {
|
||||
// check if all signatures collected
|
||||
if (has_enough_signatures(tx_object)) {
|
||||
publish_btc_tx(tx_object);
|
||||
bitcoin_send_transaction_process_operation op;
|
||||
op.payer = GRAPHENE_SON_ACCOUNT;
|
||||
op.bitcoin_transaction_id = tx_object.id;
|
||||
|
||||
const chain::global_property_object& gpo = database.get_global_properties();
|
||||
proposal_create_operation proposal_op;
|
||||
proposal_op.fee_paying_account = plugin.get_son_object(plugin.get_current_son_id()).son_account;
|
||||
proposal_op.proposed_ops.emplace_back( op_wrapper( op ) );
|
||||
uint32_t lifetime = ( gpo.parameters.block_interval * gpo.active_witnesses.size() ) * 3;
|
||||
proposal_op.expiration_time = time_point_sec( database.head_block_time().sec_since_epoch() + lifetime );
|
||||
|
||||
signed_transaction trx = database.create_signed_transaction(plugin.get_private_key(plugin.get_current_son_id()), proposal_op);
|
||||
try {
|
||||
database.push_transaction(trx, database::validation_steps::skip_block_size_check);
|
||||
if(plugin.app().p2p_node())
|
||||
plugin.app().p2p_node()->broadcast(net::trx_message(trx));
|
||||
} catch(fc::exception e){
|
||||
ilog("sidechain_net_handler_bitcoin: sending proposal for bitcoin send operation failed with exception ${e}",("e", e.what()));
|
||||
return;
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
std::string sidechain_net_handler_bitcoin::create_multisignature_wallet(const std::vector<std::string> public_keys) {
|
||||
|
|
@ -928,6 +969,17 @@ std::string sidechain_net_handler_bitcoin::transfer_withdrawal_from_primary_wall
|
|||
return sign_and_send_transaction_with_wallet(reply_str);
|
||||
}
|
||||
|
||||
void sidechain_net_handler_bitcoin::publish_btc_tx(const bitcoin_transaction_object &tx_object)
|
||||
{
|
||||
std::vector<std::vector<bytes>> signatures;
|
||||
signatures.resize(tx_object.signatures.size());
|
||||
std::transform(tx_object.signatures.begin(), tx_object.signatures.end(),
|
||||
signatures.begin(), [](const std::pair<son_id_type, std::vector<bytes>>& p) { return p.second; }
|
||||
);
|
||||
bytes signed_tx = add_signatures_to_unsigned_tx(tx_object.unsigned_tx, signatures, tx_object.redeem_script);
|
||||
bitcoin_client->sendrawtransaction(fc::to_hex((const char*)&signed_tx[0], signed_tx.size()));
|
||||
}
|
||||
|
||||
void sidechain_net_handler_bitcoin::handle_event(const std::string &event_data) {
|
||||
std::string block = bitcoin_client->getblock(event_data);
|
||||
if (block != "") {
|
||||
|
|
|
|||
|
|
@ -42,6 +42,9 @@ void sidechain_net_handler_peerplays::process_withdrawal(const son_wallet_withdr
|
|||
void sidechain_net_handler_peerplays::process_signing() {
|
||||
}
|
||||
|
||||
void sidechain_net_handler_peerplays::complete_signing() {
|
||||
}
|
||||
|
||||
std::string sidechain_net_handler_peerplays::create_multisignature_wallet(const std::vector<std::string> public_keys) {
|
||||
return "";
|
||||
}
|
||||
|
|
|
|||
|
|
@ -63,4 +63,10 @@ void sidechain_net_manager::process_signing() {
|
|||
}
|
||||
}
|
||||
|
||||
void sidechain_net_manager::complete_signing() {
|
||||
for (size_t i = 0; i < net_handlers.size(); i++) {
|
||||
net_handlers.at(i)->complete_signing();
|
||||
}
|
||||
}
|
||||
|
||||
}} // namespace graphene::peerplays_sidechain
|
||||
|
|
|
|||
Loading…
Reference in a new issue