diff --git a/plugins/net_plugin/net_plugin.cpp b/plugins/net_plugin/net_plugin.cpp index aa3a238820a..0de37112093 100644 --- a/plugins/net_plugin/net_plugin.cpp +++ b/plugins/net_plugin/net_plugin.cpp @@ -2386,18 +2386,26 @@ namespace eosio { if( peer_lib <= lib_num && peer_lib > 0) { try { - block_id_type peer_lib_id = cc.get_block_id_for_num( peer_lib); - on_fork =( msg.last_irreversible_block_id != peer_lib_id); - } - catch( const unknown_block_exception &ex) { - fc_wlog( logger, "peer last irreversible block ${pl} is unknown", ("pl", peer_lib) ); - on_fork = true; + auto peer_lib_blk = cc.fetch_block_by_number(peer_lib); + if (peer_lib_blk) { + on_fork = (msg.last_irreversible_block_id != peer_lib_blk->id()); + } + else { + auto peer_lib_next_blk = cc.fetch_block_by_number(peer_lib + 1); + if (peer_lib_next_blk) { + on_fork = (msg.last_irreversible_block_id != peer_lib_next_blk->previous); + } + else { + on_fork = true; + } + } } catch( ...) { fc_wlog( logger, "caught an exception getting block id for ${pl}",("pl",peer_lib) ); on_fork = true; } if( on_fork) { + fc_wlog( logger, "peer last irreversible block ${pl} is unknown", ("pl", peer_lib) ); fc_elog( logger, "Peer chain is forked" ); c->enqueue( go_away_message( forked )); return; diff --git a/plugins/randpa_plugin/include/eosio/randpa_plugin/randpa.hpp b/plugins/randpa_plugin/include/eosio/randpa_plugin/randpa.hpp index c7b38dc7921..ddb38c8d998 100644 --- a/plugins/randpa_plugin/include/eosio/randpa_plugin/randpa.hpp +++ b/plugins/randpa_plugin/include/eosio/randpa_plugin/randpa.hpp @@ -322,6 +322,16 @@ class randpa { } #endif + template + bool check_is_valid_msg(const T& msg) const { + try { + msg.public_key(); + } catch (const fc::exception&) { + return false; + } + return true; + } + // need handle all messages void process_msg(randpa_message_ptr msg_ptr) { auto msg = *msg_ptr; @@ -338,43 +348,33 @@ class randpa { } } + class net_msg_handler: public fc::visitor { + public: + net_msg_handler(randpa& randpa_ref, uint32_t ses_id): + _randpa(randpa_ref), + _ses_id(ses_id) + { } + + template + void operator() (const T& msg) { + if (_randpa.check_is_valid_msg(msg)) { + _randpa.on(_ses_id, msg); + } + } + + private: + randpa& _randpa; + uint32_t _ses_id; + }; + void process_net_msg(const randpa_net_msg& msg) { if (fc::time_point::now() - msg.receive_time > fc::milliseconds(msg_expiration_ms)) { wlog("Network message dropped, msg age: ${age}", ("age", fc::time_point::now() - msg.receive_time)); return; } - auto ses_id = msg.ses_id; - const auto& data = msg.data; - - switch (data.which()) { - case randpa_net_msg_data::tag::value: - process_round_msg(ses_id, data.get()); - break; - case randpa_net_msg_data::tag::value: - process_round_msg(ses_id, data.get()); - break; - case randpa_net_msg_data::tag::value: - on(ses_id, data.get()); - break; - case randpa_net_msg_data::tag::value: - on(ses_id, data.get()); - break; - case randpa_net_msg_data::tag::value: - on(ses_id, data.get()); - break; - case randpa_net_msg_data::tag::value: - on(ses_id, data.get()); - break; - case randpa_net_msg_data::tag::value: - on(ses_id, data.get()); - break; - default: - wlog("Randpa message received, but handler not found, type: ${type}", - ("type", data.which()) - ); - break; - } + auto visitor = net_msg_handler(*this, msg.ses_id); + msg.data.visit(visitor); } void process_event(const randpa_event& event){ @@ -467,6 +467,14 @@ class randpa { return precommited_keys.size() > node->active_bp_keys.size() * 2 / 3; } + void on(uint32_t ses_id, const prevote_msg& msg) { + process_round_msg(ses_id, msg); + } + + void on(uint32_t ses_id, const precommit_msg& msg) { + process_round_msg(ses_id, msg); + } + void on(uint32_t ses_id, const finality_notice_msg& msg) { const auto& data = msg.data; dlog("Randpa finality_notice_msg received for block ${bid}", ("bid", data.best_block)); @@ -702,6 +710,7 @@ class randpa { if (get_block_num(_lib) < get_block_num(proof.best_block)) { on_proof_gained(proof); + update_lib(proof.best_block); } dlog("round ${r} finished", ("r", _round->get_num())); } diff --git a/programs/daobet-cli/main.cpp b/programs/daobet-cli/main.cpp index a5a7e2d9abe..ef8d106d0ef 100644 --- a/programs/daobet-cli/main.cpp +++ b/programs/daobet-cli/main.cpp @@ -2,7 +2,7 @@ * @file * @copyright defined in eos/LICENSE * @defgroup eosclienttool EOSIO Command Line Client Reference - * @brief Tool for sending transactions and querying state from @ref nodeos + * @brief Tool for sending transactions and querying state from @ref daobet-node * @ingroup eosclienttool */ @@ -11,8 +11,8 @@ @section intro Introduction to cleos - `cleos` is a command line tool that interfaces with the REST api exposed by @ref nodeos. In order to use `cleos` you will need to - have a local copy of `nodeos` running and configured to load the 'eosio::chain_api_plugin'. + `cleos` is a command line tool that interfaces with the REST api exposed by @ref daobet-node. In order to use `cleos` you will need to + have a local copy of `daobet-node` running and configured to load the 'eosio::chain_api_plugin'. cleos contains documentation for all of its commands. For a list of all commands known to cleos, simply run it with no arguments: ``` @@ -23,9 +23,9 @@ Usage: programs/cleos/cleos [OPTIONS] SUBCOMMAND Options: -h,--help Print this help message and exit -u,--url TEXT=http://localhost:8888/ - the http/https URL where nodeos is running + the http/https URL where daobet-node is running --wallet-url TEXT=http://localhost:8888/ - the http/https URL where keosd is running + the http/https URL where daobet-wallet is running -r,--header pass specific HTTP header, repeat this option to pass multiple headers -n,--no-verify don't verify peer certificate when using HTTPS -v,--verbose output verbose errors and action output @@ -149,7 +149,7 @@ FC_DECLARE_EXCEPTION( localized_exception, 10000000, "an error occured" ); FC_MULTILINE_MACRO_END \ ) -//copy pasta from keosd's main.cpp +//copy pasta from daobet-wallet's main.cpp bfs::path determine_home_directory() { bfs::path home; @@ -181,7 +181,7 @@ bool tx_skip_sign = false; bool tx_print_json = false; bool print_request = false; bool print_response = false; -bool no_auto_keosd = false; +bool no_auto_daobet_wallet = false; bool verbose = false; uint8_t tx_max_cpu_usage = 0; @@ -252,9 +252,9 @@ fc::variant call( const std::string& url, } catch(boost::system::system_error& e) { if(url == ::url) - std::cerr << localized("Failed to connect to nodeos at ${u}; is nodeos running?", ("u", url)) << std::endl; + std::cerr << localized("Failed to connect to daobet-node at ${u}; is daobet-node running?", ("u", url)) << std::endl; else if(url == ::wallet_url) - std::cerr << localized("Failed to connect to keosd at ${u}; is keosd running?", ("u", url)) << std::endl; + std::cerr << localized("Failed to connect to daobet-wallet at ${u}; is daobet-wallet running?", ("u", url)) << std::endl; throw connection_exception(fc::log_messages{FC_LOG_MESSAGE(error, e.what())}); } } @@ -884,16 +884,16 @@ void try_local_port(uint32_t duration) { auto start_time = duration_cast( system_clock::now().time_since_epoch() ).count(); while ( !local_port_used()) { if (duration_cast( system_clock::now().time_since_epoch()).count() - start_time > duration ) { - std::cerr << "Unable to connect to keosd, if keosd is running please kill the process and try again.\n"; - throw connection_exception(fc::log_messages{FC_LOG_MESSAGE(error, "Unable to connect to keosd")}); + std::cerr << "Unable to connect to daobet-wallet, if daobet-wallet is running please kill the process and try again.\n"; + throw connection_exception(fc::log_messages{FC_LOG_MESSAGE(error, "Unable to connect to daobet-wallet")}); } } } -void ensure_keosd_running(CLI::App* app) { - if (no_auto_keosd) +void ensure_daobet_wallet_running(CLI::App* app) { + if (no_auto_daobet_wallet) return; - // get, version, net do not require keosd + // get, version, net do not require daobet-wallet if (tx_skip_sign || app->got_subcommand("get") || app->got_subcommand("version") || app->got_subcommand("net")) return; if (app->get_subcommand("create")->got_subcommand("key")) // create key does not require wallet @@ -913,9 +913,9 @@ void ensure_keosd_running(CLI::App* app) { // This extra check is necessary when running cleos like this: ./cleos ... if (binPath.filename_is_dot()) binPath.remove_filename(); - binPath.append(key_store_executable_name); // if cleos and keosd are in the same installation directory + binPath.append(key_store_executable_name); // if cleos and daobet-wallet are in the same installation directory if (!boost::filesystem::exists(binPath)) { - binPath.remove_filename().remove_filename().append("keosd").append(key_store_executable_name); + binPath.remove_filename().remove_filename().append("daobet-wallet").append(key_store_executable_name); } if (boost::filesystem::exists(binPath)) { @@ -943,7 +943,7 @@ void ensure_keosd_running(CLI::App* app) { } } else { std::cerr << "No wallet service listening on " - << ". Cannot automatically start keosd because keosd was not found." << std::endl; + << ". Cannot automatically start daobet-wallet because daobet-wallet was not found." << std::endl; } } @@ -1155,12 +1155,12 @@ struct approve_producer_subcommand { ("table_key", "owner") ("lower_bound", voter.value) ("upper_bound", voter.value + 1) - // Less than ideal upper_bound usage preserved so cleos can still work with old buggy nodeos versions - // Change to voter.value when cleos no longer needs to support nodeos versions older than 1.5.0 + // Less than ideal upper_bound usage preserved so cleos can still work with old buggy daobet-node versions + // Change to voter.value when cleos no longer needs to support daobet-node versions older than 1.5.0 ("limit", 1) ); auto res = result.as(); - // Condition in if statement below can simply be res.rows.empty() when cleos no longer needs to support nodeos versions older than 1.5.0 + // Condition in if statement below can simply be res.rows.empty() when cleos no longer needs to support daobet-node versions older than 1.5.0 // Although since this subcommand will actually change the voter's vote, it is probably better to just keep this check to protect // against future potential chain_plugin bugs. if( res.rows.empty() || res.rows[0].get_object()["owner"].as_string() != name(voter).to_string() ) { @@ -1208,12 +1208,12 @@ struct unapprove_producer_subcommand { ("table_key", "owner") ("lower_bound", voter.value) ("upper_bound", voter.value + 1) - // Less than ideal upper_bound usage preserved so cleos can still work with old buggy nodeos versions - // Change to voter.value when cleos no longer needs to support nodeos versions older than 1.5.0 + // Less than ideal upper_bound usage preserved so cleos can still work with old buggy daobet-node versions + // Change to voter.value when cleos no longer needs to support daobet-node versions older than 1.5.0 ("limit", 1) ); auto res = result.as(); - // Condition in if statement below can simply be res.rows.empty() when cleos no longer needs to support nodeos versions older than 1.5.0 + // Condition in if statement below can simply be res.rows.empty() when cleos no longer needs to support daobet-node versions older than 1.5.0 // Although since this subcommand will actually change the voter's vote, it is probably better to just keep this check to protect // against future potential chain_plugin bugs. if( res.rows.empty() || res.rows[0].get_object()["owner"].as_string() != name(voter).to_string() ) { @@ -1436,15 +1436,15 @@ struct bidname_info_subcommand { ("code", "eosio")("scope", "eosio")("table", "namebids") ("lower_bound", newname.value) ("upper_bound", newname.value + 1) - // Less than ideal upper_bound usage preserved so cleos can still work with old buggy nodeos versions - // Change to newname.value when cleos no longer needs to support nodeos versions older than 1.5.0 + // Less than ideal upper_bound usage preserved so cleos can still work with old buggy daobet-node versions + // Change to newname.value when cleos no longer needs to support daobet-node versions older than 1.5.0 ("limit", 1)); if ( print_json ) { std::cout << fc::json::to_pretty_string(rawResult) << std::endl; return; } auto result = rawResult.as(); - // Condition in if statement below can simply be res.rows.empty() when cleos no longer needs to support nodeos versions older than 1.5.0 + // Condition in if statement below can simply be res.rows.empty() when cleos no longer needs to support daobet-node versions older than 1.5.0 if( result.rows.empty() || result.rows[0].get_object()["newname"].as_string() != newname.to_string() ) { std::cout << "No bidname record found" << std::endl; return; @@ -1625,405 +1625,6 @@ struct canceldelay_subcommand { } }; -struct deposit_subcommand { - string owner_str; - string amount_str; - const name act_name{ N(deposit) }; - - deposit_subcommand(CLI::App* actionRoot) { - auto deposit = actionRoot->add_subcommand("deposit", localized("Deposit into owner's REX fund by transfering from owner's liquid token balance")); - deposit->add_option("owner", owner_str, localized("Account which owns the REX fund"))->required(); - deposit->add_option("amount", amount_str, localized("Amount to be deposited into REX fund"))->required(); - add_standard_transaction_options(deposit, "owner@active"); - deposit->set_callback([this] { - fc::variant act_payload = fc::mutable_variant_object() - ("owner", owner_str) - ("amount", amount_str); - auto accountPermissions = get_account_permissions(tx_permission, {owner_str, config::active_name}); - send_actions({create_action(accountPermissions, config::system_account_name, act_name, act_payload)}); - }); - } -}; - -struct withdraw_subcommand { - string owner_str; - string amount_str; - const name act_name{ N(withdraw) }; - - withdraw_subcommand(CLI::App* actionRoot) { - auto withdraw = actionRoot->add_subcommand("withdraw", localized("Withdraw from owner's REX fund by transfering to owner's liquid token balance")); - withdraw->add_option("owner", owner_str, localized("Account which owns the REX fund"))->required(); - withdraw->add_option("amount", amount_str, localized("Amount to be withdrawn from REX fund"))->required(); - add_standard_transaction_options(withdraw, "owner@active"); - withdraw->set_callback([this] { - fc::variant act_payload = fc::mutable_variant_object() - ("owner", owner_str) - ("amount", amount_str); - auto accountPermissions = get_account_permissions(tx_permission, {owner_str, config::active_name}); - send_actions({create_action(accountPermissions, config::system_account_name, act_name, act_payload)}); - }); - } -}; - -struct buyrex_subcommand { - string from_str; - string amount_str; - const name act_name{ N(buyrex) }; - - buyrex_subcommand(CLI::App* actionRoot) { - auto buyrex = actionRoot->add_subcommand("buyrex", localized("Buy REX using tokens in owner's REX fund")); - buyrex->add_option("from", from_str, localized("Account buying REX tokens"))->required(); - buyrex->add_option("amount", amount_str, localized("Amount to be taken from REX fund and used in buying REX"))->required(); - add_standard_transaction_options(buyrex, "from@active"); - buyrex->set_callback([this] { - fc::variant act_payload = fc::mutable_variant_object() - ("from", from_str) - ("amount", amount_str); - auto accountPermissions = get_account_permissions(tx_permission, {from_str, config::active_name}); - send_actions({create_action(accountPermissions, config::system_account_name, act_name, act_payload)}); - }); - } -}; - -struct lendrex_subcommand { - string from_str; - string amount_str; - const name act_name1{ N(deposit) }; - const name act_name2{ N(buyrex) }; - - lendrex_subcommand(CLI::App* actionRoot) { - auto lendrex = actionRoot->add_subcommand("lendrex", localized("Deposit tokens to REX fund and use the tokens to buy REX")); - lendrex->add_option("from", from_str, localized("Account buying REX tokens"))->required(); - lendrex->add_option("amount", amount_str, localized("Amount of liquid tokens to be used in buying REX"))->required(); - add_standard_transaction_options(lendrex, "from@active"); - lendrex->set_callback([this] { - fc::variant act_payload1 = fc::mutable_variant_object() - ("owner", from_str) - ("amount", amount_str); - fc::variant act_payload2 = fc::mutable_variant_object() - ("from", from_str) - ("amount", amount_str); - auto accountPermissions = get_account_permissions(tx_permission, {from_str, config::active_name}); - send_actions({create_action(accountPermissions, config::system_account_name, act_name1, act_payload1), - create_action(accountPermissions, config::system_account_name, act_name2, act_payload2)}); - }); - } -}; - -struct unstaketorex_subcommand { - string owner_str; - string receiver_str; - string from_net_str; - string from_cpu_str; - const name act_name{ N(unstaketorex) }; - - unstaketorex_subcommand(CLI::App* actionRoot) { - auto unstaketorex = actionRoot->add_subcommand("unstaketorex", localized("Buy REX using staked tokens")); - unstaketorex->add_option("owner", owner_str, localized("Account buying REX tokens"))->required(); - unstaketorex->add_option("receiver", receiver_str, localized("Account that tokens have been staked to"))->required(); - unstaketorex->add_option("from_net", from_net_str, localized("Amount to be unstaked from Net resources and used in REX purchase"))->required(); - unstaketorex->add_option("from_cpu", from_cpu_str, localized("Amount to be unstaked from CPU resources and used in REX purchase"))->required(); - add_standard_transaction_options(unstaketorex, "owner@active"); - unstaketorex->set_callback([this] { - fc::variant act_payload = fc::mutable_variant_object() - ("owner", owner_str) - ("receiver", receiver_str) - ("from_net", from_net_str) - ("from_cpu", from_cpu_str); - auto accountPermissions = get_account_permissions(tx_permission, {owner_str, config::active_name}); - send_actions({create_action(accountPermissions, config::system_account_name, act_name, act_payload)}); - }); - } -}; - -struct sellrex_subcommand { - string from_str; - string rex_str; - const name act_name{ N(sellrex) }; - - sellrex_subcommand(CLI::App* actionRoot) { - auto sellrex = actionRoot->add_subcommand("sellrex", localized("Sell REX tokens")); - sellrex->add_option("from", from_str, localized("Account selling REX tokens"))->required(); - sellrex->add_option("rex", rex_str, localized("Amount of REX tokens to be sold"))->required(); - add_standard_transaction_options(sellrex, "from@active"); - sellrex->set_callback([this] { - fc::variant act_payload = fc::mutable_variant_object() - ("from", from_str) - ("rex", rex_str); - auto accountPermissions = get_account_permissions(tx_permission, {from_str, config::active_name}); - send_actions({create_action(accountPermissions, config::system_account_name, act_name, act_payload)}); - }); - } -}; - -struct cancelrexorder_subcommand { - string owner_str; - const name act_name{ N(cnclrexorder) }; - - cancelrexorder_subcommand(CLI::App* actionRoot) { - auto cancelrexorder = actionRoot->add_subcommand("cancelrexorder", localized("Cancel queued REX sell order if one exists")); - cancelrexorder->add_option("owner", owner_str, localized("Owner account of sell order"))->required(); - add_standard_transaction_options(cancelrexorder, "owner@active"); - cancelrexorder->set_callback([this] { - fc::variant act_payload = fc::mutable_variant_object()("owner", owner_str); - auto accountPermissions = get_account_permissions(tx_permission, {owner_str, config::active_name}); - send_actions({create_action(accountPermissions, config::system_account_name, act_name, act_payload)}); - }); - } -}; - -struct rentcpu_subcommand { - string from_str; - string receiver_str; - string loan_payment_str; - string loan_fund_str; - const name act_name{ N(rentcpu) }; - - rentcpu_subcommand(CLI::App* actionRoot) { - auto rentcpu = actionRoot->add_subcommand("rentcpu", localized("Rent CPU bandwidth for 30 days")); - rentcpu->add_option("from", from_str, localized("Account paying rent fees"))->required(); - rentcpu->add_option("receiver", receiver_str, localized("Account to whom rented CPU bandwidth is staked"))->required(); - rentcpu->add_option("loan_payment", loan_payment_str, localized("Loan fee to be paid, used to calculate amount of rented bandwidth"))->required(); - rentcpu->add_option("loan_fund", loan_fund_str, localized("Loan fund to be used in automatic renewal, can be 0 tokens"))->required(); - add_standard_transaction_options(rentcpu, "from@active"); - rentcpu->set_callback([this] { - fc::variant act_payload = fc::mutable_variant_object() - ("from", from_str) - ("receiver", receiver_str) - ("loan_payment", loan_payment_str) - ("loan_fund", loan_fund_str); - auto accountPermissions = get_account_permissions(tx_permission, {from_str, config::active_name}); - send_actions({create_action(accountPermissions, config::system_account_name, act_name, act_payload)}); - }); - } -}; - -struct rentnet_subcommand { - string from_str; - string receiver_str; - string loan_payment_str; - string loan_fund_str; - const name act_name{ N(rentnet) }; - - rentnet_subcommand(CLI::App* actionRoot) { - auto rentnet = actionRoot->add_subcommand("rentnet", localized("Rent Network bandwidth for 30 days")); - rentnet->add_option("from", from_str, localized("Account paying rent fees"))->required(); - rentnet->add_option("receiver", receiver_str, localized("Account to whom rented Network bandwidth is staked"))->required(); - rentnet->add_option("loan_payment", loan_payment_str, localized("Loan fee to be paid, used to calculate amount of rented bandwidth"))->required(); - rentnet->add_option("loan_fund", loan_fund_str, localized("Loan fund to be used in automatic renewal, can be 0 tokens"))->required(); - add_standard_transaction_options(rentnet, "from@active"); - rentnet->set_callback([this] { - fc::variant act_payload = fc::mutable_variant_object() - ("from", from_str) - ("receiver", receiver_str) - ("loan_payment", loan_payment_str) - ("loan_fund", loan_fund_str); - auto accountPermissions = get_account_permissions(tx_permission, {from_str, config::active_name}); - send_actions({create_action(accountPermissions, config::system_account_name, act_name, act_payload)}); - }); - } -}; - -struct fundcpuloan_subcommand { - string from_str; - string loan_num_str; - string payment_str; - const name act_name{ N(fundcpuloan) }; - - fundcpuloan_subcommand(CLI::App* actionRoot) { - auto fundcpuloan = actionRoot->add_subcommand("fundcpuloan", localized("Deposit into a CPU loan fund")); - fundcpuloan->add_option("from", from_str, localized("Loan owner"))->required(); - fundcpuloan->add_option("loan_num", loan_num_str, localized("Loan ID"))->required(); - fundcpuloan->add_option("payment", payment_str, localized("Amount to be deposited"))->required(); - add_standard_transaction_options(fundcpuloan, "from@active"); - fundcpuloan->set_callback([this] { - fc::variant act_payload = fc::mutable_variant_object() - ("from", from_str) - ("loan_num", loan_num_str) - ("payment", payment_str); - auto accountPermissions = get_account_permissions(tx_permission, {from_str, config::active_name}); - send_actions({create_action(accountPermissions, config::system_account_name, act_name, act_payload)}); - }); - } -}; - -struct fundnetloan_subcommand { - string from_str; - string loan_num_str; - string payment_str; - const name act_name{ N(fundnetloan) }; - - fundnetloan_subcommand(CLI::App* actionRoot) { - auto fundnetloan = actionRoot->add_subcommand("fundnetloan", localized("Deposit into a Network loan fund")); - fundnetloan->add_option("from", from_str, localized("Loan owner"))->required(); - fundnetloan->add_option("loan_num", loan_num_str, localized("Loan ID"))->required(); - fundnetloan->add_option("payment", payment_str, localized("Amount to be deposited"))->required(); - add_standard_transaction_options(fundnetloan, "from@active"); - fundnetloan->set_callback([this] { - fc::variant act_payload = fc::mutable_variant_object() - ("from", from_str) - ("loan_num", loan_num_str) - ("payment", payment_str); - auto accountPermissions = get_account_permissions(tx_permission, {from_str, config::active_name}); - send_actions({create_action(accountPermissions, config::system_account_name, act_name, act_payload)}); - }); - } -}; - -struct defcpuloan_subcommand { - string from_str; - string loan_num_str; - string amount_str; - const name act_name{ N(defcpuloan) }; - - defcpuloan_subcommand(CLI::App* actionRoot) { - auto defcpuloan = actionRoot->add_subcommand("defundcpuloan", localized("Withdraw from a CPU loan fund")); - defcpuloan->add_option("from", from_str, localized("Loan owner"))->required(); - defcpuloan->add_option("loan_num", loan_num_str, localized("Loan ID"))->required(); - defcpuloan->add_option("amount", amount_str, localized("Amount to be withdrawn"))->required(); - add_standard_transaction_options(defcpuloan, "from@active"); - defcpuloan->set_callback([this] { - fc::variant act_payload = fc::mutable_variant_object() - ("from", from_str) - ("loan_num", loan_num_str) - ("amount", amount_str); - auto accountPermissions = get_account_permissions(tx_permission, {from_str, config::active_name}); - send_actions({create_action(accountPermissions, config::system_account_name, act_name, act_payload)}); - }); - } -}; - -struct defnetloan_subcommand { - string from_str; - string loan_num_str; - string amount_str; - const name act_name{ N(defnetloan) }; - - defnetloan_subcommand(CLI::App* actionRoot) { - auto defnetloan = actionRoot->add_subcommand("defundnetloan", localized("Withdraw from a Network loan fund")); - defnetloan->add_option("from", from_str, localized("Loan owner"))->required(); - defnetloan->add_option("loan_num", loan_num_str, localized("Loan ID"))->required(); - defnetloan->add_option("amount", amount_str, localized("Amount to be withdrawn"))->required(); - add_standard_transaction_options(defnetloan, "from@active"); - defnetloan->set_callback([this] { - fc::variant act_payload = fc::mutable_variant_object() - ("from", from_str) - ("loan_num", loan_num_str) - ("amount", amount_str); - auto accountPermissions = get_account_permissions(tx_permission, {from_str, config::active_name}); - send_actions({create_action(accountPermissions, config::system_account_name, act_name, act_payload)}); - }); - } -}; - -struct mvtosavings_subcommand { - string owner_str; - string rex_str; - const name act_name{ N(mvtosavings) }; - - mvtosavings_subcommand(CLI::App* actionRoot) { - auto mvtosavings = actionRoot->add_subcommand("mvtosavings", localized("Move REX tokens to savings bucket")); - mvtosavings->add_option("owner", owner_str, localized("REX owner"))->required(); - mvtosavings->add_option("rex", rex_str, localized("Amount of REX to be moved to savings bucket"))->required(); - add_standard_transaction_options(mvtosavings, "owner@active"); - mvtosavings->set_callback([this] { - fc::variant act_payload = fc::mutable_variant_object() - ("owner", owner_str) - ("rex", rex_str); - auto accountPermissions = get_account_permissions(tx_permission, {owner_str, config::active_name}); - send_actions({create_action(accountPermissions, config::system_account_name, act_name, act_payload)}); - }); - } -}; - -struct mvfrsavings_subcommand { - string owner_str; - string rex_str; - const name act_name{ N(mvfrsavings) }; - - mvfrsavings_subcommand(CLI::App* actionRoot) { - auto mvfrsavings = actionRoot->add_subcommand("mvfromsavings", localized("Move REX tokens out of savings bucket")); - mvfrsavings->add_option("owner", owner_str, localized("REX owner"))->required(); - mvfrsavings->add_option("rex", rex_str, localized("Amount of REX to be moved out of savings bucket"))->required(); - add_standard_transaction_options(mvfrsavings, "owner@active"); - mvfrsavings->set_callback([this] { - fc::variant act_payload = fc::mutable_variant_object() - ("owner", owner_str) - ("rex", rex_str); - auto accountPermissions = get_account_permissions(tx_permission, {owner_str, config::active_name}); - send_actions({create_action(accountPermissions, config::system_account_name, act_name, act_payload)}); - }); - } -}; - -struct updaterex_subcommand { - string owner_str; - const name act_name{ N(updaterex) }; - - updaterex_subcommand(CLI::App* actionRoot) { - auto updaterex = actionRoot->add_subcommand("updaterex", localized("Update REX owner vote stake and vote weight")); - updaterex->add_option("owner", owner_str, localized("REX owner"))->required(); - add_standard_transaction_options(updaterex, "owner@active"); - updaterex->set_callback([this] { - fc::variant act_payload = fc::mutable_variant_object()("owner", owner_str); - auto accountPermissions = get_account_permissions(tx_permission, {owner_str, config::active_name}); - send_actions({create_action(accountPermissions, config::system_account_name, act_name, act_payload)}); - }); - } -}; - -struct consolidate_subcommand { - string owner_str; - const name act_name{ N(consolidate) }; - - consolidate_subcommand(CLI::App* actionRoot) { - auto consolidate = actionRoot->add_subcommand("consolidate", localized("Consolidate REX maturity buckets into one that matures in 4 days")); - consolidate->add_option("owner", owner_str, localized("REX owner"))->required(); - add_standard_transaction_options(consolidate, "owner@active"); - consolidate->set_callback([this] { - fc::variant act_payload = fc::mutable_variant_object()("owner", owner_str); - auto accountPermissions = get_account_permissions(tx_permission, {owner_str, config::active_name}); - send_actions({create_action(accountPermissions, config::system_account_name, act_name, act_payload)}); - }); - } -}; - -struct rexexec_subcommand { - string user_str; - string max_str; - const name act_name{ N(rexexec) }; - - rexexec_subcommand(CLI::App* actionRoot) { - auto rexexec = actionRoot->add_subcommand("rexexec", localized("Perform REX maintenance by processing expired loans and unfilled sell orders")); - rexexec->add_option("user", user_str, localized("User executing the action"))->required(); - rexexec->add_option("max", max_str, localized("Maximum number of CPU loans, Network loans, and sell orders to be processed"))->required(); - add_standard_transaction_options(rexexec, "user@active"); - rexexec->set_callback([this] { - fc::variant act_payload = fc::mutable_variant_object() - ("user", user_str) - ("max", max_str); - auto accountPermissions = get_account_permissions(tx_permission, {user_str, config::active_name}); - send_actions({create_action(accountPermissions, config::system_account_name, act_name, act_payload)}); - }); - } -}; - -struct closerex_subcommand { - string owner_str; - const name act_name{ N(closerex) }; - - closerex_subcommand(CLI::App* actionRoot) { - auto closerex = actionRoot->add_subcommand("closerex", localized("Delete unused REX-related user table entries")); - closerex->add_option("owner", owner_str, localized("REX owner"))->required(); - add_standard_transaction_options(closerex, "owner@active"); - closerex->set_callback([this] { - fc::variant act_payload = fc::mutable_variant_object()("owner", owner_str); - auto accountPermissions = get_account_permissions(tx_permission, {owner_str, config::active_name}); - send_actions({create_action(accountPermissions, config::system_account_name, act_name, act_payload)}); - }); - } -}; - void get_account( const string& accountName, const string& coresym, bool json_format ) { fc::variant json; if (coresym.empty()) { @@ -2132,7 +1733,7 @@ void get_account( const string& accountName, const string& coresym, bool json_fo auto net_total = to_asset(res.total_resources.get_object()["net_weight"].as_string()); if( net_total.get_symbol() != unstaking.get_symbol() ) { - // Core symbol of nodeos responding to the request is different than core symbol built into cleos + // Core symbol of daobet-node responding to the request is different than core symbol built into cleos unstaking = asset( 0, net_total.get_symbol() ); // Correct core symbol for unstaking asset. staked = asset( 0, net_total.get_symbol() ); // Correct core symbol for staked asset. } @@ -2254,7 +1855,7 @@ void get_account( const string& accountName, const string& coresym, bool json_fo if( res.refund_request.is_object() ) { auto obj = res.refund_request.get_object(); auto request_time = fc::time_point_sec::from_iso_string( obj["request_time"].as_string() ); - fc::time_point refund_time = request_time + fc::days(3); + fc::time_point refund_time = request_time + fc::days(14); auto now = res.head_block_time; asset net = asset::from_string( obj["net_amount"].as_string() ); asset cpu = asset::from_string( obj["cpu_amount"].as_string() ); @@ -2337,18 +1938,18 @@ int main( int argc, char** argv ) { CLI::App app{"Command Line Interface to EOSIO Client"}; app.require_subcommand(); - app.add_option( "-H,--host", obsoleted_option_host_port, localized("the host where nodeos is running") )->group("hidden"); - app.add_option( "-p,--port", obsoleted_option_host_port, localized("the port where nodeos is running") )->group("hidden"); - app.add_option( "--wallet-host", obsoleted_option_host_port, localized("the host where keosd is running") )->group("hidden"); - app.add_option( "--wallet-port", obsoleted_option_host_port, localized("the port where keosd is running") )->group("hidden"); + app.add_option( "-H,--host", obsoleted_option_host_port, localized("the host where daobet-node is running") )->group("hidden"); + app.add_option( "-p,--port", obsoleted_option_host_port, localized("the port where daobet-node is running") )->group("hidden"); + app.add_option( "--wallet-host", obsoleted_option_host_port, localized("the host where daobet-wallet is running") )->group("hidden"); + app.add_option( "--wallet-port", obsoleted_option_host_port, localized("the port where daobet-wallet is running") )->group("hidden"); - app.add_option( "-u,--url", url, localized("the http/https URL where nodeos is running"), true ); - app.add_option( "--wallet-url", wallet_url, localized("the http/https URL where keosd is running"), true ); + app.add_option( "-u,--url", url, localized("the http/https URL where daobet-node is running"), true ); + app.add_option( "--wallet-url", wallet_url, localized("the http/https URL where daobet-wallet is running"), true ); app.add_option( "-r,--header", header_opt_callback, localized("pass specific HTTP header; repeat this option to pass multiple headers")); app.add_flag( "-n,--no-verify", no_verify, localized("don't verify peer certificate when using HTTPS")); - app.add_flag( "--no-auto-keosd", no_auto_keosd, localized("don't automatically launch a keosd if one is not currently running")); - app.set_callback([&app]{ ensure_keosd_running(&app);}); + app.add_flag( "--no-auto-daobet-wallet", no_auto_daobet_wallet, localized("don't automatically launch a daobet-wallet if one is not currently running")); + app.set_callback([&app]{ ensure_daobet_wallet_running(&app);}); app.add_flag( "-v,--verbose", verbose, localized("output verbose errors and action console output")); app.add_flag("--print-request", print_request, localized("print HTTP request to STDERR")); @@ -2404,7 +2005,7 @@ int main( int argc, char** argv ) { bool pack_action_data_flag = false; auto pack_transaction = convert->add_subcommand("pack_transaction", localized("From plain signed json to packed form")); pack_transaction->add_option("transaction", plain_signed_transaction_json, localized("The plain signed json (string)"))->required(); - pack_transaction->add_flag("--pack-action-data", pack_action_data_flag, localized("Pack all action data within transaction, needs interaction with nodeos")); + pack_transaction->add_flag("--pack-action-data", pack_action_data_flag, localized("Pack all action data within transaction, needs interaction with daobet-node")); pack_transaction->set_callback([&] { fc::variant trx_var; try { @@ -2427,7 +2028,7 @@ int main( int argc, char** argv ) { bool unpack_action_data_flag = false; auto unpack_transaction = convert->add_subcommand("unpack_transaction", localized("From packed to plain signed json form")); unpack_transaction->add_option("transaction", packed_transaction_json, localized("The packed transaction json (string containing packed_trx and optionally compression fields)"))->required(); - unpack_transaction->add_flag("--unpack-action-data", unpack_action_data_flag, localized("Unpack all action data within transaction, needs interaction with nodeos")); + unpack_transaction->add_flag("--unpack-action-data", unpack_action_data_flag, localized("Unpack all action data within transaction, needs interaction with daobet-node")); unpack_transaction->set_callback([&] { fc::variant packed_trx_var; packed_transaction packed_trx; @@ -2542,12 +2143,12 @@ int main( int argc, char** argv ) { abi = fc::json::to_pretty_string(abi_d); } catch(chain::missing_chain_api_plugin_exception&) { - //see if this is an old nodeos that doesn't support get_raw_code_and_abi + //see if this is an old daobet-node that doesn't support get_raw_code_and_abi const auto old_result = call(get_code_func, fc::mutable_variant_object("account_name", accountName)("code_as_wasm",code_as_wasm)); code_hash = old_result["code_hash"].as_string(); if(code_as_wasm) { wasm = old_result["wasm"].as_string(); - std::cout << localized("Warning: communicating to older nodeos which returns malformed binary wasm") << std::endl; + std::cout << localized("Warning: communicating to older daobet-node which returns malformed binary wasm") << std::endl; } else wast = old_result["wast"].as_string(); @@ -3276,10 +2877,10 @@ int main( int argc, char** argv ) { std::cout << fc::json::to_pretty_string(v) << std::endl; }); - auto stopKeosd = wallet->add_subcommand("stop", localized("Stop keosd."), false); - stopKeosd->set_callback([] { + auto stopdaobet_wallet = wallet->add_subcommand("stop", localized("Stop daobet-wallet."), false); + stopdaobet_wallet->set_callback([] { const auto& v = call(wallet_url, keosd_stop); - if ( !v.is_object() || v.get_object().size() != 0 ) { //on success keosd responds with empty object + if ( !v.is_object() || v.get_object().size() != 0 ) { //on success daobet-wallet responds with empty object std::cerr << fc::json::to_pretty_string(v) << std::endl; } else { std::cout << "OK" << std::endl; @@ -3305,7 +2906,7 @@ int main( int argc, char** argv ) { fc::optional chain_id; if( str_chain_id.size() == 0 ) { - ilog( "grabbing chain_id from nodeos" ); + ilog( "grabbing chain_id from daobet-node" ); auto info = get_info(); chain_id = info.chain_id; } else { @@ -3545,14 +3146,14 @@ int main( int argc, char** argv ) { ("table_key", "") ("lower_bound", name(proposal_name).value) ("upper_bound", name(proposal_name).value + 1) - // Less than ideal upper_bound usage preserved so cleos can still work with old buggy nodeos versions - // Change to name(proposal_name).value when cleos no longer needs to support nodeos versions older than 1.5.0 + // Less than ideal upper_bound usage preserved so cleos can still work with old buggy daobet-node versions + // Change to name(proposal_name).value when cleos no longer needs to support daobet-node versions older than 1.5.0 ("limit", 1) ); //std::cout << fc::json::to_pretty_string(result) << std::endl; const auto& rows1 = result1.get_object()["rows"].get_array(); - // Condition in if statement below can simply be rows.empty() when cleos no longer needs to support nodeos versions older than 1.5.0 + // Condition in if statement below can simply be rows.empty() when cleos no longer needs to support daobet-node versions older than 1.5.0 if( rows1.empty() || rows1[0].get_object()["proposal_name"] != proposal_name ) { std::cerr << "Proposal not found" << std::endl; return; @@ -3581,8 +3182,8 @@ int main( int argc, char** argv ) { ("table_key", "") ("lower_bound", name(proposal_name).value) ("upper_bound", name(proposal_name).value + 1) - // Less than ideal upper_bound usage preserved so cleos can still work with old buggy nodeos versions - // Change to name(proposal_name).value when cleos no longer needs to support nodeos versions older than 1.5.0 + // Less than ideal upper_bound usage preserved so cleos can still work with old buggy daobet-node versions + // Change to name(proposal_name).value when cleos no longer needs to support daobet-node versions older than 1.5.0 ("limit", 1) ); rows2 = result2.get_object()["rows"].get_array(); @@ -3613,8 +3214,8 @@ int main( int argc, char** argv ) { ("table_key", "") ("lower_bound", name(proposal_name).value) ("upper_bound", name(proposal_name).value + 1) - // Less than ideal upper_bound usage preserved so cleos can still work with old buggy nodeos versions - // Change to name(proposal_name).value when cleos no longer needs to support nodeos versions older than 1.5.0 + // Less than ideal upper_bound usage preserved so cleos can still work with old buggy daobet-node versions + // Change to name(proposal_name).value when cleos no longer needs to support daobet-node versions older than 1.5.0 ("limit", 1) ); const auto& rows3 = result3.get_object()["rows"].get_array(); @@ -3646,8 +3247,8 @@ int main( int argc, char** argv ) { ("table_key", "") ("lower_bound", a.first.value) ("upper_bound", a.first.value + 1) - // Less than ideal upper_bound usage preserved so cleos can still work with old buggy nodeos versions - // Change to name(proposal_name).value when cleos no longer needs to support nodeos versions older than 1.5.0 + // Less than ideal upper_bound usage preserved so cleos can still work with old buggy daobet-node versions + // Change to name(proposal_name).value when cleos no longer needs to support daobet-node versions older than 1.5.0 ("limit", 1) ); const auto& rows4 = result4.get_object()["rows"].get_array(); @@ -3901,29 +3502,6 @@ int main( int argc, char** argv ) { auto cancelDelay = canceldelay_subcommand(system); - auto rex = system->add_subcommand("rex", localized("Actions related to REX (the resource exchange)")); - rex->require_subcommand(); - auto deposit = deposit_subcommand(rex); - auto withdraw = withdraw_subcommand(rex); - auto buyrex = buyrex_subcommand(rex); - auto lendrex = lendrex_subcommand(rex); - auto unstaketorex = unstaketorex_subcommand(rex); - auto sellrex = sellrex_subcommand(rex); - auto cancelrexorder = cancelrexorder_subcommand(rex); - auto mvtosavings = mvtosavings_subcommand(rex); - auto mvfromsavings = mvfrsavings_subcommand(rex); - auto rentcpu = rentcpu_subcommand(rex); - auto rentnet = rentnet_subcommand(rex); - auto fundcpuloan = fundcpuloan_subcommand(rex); - auto fundnetloan = fundnetloan_subcommand(rex); - auto defcpuloan = defcpuloan_subcommand(rex); - auto defnetloan = defnetloan_subcommand(rex); - auto consolidate = consolidate_subcommand(rex); - auto updaterex = updaterex_subcommand(rex); - auto rexexec = rexexec_subcommand(rex); - auto closerex = closerex_subcommand(rex); - - try { app.parse(argc, argv); } catch (const CLI::ParseError &e) { diff --git a/simulator/include/simulator.hpp b/simulator/include/simulator.hpp index 1292184b39b..67851c05490 100644 --- a/simulator/include/simulator.hpp +++ b/simulator/include/simulator.hpp @@ -18,6 +18,8 @@ #include #include +enum class node_type {BP, FN}; + static std::ostream& operator<<(std::ostream& os, const block_id_type& block) { os << block.str().substr(16, 4); return os; @@ -216,9 +218,14 @@ class TestRunner { delay_matrix[i][j] = delay_matrix[j][i] = delay; } } + assert(delay_matrix.size() == nodetypes.size()); count_dist_matrix(); } + void load_nodetypes(const std::vector& tnodes) { + nodetypes = tnodes; + } + void load_graph_from_file(const char* filename) { int instances; int from, to, delay; @@ -275,12 +282,19 @@ class TestRunner { } vector get_ordering() { - vector permutation(get_instances()); - iota(permutation.begin(), permutation.end(), 0); + vector permutation(get_bp_list()); random_shuffle(permutation.begin(), permutation.end(), [](size_t n) { return rand() % n; }); return permutation; } + vector get_bp_list() { + vector bp_list; + for(int i = 0; i(get_instances()); init_connections(); - add_schedule_task(schedule_time); + if (get_bp_list().size() != 0) + add_schedule_task(schedule_time); run_loop(); } @@ -524,6 +539,7 @@ class TestRunner { } void init_runner_data(int instances) { + nodetypes.resize(instances, node_type::BP); delay_matrix.resize(instances); for (int i = 0; i < instances; i++) { @@ -555,6 +571,7 @@ class TestRunner { } } + std::vector nodetypes; std::vector nodes; matrix_type delay_matrix; matrix_type dist_matrix; diff --git a/simulator/tests/randpa_finality_tests.cpp b/simulator/tests/randpa_finality_tests.cpp index 3bec1a99a00..4ef6268d375 100644 --- a/simulator/tests/randpa_finality_tests.cpp +++ b/simulator/tests/randpa_finality_tests.cpp @@ -14,6 +14,163 @@ using namespace std; using std::string; +TEST(randpa_finality, two_full_nodes) { + auto runner = TestRunner(2); + vector nodetypes {node_type::FN, node_type::FN}; + runner.load_nodetypes(nodetypes); + vector > v0{{1, 10}}; + graph_type g; + g.push_back(v0); + runner.load_graph(g); + runner.add_stop_task(2 * runner.get_slot_ms()); + runner.run(); + EXPECT_EQ(get_block_height(runner.get_db(0).last_irreversible_block_id()), 0); + EXPECT_EQ(get_block_height(runner.get_db(1).last_irreversible_block_id()), 0); +} + +TEST(randpa_finality, fullnodes_over_fullnodes) { + auto runner = TestRunner(9); + vector nodetypes {node_type::FN, node_type::FN, node_type::BP, node_type::BP, node_type::BP, node_type::FN, node_type::FN, node_type::FN, node_type::FN}; + runner.load_nodetypes(nodetypes); + graph_type g; + g.push_back({{1, 10}}); + g.push_back({{2, 10}}); + g.push_back({{3, 20}, {4, 20}}); + g.push_back({{4, 20}, {5, 30}}); + g.push_back({{7, 10}}); + g.push_back({{6, 30}}); + g.push_back({{}}); + g.push_back({{8, 10}}); + g.push_back({{}}); + runner.load_graph(g); + runner.add_stop_task(8 * runner.get_slot_ms()); + runner.run(); + for (auto i = 0; i<6; ++i) { + EXPECT_EQ(get_block_height(runner.get_db(i).last_irreversible_block_id()), 7); + } + EXPECT_EQ(get_block_height(runner.get_db(7).last_irreversible_block_id()), 7); +} + +TEST(randpa_finality, fullnodes_over_five_fullnodes) { + size_t nodes_amount = 18; + auto runner = TestRunner(nodes_amount); + + vector nodetypes(18, node_type::FN); + nodetypes[5] = node_type::BP; + nodetypes[6] = node_type::BP; + nodetypes[7] = node_type::BP; + runner.load_nodetypes(nodetypes); + + graph_type g; + g.push_back({{1, 10}}); + g.push_back({{2, 20}}); + g.push_back({{3, 10}}); + g.push_back({{4, 30}}); + g.push_back({{5, 10}}); + g.push_back({{6, 15}, {7, 20}}); + g.push_back({{7, 30}, {8, 20}}); + g.push_back({{13, 30}}); + g.push_back({{9, 10}}); + g.push_back({{10, 10}}); + g.push_back({{11, 10}}); + g.push_back({{12, 10}}); + g.push_back({{}}); + g.push_back({{14, 10}}); + g.push_back({{15, 10}}); + g.push_back({{16, 10}}); + g.push_back({{17, 10}}); + g.push_back({{}}); + + runner.load_graph(g); + runner.add_stop_task(14 * runner.get_slot_ms()); + runner.run(); + for (auto i = 0; i<17; ++i) { + if (i != 12) { + EXPECT_EQ(get_block_height(runner.get_db(i).last_irreversible_block_id()), 13); + } + } +} + +TEST(randpa_finality, fullnodes_over_round_ring) { + size_t nodes_amount = 64; + auto runner = TestRunner(nodes_amount); + vector nodetypes(nodes_amount, node_type::FN); + nodetypes[3] = node_type::BP; + for (auto i = 4; i > empty_vector; + g.push_back({{1, 10}}); + g.push_back({{2, 20}}); + g.push_back({{3, 10}}); + g.push_back({{4, 30}}); + for (auto i = 4; i < nodes_amount-3; i += 3) { + g.push_back({{ i+1, random() }, { i+3, random() }}); + g.push_back({{ i+2, random() }}); + g.push_back(empty_vector); + } + g.push_back({{62, 30}}); + g.push_back({{63, 30}}); + g.push_back(empty_vector); + + runner.load_graph(g); + runner.add_stop_task(24 * runner.get_slot_ms()); + runner.run(); + for (auto i = 0; i nodetypes(nodes_amount, node_type::FN); + nodetypes[3] = node_type::BP; + for (auto i = 4; i > empty_vector; + g.push_back({{1, 10}}); + g.push_back({{2, 20}}); + g.push_back({{3, 10}}); + g.push_back({{4, 30}}); + for (auto i = 4; i < nodes_amount-3; i += 3) { + vector> pairs{{3, random()}, {i+1, random()}}; + for (auto j = i+3; j < nodes_amount; j +=3) { + pairs.push_back({j, random()}); + } + g.push_back(pairs); + g.push_back({{ i+2, random() }}); + g.push_back(empty_vector); + } + g.push_back({{62, 30}}); + g.push_back({{63, 30}}); + g.push_back(empty_vector); + + runner.load_graph(g); + runner.add_stop_task(24 * runner.get_slot_ms()); + runner.run(); + for (auto i = 0; i > v0{{1, 2}, {2, 10}}; diff --git a/tests/testUtils.py b/tests/testUtils.py index f91a6d74cca..a248b79d12d 100755 --- a/tests/testUtils.py +++ b/tests/testUtils.py @@ -20,7 +20,7 @@ class Utils: FNull = open(os.devnull, 'w') EosClientPath="programs/daobet-cli/daobet-cli" - MiscEosClientArgs="--no-auto-keosd" + MiscEosClientArgs="--no-auto-daobet-wallet" EosWalletName="daobet-wallet" EosWalletPath="programs/daobet-wallet/"+ EosWalletName