mirror of
https://github.com/monero-project/monero.git
synced 2025-08-16 08:50:21 -04:00
wallet: new option to start background mining
The setup-background-mining option can be used to select background mining when a wallet loads. The user will be asked the first time the wallet is created.
This commit is contained in:
parent
4308a2e173
commit
a2561653cb
10 changed files with 264 additions and 20 deletions
|
@ -2592,6 +2592,31 @@ bool simple_wallet::set_track_uses(const std::vector<std::string> &args/* = std:
|
|||
return true;
|
||||
}
|
||||
|
||||
bool simple_wallet::set_setup_background_mining(const std::vector<std::string> &args/* = std::vector<std::string>()*/)
|
||||
{
|
||||
const auto pwd_container = get_and_verify_password();
|
||||
if (pwd_container)
|
||||
{
|
||||
tools::wallet2::BackgroundMiningSetupType setup = tools::wallet2::BackgroundMiningMaybe;
|
||||
if (args[1] == "yes" || args[1] == "1")
|
||||
setup = tools::wallet2::BackgroundMiningYes;
|
||||
else if (args[1] == "no" || args[1] == "0")
|
||||
setup = tools::wallet2::BackgroundMiningNo;
|
||||
else
|
||||
{
|
||||
fail_msg_writer() << tr("invalid argument: must be either 1/yes or 0/no");
|
||||
return true;
|
||||
}
|
||||
m_wallet->setup_background_mining(setup);
|
||||
m_wallet->rewrite(m_wallet_file, pwd_container->password());
|
||||
if (setup == tools::wallet2::BackgroundMiningYes)
|
||||
start_background_mining();
|
||||
else
|
||||
stop_background_mining();
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool simple_wallet::set_device_name(const std::vector<std::string> &args/* = std::vector<std::string>()*/)
|
||||
{
|
||||
const auto pwd_container = get_and_verify_password();
|
||||
|
@ -3125,6 +3150,13 @@ bool simple_wallet::set_variable(const std::vector<std::string> &args)
|
|||
case tools::wallet2::AskPasswordOnAction: ask_password_string = "action"; break;
|
||||
case tools::wallet2::AskPasswordToDecrypt: ask_password_string = "decrypt"; break;
|
||||
}
|
||||
std::string setup_background_mining_string = "invalid";
|
||||
switch (m_wallet->setup_background_mining())
|
||||
{
|
||||
case tools::wallet2::BackgroundMiningMaybe: setup_background_mining_string = "maybe"; break;
|
||||
case tools::wallet2::BackgroundMiningYes: setup_background_mining_string = "yes"; break;
|
||||
case tools::wallet2::BackgroundMiningNo: setup_background_mining_string = "no"; break;
|
||||
}
|
||||
success_msg_writer() << "seed = " << seed_language;
|
||||
success_msg_writer() << "always-confirm-transfers = " << m_wallet->always_confirm_transfers();
|
||||
success_msg_writer() << "print-ring-members = " << m_wallet->print_ring_members();
|
||||
|
@ -3151,6 +3183,7 @@ bool simple_wallet::set_variable(const std::vector<std::string> &args)
|
|||
success_msg_writer() << "segregation-height = " << m_wallet->segregation_height();
|
||||
success_msg_writer() << "ignore-fractional-outputs = " << m_wallet->ignore_fractional_outputs();
|
||||
success_msg_writer() << "track-uses = " << m_wallet->track_uses();
|
||||
success_msg_writer() << "setup-background-mining = " << setup_background_mining_string + tr(" (set this to support the network and to get a chance to receive new monero)");
|
||||
success_msg_writer() << "device_name = " << m_wallet->device_name();
|
||||
return true;
|
||||
}
|
||||
|
@ -3208,6 +3241,7 @@ bool simple_wallet::set_variable(const std::vector<std::string> &args)
|
|||
CHECK_SIMPLE_VARIABLE("segregation-height", set_segregation_height, tr("unsigned integer"));
|
||||
CHECK_SIMPLE_VARIABLE("ignore-fractional-outputs", set_ignore_fractional_outputs, tr("0 or 1"));
|
||||
CHECK_SIMPLE_VARIABLE("track-uses", set_track_uses, tr("0 or 1"));
|
||||
CHECK_SIMPLE_VARIABLE("setup-background-mining", set_setup_background_mining, tr("1/yes or 0/no"));
|
||||
CHECK_SIMPLE_VARIABLE("device-name", set_device_name, tr("<device_name[:device_spec]>"));
|
||||
}
|
||||
fail_msg_writer() << tr("set: unrecognized argument(s)");
|
||||
|
@ -3403,6 +3437,7 @@ bool simple_wallet::init(const boost::program_options::variables_map& vm)
|
|||
const network_type nettype = testnet ? TESTNET : stagenet ? STAGENET : MAINNET;
|
||||
|
||||
epee::wipeable_string multisig_keys;
|
||||
epee::wipeable_string password;
|
||||
|
||||
if (!handle_command_line(vm))
|
||||
return false;
|
||||
|
@ -3510,7 +3545,6 @@ bool simple_wallet::init(const boost::program_options::variables_map& vm)
|
|||
m_recovery_key = cryptonote::decrypt_key(m_recovery_key, seed_pass);
|
||||
}
|
||||
}
|
||||
epee::wipeable_string password;
|
||||
if (!m_generate_from_view_key.empty())
|
||||
{
|
||||
m_wallet_file = m_generate_from_view_key;
|
||||
|
@ -3955,8 +3989,9 @@ bool simple_wallet::init(const boost::program_options::variables_map& vm)
|
|||
fail_msg_writer() << tr("can't specify --subaddress-lookahead and --wallet-file at the same time");
|
||||
return false;
|
||||
}
|
||||
bool r = open_wallet(vm);
|
||||
auto r = open_wallet(vm);
|
||||
CHECK_AND_ASSERT_MES(r, false, tr("failed to open account"));
|
||||
password = *r;
|
||||
}
|
||||
if (!m_wallet)
|
||||
{
|
||||
|
@ -3972,6 +4007,8 @@ bool simple_wallet::init(const boost::program_options::variables_map& vm)
|
|||
|
||||
m_wallet->callback(this);
|
||||
|
||||
check_background_mining(password);
|
||||
|
||||
return true;
|
||||
}
|
||||
//----------------------------------------------------------------------------------------------------
|
||||
|
@ -4341,12 +4378,12 @@ boost::optional<epee::wipeable_string> simple_wallet::new_wallet(const boost::pr
|
|||
return std::move(password);
|
||||
}
|
||||
//----------------------------------------------------------------------------------------------------
|
||||
bool simple_wallet::open_wallet(const boost::program_options::variables_map& vm)
|
||||
boost::optional<epee::wipeable_string> simple_wallet::open_wallet(const boost::program_options::variables_map& vm)
|
||||
{
|
||||
if (!tools::wallet2::wallet_valid_path_format(m_wallet_file))
|
||||
{
|
||||
fail_msg_writer() << tr("wallet file path not valid: ") << m_wallet_file;
|
||||
return false;
|
||||
return {};
|
||||
}
|
||||
|
||||
bool keys_file_exists;
|
||||
|
@ -4356,7 +4393,7 @@ bool simple_wallet::open_wallet(const boost::program_options::variables_map& vm)
|
|||
if(!keys_file_exists)
|
||||
{
|
||||
fail_msg_writer() << tr("Key file not found. Failed to open wallet");
|
||||
return false;
|
||||
return {};
|
||||
}
|
||||
|
||||
epee::wipeable_string password;
|
||||
|
@ -4367,7 +4404,7 @@ bool simple_wallet::open_wallet(const boost::program_options::variables_map& vm)
|
|||
password = std::move(std::move(rc.second).password());
|
||||
if (!m_wallet)
|
||||
{
|
||||
return false;
|
||||
return {};
|
||||
}
|
||||
|
||||
m_wallet->callback(this);
|
||||
|
@ -4393,7 +4430,7 @@ bool simple_wallet::open_wallet(const boost::program_options::variables_map& vm)
|
|||
{
|
||||
bool is_deterministic;
|
||||
{
|
||||
SCOPED_WALLET_UNLOCK();
|
||||
SCOPED_WALLET_UNLOCK_ON_BAD_PASSWORD(return {};);
|
||||
is_deterministic = m_wallet->is_deterministic();
|
||||
}
|
||||
if (is_deterministic)
|
||||
|
@ -4402,7 +4439,7 @@ bool simple_wallet::open_wallet(const boost::program_options::variables_map& vm)
|
|||
"a deprecated version of the wallet. Please proceed to upgrade your wallet.\n");
|
||||
std::string mnemonic_language = get_mnemonic_language();
|
||||
if (mnemonic_language.empty())
|
||||
return false;
|
||||
return {};
|
||||
m_wallet->set_seed_language(mnemonic_language);
|
||||
m_wallet->rewrite(m_wallet_file, password);
|
||||
|
||||
|
@ -4434,14 +4471,14 @@ bool simple_wallet::open_wallet(const boost::program_options::variables_map& vm)
|
|||
if (password_is_correct)
|
||||
fail_msg_writer() << boost::format(tr("You may want to remove the file \"%s\" and try again")) % m_wallet_file;
|
||||
}
|
||||
return false;
|
||||
return {};
|
||||
}
|
||||
success_msg_writer() <<
|
||||
"**********************************************************************\n" <<
|
||||
tr("Use the \"help\" command to see the list of available commands.\n") <<
|
||||
tr("Use \"help <command>\" to see a command's documentation.\n") <<
|
||||
"**********************************************************************";
|
||||
return true;
|
||||
return std::move(password);
|
||||
}
|
||||
//----------------------------------------------------------------------------------------------------
|
||||
bool simple_wallet::close_wallet()
|
||||
|
@ -4522,7 +4559,118 @@ bool simple_wallet::save_watch_only(const std::vector<std::string> &args/* = std
|
|||
}
|
||||
return true;
|
||||
}
|
||||
//----------------------------------------------------------------------------------------------------
|
||||
void simple_wallet::start_background_mining()
|
||||
{
|
||||
COMMAND_RPC_MINING_STATUS::request reqq;
|
||||
COMMAND_RPC_MINING_STATUS::response resq;
|
||||
bool r = m_wallet->invoke_http_json("/mining_status", reqq, resq);
|
||||
std::string err = interpret_rpc_response(r, resq.status);
|
||||
if (!r)
|
||||
return;
|
||||
if (!err.empty())
|
||||
{
|
||||
fail_msg_writer() << tr("Failed to query mining status: ") << err;
|
||||
return;
|
||||
}
|
||||
if (!resq.is_background_mining_enabled)
|
||||
{
|
||||
COMMAND_RPC_START_MINING::request req;
|
||||
COMMAND_RPC_START_MINING::response res;
|
||||
req.miner_address = m_wallet->get_account().get_public_address_str(m_wallet->nettype());
|
||||
req.threads_count = 1;
|
||||
req.do_background_mining = true;
|
||||
req.ignore_battery = false;
|
||||
bool r = m_wallet->invoke_http_json("/start_mining", req, res);
|
||||
std::string err = interpret_rpc_response(r, res.status);
|
||||
if (!err.empty())
|
||||
{
|
||||
fail_msg_writer() << tr("Failed to setup background mining: ") << err;
|
||||
return;
|
||||
}
|
||||
}
|
||||
success_msg_writer() << tr("Background mining enabled. Thank you for supporting the Monero network.");
|
||||
}
|
||||
//----------------------------------------------------------------------------------------------------
|
||||
void simple_wallet::stop_background_mining()
|
||||
{
|
||||
COMMAND_RPC_MINING_STATUS::request reqq;
|
||||
COMMAND_RPC_MINING_STATUS::response resq;
|
||||
bool r = m_wallet->invoke_http_json("/mining_status", reqq, resq);
|
||||
if (!r)
|
||||
return;
|
||||
std::string err = interpret_rpc_response(r, resq.status);
|
||||
if (!err.empty())
|
||||
{
|
||||
fail_msg_writer() << tr("Failed to query mining status: ") << err;
|
||||
return;
|
||||
}
|
||||
if (resq.is_background_mining_enabled)
|
||||
{
|
||||
COMMAND_RPC_STOP_MINING::request req;
|
||||
COMMAND_RPC_STOP_MINING::response res;
|
||||
bool r = m_wallet->invoke_http_json("/stop_mining", req, res);
|
||||
std::string err = interpret_rpc_response(r, res.status);
|
||||
if (!err.empty())
|
||||
{
|
||||
fail_msg_writer() << tr("Failed to setup background mining: ") << err;
|
||||
return;
|
||||
}
|
||||
}
|
||||
message_writer(console_color_red, false) << tr("Background mining not enabled. Run \"set setup-background-mining 1\" to change.");
|
||||
}
|
||||
//----------------------------------------------------------------------------------------------------
|
||||
void simple_wallet::check_background_mining(const epee::wipeable_string &password)
|
||||
{
|
||||
tools::wallet2::BackgroundMiningSetupType setup = m_wallet->setup_background_mining();
|
||||
if (setup == tools::wallet2::BackgroundMiningNo)
|
||||
{
|
||||
message_writer(console_color_red, false) << tr("Background mining not enabled. Run \"set setup-background-mining 1\" to change.");
|
||||
return;
|
||||
}
|
||||
|
||||
if (!m_wallet->is_trusted_daemon())
|
||||
{
|
||||
message_writer() << tr("Using an untrusted daemon, skipping background mining check");
|
||||
return;
|
||||
}
|
||||
|
||||
COMMAND_RPC_MINING_STATUS::request req;
|
||||
COMMAND_RPC_MINING_STATUS::response res;
|
||||
bool r = m_wallet->invoke_http_json("/mining_status", req, res);
|
||||
std::string err = interpret_rpc_response(r, res.status);
|
||||
bool is_background_mining_enabled = false;
|
||||
if (err.empty())
|
||||
is_background_mining_enabled = res.is_background_mining_enabled;
|
||||
|
||||
if (is_background_mining_enabled)
|
||||
{
|
||||
// already active, nice
|
||||
m_wallet->setup_background_mining(tools::wallet2::BackgroundMiningYes);
|
||||
m_wallet->rewrite(m_wallet_file, password);
|
||||
start_background_mining();
|
||||
return;
|
||||
}
|
||||
if (res.active)
|
||||
return;
|
||||
|
||||
if (setup == tools::wallet2::BackgroundMiningMaybe)
|
||||
{
|
||||
message_writer() << tr("The daemon is not set up to background mine.");
|
||||
message_writer() << tr("With background mining enabled, the daemon will mine when idle and not on batttery.");
|
||||
message_writer() << tr("Enabling this supports the network you are using, and makes you eligible for receiving new monero");
|
||||
std::string accepted = input_line(tr("Do you want to do it now? (Y/Yes/N/No): "));
|
||||
if (std::cin.eof() || !command_line::is_yes(accepted)) {
|
||||
m_wallet->setup_background_mining(tools::wallet2::BackgroundMiningNo);
|
||||
m_wallet->rewrite(m_wallet_file, password);
|
||||
message_writer(console_color_red, false) << tr("Background mining not enabled. Set setup-background-mining to 1 to change.");
|
||||
return;
|
||||
}
|
||||
m_wallet->setup_background_mining(tools::wallet2::BackgroundMiningYes);
|
||||
m_wallet->rewrite(m_wallet_file, password);
|
||||
start_background_mining();
|
||||
}
|
||||
}
|
||||
//----------------------------------------------------------------------------------------------------
|
||||
bool simple_wallet::start_mining(const std::vector<std::string>& args)
|
||||
{
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue