diff options
Diffstat (limited to 'src/rpc')
-rw-r--r-- | src/rpc/core_rpc_server.cpp | 26 | ||||
-rw-r--r-- | src/rpc/core_rpc_server_commands_defs.h | 2 | ||||
-rw-r--r-- | src/rpc/rpc_handler.cpp | 4 | ||||
-rw-r--r-- | src/rpc/zmq_server.cpp | 2 |
4 files changed, 31 insertions, 3 deletions
diff --git a/src/rpc/core_rpc_server.cpp b/src/rpc/core_rpc_server.cpp index daec8cd58..73138686d 100644 --- a/src/rpc/core_rpc_server.cpp +++ b/src/rpc/core_rpc_server.cpp @@ -1333,6 +1333,20 @@ namespace cryptonote return false; } + if(req.reserve_size && !req.extra_nonce.empty()) + { + error_resp.code = CORE_RPC_ERROR_CODE_WRONG_PARAM; + error_resp.message = "Cannot specify both a reserve_size and an extra_nonce"; + return false; + } + + if(req.extra_nonce.size() > 510) + { + error_resp.code = CORE_RPC_ERROR_CODE_TOO_BIG_RESERVE_SIZE; + error_resp.message = "Too big extra_nonce size, maximum 510 hex chars"; + return false; + } + cryptonote::address_parse_info info; if(!req.wallet_address.size() || !cryptonote::get_account_address_from_str(info, nettype(), req.wallet_address)) @@ -1350,7 +1364,17 @@ namespace cryptonote block b; cryptonote::blobdata blob_reserve; - blob_reserve.resize(req.reserve_size, 0); + if(!req.extra_nonce.empty()) + { + if(!string_tools::parse_hexstr_to_binbuff(req.extra_nonce, blob_reserve)) + { + error_resp.code = CORE_RPC_ERROR_CODE_WRONG_PARAM; + error_resp.message = "Parameter extra_nonce should be a hex string"; + return false; + } + } + else + blob_reserve.resize(req.reserve_size, 0); cryptonote::difficulty_type wdiff; crypto::hash prev_block; if (!req.prev_block.empty()) diff --git a/src/rpc/core_rpc_server_commands_defs.h b/src/rpc/core_rpc_server_commands_defs.h index 027fcbafb..aed967efb 100644 --- a/src/rpc/core_rpc_server_commands_defs.h +++ b/src/rpc/core_rpc_server_commands_defs.h @@ -924,11 +924,13 @@ namespace cryptonote uint64_t reserve_size; //max 255 bytes std::string wallet_address; std::string prev_block; + std::string extra_nonce; BEGIN_KV_SERIALIZE_MAP() KV_SERIALIZE(reserve_size) KV_SERIALIZE(wallet_address) KV_SERIALIZE(prev_block) + KV_SERIALIZE(extra_nonce) END_KV_SERIALIZE_MAP() }; typedef epee::misc_utils::struct_init<request_t> request; diff --git a/src/rpc/rpc_handler.cpp b/src/rpc/rpc_handler.cpp index af5cb98a3..d528ffef3 100644 --- a/src/rpc/rpc_handler.cpp +++ b/src/rpc/rpc_handler.cpp @@ -63,7 +63,9 @@ namespace rpc d.cached_to -= 10; d.cached_top_hash = hash10; d.cached_m10_hash = crypto::null_hash; - d.cached_distribution.resize(d.cached_distribution.size() - 10); + CHECK_AND_ASSERT_MES(d.cached_distribution.size() >= 10, boost::none, "Cached distribution size does not match cached bounds"); + for (int p = 0; p < 10; ++p) + d.cached_distribution.pop_back(); can_extend = true; } } diff --git a/src/rpc/zmq_server.cpp b/src/rpc/zmq_server.cpp index ae748e052..668a2e5cd 100644 --- a/src/rpc/zmq_server.cpp +++ b/src/rpc/zmq_server.cpp @@ -59,7 +59,7 @@ void ZmqServer::serve() { throw std::runtime_error("ZMQ RPC server reply socket is null"); } - while (rep_socket->recv(&message)) + while (rep_socket->recv(&message, 0)) { std::string message_string(reinterpret_cast<const char *>(message.data()), message.size()); |