35#undef ELECTRONEUM_DEFAULT_LOG_CATEGORY
36#define ELECTRONEUM_DEFAULT_LOG_CATEGORY "daemon"
43 ,
const boost::optional<tools::login>& login
48 : m_executor(ip, port, login, ssl_options, is_rpc, rpc_server)
55 std::cout <<
"use: print_pl [white] [gray] [<limit>]" << std::endl;
62 for (
size_t i = 0; i < args.size(); ++i)
64 if (args[i] ==
"white")
68 else if (args[i] ==
"gray")
74 std::cout <<
"unexpected argument: " << args[i] << std::endl;
79 const bool print_both = !white && !gray;
80 return m_executor.print_peer_list(white | print_both, gray | print_both, limit);
85 if (!args.empty())
return false;
87 return m_executor.print_peer_list_stats();
92 if (!args.empty())
return false;
94 return m_executor.save_blockchain();
99 if (!args.empty())
return false;
101 return m_executor.show_hash_rate();
106 if (!args.empty())
return false;
108 return m_executor.hide_hash_rate();
113 if (!args.empty())
return false;
115 return m_executor.show_difficulty();
120 if (!args.empty())
return false;
122 return m_executor.show_status();
127 if (!args.empty())
return false;
129 return m_executor.print_connections();
134 if (!args.empty())
return false;
136 return m_executor.print_net_stats();
143 std::cout <<
"need block index parameter" << std::endl;
150 std::cout <<
"wrong starter block index parameter" << std::endl;
155 std::cout <<
"wrong end block index parameter" << std::endl;
159 return m_executor.print_blockchain_info(start_index, end_index);
166 std::cout <<
"use: set_log [<log_level_number_0-4> | <categories>]" << std::endl;
172 return m_executor.set_log_categories(
"+");
180 std::cout <<
"wrong number range, use: set_log <log_level_number_0-4>" << std::endl;
183 return m_executor.set_log_level(l);
187 return m_executor.set_log_categories(args.front());
193 if (!args.empty())
return false;
195 return m_executor.print_height();
200 bool include_hex =
false;
203 for (
unsigned int i = 1; i < args.size(); ++i) {
204 if (args[i] ==
"+hex")
208 std::cout <<
"unexpected argument: " << args[i] << std::endl;
214 std::cout <<
"expected: print_block (<block_hash> | <block_height>) [+hex]" << std::endl;
218 const std::string& arg = args.front();
222 return m_executor.print_block_by_height(
height, include_hex);
224 catch (
const boost::bad_lexical_cast&)
229 return m_executor.print_block_by_hash(block_hash, include_hex);
238 bool include_hex =
false;
239 bool include_json =
false;
242 for (
unsigned int i = 1; i < args.size(); ++i) {
243 if (args[i] ==
"+hex")
245 else if (args[i] ==
"+json")
249 std::cout <<
"unexpected argument: " << args[i] << std::endl;
255 std::cout <<
"expected: print_tx <transaction_hash> [+hex] [+json]" << std::endl;
259 const std::string& str_hash = args.front();
263 m_executor.print_transaction(tx_hash, include_hex, include_json);
273 std::cout <<
"expected: is_key_image_spent <key_image>" << std::endl;
277 const std::string& str = args.front();
282 memcpy(&ki, &hash,
sizeof(ki));
283 m_executor.is_key_image_spent(ki);
291 if (args.size() != 3) {
292 std::cout <<
"expected: is_public_output_spent <tx hash> <relative output index> <amount without decimal period, eg 0.01 should be 1>" << std::endl;
296 const std::string &tx_hash_str = args[0];
297 const std::string &relative_output_index_str = args[1];
298 const std::string &amount_str = args[2];
303 std::cout <<
"Invalid transaction hash: " << tx_hash_str << std::endl;
310 std::cout <<
"Invalid relative output index: " << relative_output_index_str << std::endl;
317 std::cout <<
"Invalid amount: " << amount_str << std::endl;
327 m_executor.is_public_output_spent(txin);
334 if (!args.empty())
return false;
336 return m_executor.print_transaction_pool_long();
341 if (!args.empty())
return false;
343 return m_executor.print_transaction_pool_short();
348 if (!args.empty())
return false;
350 return m_executor.print_transaction_pool_stats();
357 std::cout <<
"Please specify a wallet address to mine for: start_mining <addr> [<threads>|auto]" << std::endl;
371 [](
const std::string &url,
const std::vector<std::string> &addresses,
bool dnssec_valid){return addresses[0];});
378 std::cout <<
"target account address has wrong format" << std::endl;
402 if (
info.is_subaddress)
408 std::cout <<
"Mining to a " << (nettype ==
cryptonote::TESTNET ?
"testnet" :
"stagenet") <<
" address, make sure this is intentional!" << std::endl;
410 bool do_background_mining =
false;
411 bool ignore_battery =
false;
421 ignore_battery =
true;
433 do_background_mining =
true;
443 if (args[1] ==
"auto" || args[1] ==
"autodetect")
450 threads_count = (ok && 0 < threads_count) ? threads_count : 1;
454 m_executor.start_mining(
info.address, threads_count, nettype, do_background_mining, ignore_battery);
461 if (!args.empty())
return false;
463 return m_executor.stop_mining();
468 return m_executor.mining_status();
473 if (!args.empty())
return false;
475 return m_executor.stop_daemon();
480 if (!args.empty())
return false;
482 return m_executor.print_status();
487 if(args.size()>1)
return false;
489 return m_executor.get_limit();
493 limit = std::stoll(args[0]);
495 catch(
const std::exception& ex) {
496 std::cout <<
"failed to parse argument" << std::endl;
500 return m_executor.set_limit(limit, limit);
505 if(args.size()>1)
return false;
507 return m_executor.get_limit_up();
511 limit = std::stoll(args[0]);
513 catch(
const std::exception& ex) {
514 std::cout <<
"failed to parse argument" << std::endl;
518 return m_executor.set_limit(0, limit);
523 if(args.size()>1)
return false;
525 return m_executor.get_limit_down();
529 limit = std::stoll(args[0]);
531 catch(
const std::exception& ex) {
532 std::cout <<
"failed to parse argument" << std::endl;
536 return m_executor.set_limit(limit, 0);
541 if (args.empty())
return false;
545 limit = std::stoi(args[0]);
548 catch(
const std::exception& ex) {
549 _erro(
"stoi exception");
553 return m_executor.out_peers(limit);
558 if (args.empty())
return false;
562 limit = std::stoi(args[0]);
565 catch(
const std::exception& ex) {
566 _erro(
"stoi exception");
570 return m_executor.in_peers(limit);
575 if (!args.empty())
return false;
576 return m_executor.start_save_graph();
581 if (!args.empty())
return false;
582 return m_executor.stop_save_graph();
588 if (args.size() == 0) {
591 else if (args.size() == 1) {
595 catch(
const std::exception& ex) {
604 return m_executor.hard_fork_info(
version);
609 if (!args.empty())
return false;
610 return m_executor.print_bans();
615 if (args.size() != 1 && args.size() != 2)
return false;
616 std::string ip = args[0];
623 seconds = std::numeric_limits<time_t>::max();
626 seconds = std::stoi(args[1]);
629 catch (
const std::exception &e)
638 return m_executor.ban(ip, seconds);
643 if (args.size() != 1)
return false;
644 std::string ip = args[0];
645 return m_executor.unban(ip);
650 if (args.size() > 1)
return false;
653 if (args.size() == 1)
658 std::cout <<
"failed to parse tx id" << std::endl;
663 return m_executor.flush_txpool(txid);
668 std::vector<uint64_t> amounts;
673 for (
size_t n = 0; n < args.size(); ++n)
675 if (args[n][0] ==
'@')
677 amounts.push_back(boost::lexical_cast<uint64_t>(args[n].c_str() + 1));
681 min_count = boost::lexical_cast<uint64_t>(args[n]);
686 max_count = boost::lexical_cast<uint64_t>(args[n]);
691 std::cout <<
"Invalid syntax: more than two non-amount parameters" << std::endl;
695 return m_executor.output_histogram(amounts, min_count, max_count);
702 std::cout <<
"need block height parameter" << std::endl;
709 std::cout <<
"wrong starter block height parameter" << std::endl;
714 std::cout <<
"wrong count parameter" << std::endl;
718 return m_executor.print_coinbase_tx_sum(
height, count);
725 std::cout <<
"usage: alt_chain_info [block_hash]" << std::endl;
729 return m_executor.alt_chain_info(args.size() == 1 ? args[0] :
"");
736 std::cout <<
"Exactly one parameter is needed" << std::endl;
743 std::cout <<
"wrong number of blocks" << std::endl;
747 return m_executor.print_blockchain_dynamic_stats(nblocks);
754 std::cout <<
"Exactly one parameter is needed: check, download, or update" << std::endl;
758 return m_executor.update(args.front());
763 if (args.size() != 1)
return false;
769 std::cout <<
"failed to parse tx id" << std::endl;
773 return m_executor.relay_tx(txid);
778 if (args.size() != 0)
return false;
780 return m_executor.sync_info();
785 if (args.size() != 1)
787 std::cout <<
"Exactly one parameter is needed" << std::endl;
793 uint64_t nblocks = boost::lexical_cast<uint64_t>(args[0]);
796 std::cout <<
"number of blocks must be greater than 0" << std::endl;
799 return m_executor.pop_blocks(nblocks);
801 catch (
const boost::bad_lexical_cast&)
803 std::cout <<
"number of blocks must be a number greater than 0" << std::endl;
816 if (args.size() > 1)
return false;
818 if (args.empty() || args[0] !=
"confirm")
820 std::cout <<
"Warning: pruning from within electroneumd will not shrink the database file size." << std::endl;
821 std::cout <<
"Instead, parts of the file will be marked as free, so the file will not grow" << std::endl;
822 std::cout <<
"until that newly free space is used up. If you want a smaller file size now," << std::endl;
823 std::cout <<
"exit electroneumd and run electroneum-blockchain-prune (you will temporarily need more" << std::endl;
824 std::cout <<
"disk space for the database conversion though). If you are OK with the database" << std::endl;
825 std::cout <<
"file keeping the same size, re-run this command with the \"confirm\" parameter." << std::endl;
829 return m_executor.prune_blockchain();
834 return m_executor.check_blockchain_pruning();
839 if(args.size() != 1)
return false;
841 std::string
key(args[0]);
843 bool is_validator_key_valid = std::count_if(
key.begin(),
key.end(), [](
int c) {return !std::isxdigit(c);}) == 0;
844 if(!is_validator_key_valid ||
key.size() != 64) {
845 std::cout <<
"Failed to parse validator key (wrong format)." << std::endl;
849 return m_executor.set_validator_key(
key);
854 if(args.size() != 0)
return false;
856 return m_executor.generate_ed25519_keypair();
861 if(args.size() != 2)
return false;
863 std::string
key(args[0]);
864 return m_executor.sign_message(
key, args[1]);
bool show_bans(const std::vector< std::string > &args)
bool alt_chain_info(const std::vector< std::string > &args)
bool print_transaction_pool_long(const std::vector< std::string > &args)
bool version(const std::vector< std::string > &args)
bool print_peer_list(const std::vector< std::string > &args)
bool prune_blockchain(const std::vector< std::string > &args)
bool update(const std::vector< std::string > &args)
bool is_public_output_spent(const std::vector< std::string > &args)
bool print_blockchain_info(const std::vector< std::string > &args)
bool generate_ed25519_keypair(const std::vector< std::string > &args)
bool set_validator_key(const std::vector< std::string > &args)
bool print_height(const std::vector< std::string > &args)
bool relay_tx(const std::vector< std::string > &args)
bool sync_info(const std::vector< std::string > &args)
bool print_peer_list_stats(const std::vector< std::string > &args)
t_command_parser_executor(uint32_t ip, uint16_t port, const boost::optional< tools::login > &login, const epee::net_utils::ssl_options_t &ssl_options, bool is_rpc, cryptonote::core_rpc_server *rpc_server=NULL)
bool stop_save_graph(const std::vector< std::string > &args)
bool set_limit_up(const std::vector< std::string > &args)
bool pop_blocks(const std::vector< std::string > &args)
bool ban(const std::vector< std::string > &args)
bool flush_txpool(const std::vector< std::string > &args)
bool out_peers(const std::vector< std::string > &args)
bool print_coinbase_tx_sum(const std::vector< std::string > &args)
bool check_blockchain_pruning(const std::vector< std::string > &args)
bool start_save_graph(const std::vector< std::string > &args)
bool show_difficulty(const std::vector< std::string > &args)
bool print_transaction_pool_short(const std::vector< std::string > &args)
bool output_histogram(const std::vector< std::string > &args)
bool print_transaction(const std::vector< std::string > &args)
bool is_key_image_spent(const std::vector< std::string > &args)
bool in_peers(const std::vector< std::string > &args)
bool hide_hash_rate(const std::vector< std::string > &args)
bool print_net_stats(const std::vector< std::string > &args)
bool print_blockchain_dynamic_stats(const std::vector< std::string > &args)
bool set_limit(const std::vector< std::string > &args)
bool mining_status(const std::vector< std::string > &args)
bool show_hash_rate(const std::vector< std::string > &args)
bool unban(const std::vector< std::string > &args)
bool print_connections(const std::vector< std::string > &args)
bool stop_daemon(const std::vector< std::string > &args)
bool stop_mining(const std::vector< std::string > &args)
bool sign_message(const std::vector< std::string > &args)
bool print_status(const std::vector< std::string > &args)
bool print_transaction_pool_stats(const std::vector< std::string > &args)
bool save_blockchain(const std::vector< std::string > &args)
bool show_status(const std::vector< std::string > &args)
bool set_log_level(const std::vector< std::string > &args)
bool set_limit_down(const std::vector< std::string > &args)
bool hard_fork_info(const std::vector< std::string > &args)
bool print_block(const std::vector< std::string > &args)
bool start_mining(const std::vector< std::string > &args)
bool parse_hash256(const std::string &str_hash, crypto::hash &hash)
void * memcpy(void *a, const void *b, size_t c)
bool is_no(const std::string &str)
bool is_yes(const std::string &str)
bool get_account_address_from_str(address_parse_info &info, network_type nettype, std::string const &str)
unsigned __int64 uint64_t
const char *const ELECTRONEUM_RELEASE_NAME
const char *const ELECTRONEUM_VERSION_FULL