From 7b8d3ec6ba9932a8ebc509f382458ca6988d96ac Mon Sep 17 00:00:00 2001 From: stoffu Date: Fri, 6 Oct 2017 10:14:09 +0900 Subject: [PATCH] wallet-cli: add --do-not-relay option --- src/simplewallet/simplewallet.cpp | 71 +++++++++++++++++-------------- src/simplewallet/simplewallet.h | 7 +++ 2 files changed, 46 insertions(+), 32 deletions(-) diff --git a/src/simplewallet/simplewallet.cpp b/src/simplewallet/simplewallet.cpp index 314670327..96cf39962 100644 --- a/src/simplewallet/simplewallet.cpp +++ b/src/simplewallet/simplewallet.cpp @@ -121,6 +121,7 @@ namespace const command_line::arg_descriptor arg_trusted_daemon = {"trusted-daemon", sw::tr("Enable commands which rely on a trusted daemon"), false}; const command_line::arg_descriptor arg_allow_mismatched_daemon_version = {"allow-mismatched-daemon-version", sw::tr("Allow communicating with a daemon that uses a different RPC version"), false}; const command_line::arg_descriptor arg_restore_height = {"restore-height", sw::tr("Restore from specific blockchain height"), 0}; + const command_line::arg_descriptor arg_do_not_relay = {"do-not-relay", sw::tr("The newly created transaction will not be relayed to the monero network"), false}; const command_line::arg_descriptor< std::vector > arg_command = {"command", ""}; @@ -1478,6 +1479,7 @@ bool simple_wallet::handle_command_line(const boost::program_options::variables_ m_trusted_daemon = command_line::get_arg(vm, arg_trusted_daemon); m_allow_mismatched_daemon_version = command_line::get_arg(vm, arg_allow_mismatched_daemon_version); m_restore_height = command_line::get_arg(vm, arg_restore_height); + m_do_not_relay = command_line::get_arg(vm, arg_do_not_relay); m_restoring = !m_generate_from_view_key.empty() || !m_generate_from_keys.empty() || !m_generate_from_multisig_keys.empty() || @@ -2683,15 +2685,9 @@ bool simple_wallet::transfer_main(int transfer_type, const std::vectorcommit_tx(ptx); - success_msg_writer(true) << tr("Transaction successfully submitted, transaction ") << get_transaction_hash(ptx.tx) << ENDL - << tr("You can check its status by using the `show_transfers` command."); - - // if no exception, remove element from vector - ptx_vector.pop_back(); + commit_or_save(ptx_vector, m_do_not_relay); } } catch (const tools::error::daemon_busy&) @@ -2861,14 +2857,9 @@ bool simple_wallet::sweep_unmixable(const std::vector &args_) success_msg_writer(true) << tr("Unsigned transaction(s) successfully written to file: ") << "unsigned_monero_tx"; } } - else while (!ptx_vector.empty()) + else { - auto & ptx = ptx_vector.back(); - m_wallet->commit_tx(ptx); - success_msg_writer(true) << tr("Money successfully sent, transaction: ") << get_transaction_hash(ptx.tx); - - // if no exception, remove element from vector - ptx_vector.pop_back(); + commit_or_save(ptx_vector, m_do_not_relay); } } catch (const tools::error::daemon_busy&) @@ -3126,14 +3117,9 @@ bool simple_wallet::sweep_main(uint64_t below, const std::vector &a success_msg_writer(true) << tr("Unsigned transaction(s) successfully written to file: ") << "unsigned_monero_tx"; } } - else while (!ptx_vector.empty()) + else { - auto & ptx = ptx_vector.back(); - m_wallet->commit_tx(ptx); - success_msg_writer(true) << tr("Money successfully sent, transaction: ") << get_transaction_hash(ptx.tx); - - // if no exception, remove element from vector - ptx_vector.pop_back(); + commit_or_save(ptx_vector, m_do_not_relay); } } catch (const tools::error::daemon_busy&) @@ -3476,16 +3462,7 @@ bool simple_wallet::submit_transfer(const std::vector &args_) return true; } - // actually commit the transactions - while (!ptx_vector.empty()) - { - auto & ptx = ptx_vector.back(); - m_wallet->commit_tx(ptx); - success_msg_writer(true) << tr("Money successfully sent, transaction: ") << get_transaction_hash(ptx.tx); - - // if no exception, remove element from vector - ptx_vector.pop_back(); - } + commit_or_save(ptx_vector, false); } catch (const tools::error::daemon_busy&) { @@ -4995,6 +4972,35 @@ void simple_wallet::interrupt() } } //---------------------------------------------------------------------------------------------------- +void simple_wallet::commit_or_save(std::vector& ptx_vector, bool do_not_relay) +{ + size_t i = 0; + while (!ptx_vector.empty()) + { + auto & ptx = ptx_vector.back(); + const crypto::hash txid = get_transaction_hash(ptx.tx); + if (do_not_relay) + { + cryptonote::blobdata blob; + tx_to_blob(ptx.tx, blob); + const std::string blob_hex = epee::string_tools::buff_to_hex_nodelimer(blob); + const std::string filename = "raw_monero_tx" + (ptx_vector.size() == 1 ? "" : ("_" + std::to_string(i++))); + if (epee::file_io_utils::save_string_to_file(filename, blob_hex)) + success_msg_writer(true) << tr("Transaction successfully saved to ") << filename << tr(", txid ") << txid; + else + fail_msg_writer() << tr("Failed to save transaction to ") << filename << tr(", txid ") << txid; + } + else + { + m_wallet->commit_tx(ptx); + success_msg_writer(true) << tr("Transaction successfully submitted, transaction ") << txid << ENDL + << tr("You can check its status by using the `show_transfers` command."); + } + // if no exception, remove element from vector + ptx_vector.pop_back(); + } +} +//---------------------------------------------------------------------------------------------------- int main(int argc, char* argv[]) { po::options_description desc_params(wallet_args::tr("Wallet options")); @@ -5014,6 +5020,7 @@ int main(int argc, char* argv[]) command_line::add_arg(desc_params, arg_trusted_daemon); command_line::add_arg(desc_params, arg_allow_mismatched_daemon_version); command_line::add_arg(desc_params, arg_restore_height); + command_line::add_arg(desc_params, arg_do_not_relay); po::positional_options_description positional_options; positional_options.add(arg_command.name, -1); diff --git a/src/simplewallet/simplewallet.h b/src/simplewallet/simplewallet.h index 6c6d0cf05..5a038e9a3 100644 --- a/src/simplewallet/simplewallet.h +++ b/src/simplewallet/simplewallet.h @@ -205,6 +205,12 @@ namespace cryptonote */ std::string get_mnemonic_language(); + /*! + * \brief When --do-not-relay option is specified, save the raw tx hex blob to a file instead of calling m_wallet->commit_tx(ptx). + * \param ptx_vector Pending tx(es) created by transfer/sweep_all + */ + void commit_or_save(std::vector& ptx_vector, bool do_not_relay); + //----------------- i_wallet2_callback --------------------- virtual void on_new_block(uint64_t height, const cryptonote::block& block); virtual void on_money_received(uint64_t height, const crypto::hash &txid, const cryptonote::transaction& tx, uint64_t amount); @@ -285,6 +291,7 @@ namespace cryptonote bool m_allow_mismatched_daemon_version; bool m_restoring; // are we restoring, by whatever method? uint64_t m_restore_height; // optional + bool m_do_not_relay; epee::console_handlers_binder m_cmd_binder;