Skip to content
Permalink
Browse files

wallet_rpc_server: new estimate_tx_size_and_weight RPC

  • Loading branch information...
moneromooo-monero committed Nov 6, 2019
1 parent a48ef0a commit 8694ba587b0ed1f21b23301f46da3ddb184f1fdf
std::copy(res.gray.begin(), res.gray.end(), std::back_inserter(nodes));
return nodes;
}
//----------------------------------------------------------------------------------------------------
std::pair<size_t, uint64_t> wallet2::estimate_tx_size_and_weight(bool use_rct, int n_inputs, int ring_size, int n_outputs, size_t extra_size)
{
THROW_WALLET_EXCEPTION_IF(n_inputs <= 0, tools::error::wallet_internal_error, "Invalid n_inputs");
THROW_WALLET_EXCEPTION_IF(n_outputs < 0, tools::error::wallet_internal_error, "Invalid n_outputs");
THROW_WALLET_EXCEPTION_IF(ring_size < 0, tools::error::wallet_internal_error, "Invalid ring size");

if (ring_size == 0)
ring_size = get_min_ring_size();
if (n_outputs == 1)
n_outputs = 2; // extra dummy output

const bool bulletproof = use_fork_rules(get_bulletproof_fork(), 0);
const bool clsag = use_fork_rules(get_clsag_fork(), 0);
size_t size = estimate_tx_size(use_rct, n_inputs, ring_size - 1, n_outputs, extra_size, bulletproof, clsag);
uint64_t weight = estimate_tx_weight(use_rct, n_inputs, ring_size - 1, n_outputs, extra_size, bulletproof, clsag);
return std::make_pair(size, weight);
}
//----------------------------------------------------------------------------------------------------
}
@@ -1252,6 +1252,8 @@ namespace tools

bool is_unattended() const { return m_unattended; }

std::pair<size_t, uint64_t> estimate_tx_size_and_weight(bool use_rct, int n_inputs, int ring_size, int n_outputs, size_t extra_size);

bool get_rpc_payment_info(bool mining, bool &payment_required, uint64_t &credits, uint64_t &diff, uint64_t &credits_per_hash_found, cryptonote::blobdata &hashing_blob, uint64_t &height, uint64_t &seed_height, crypto::hash &seed_hash, crypto::hash &next_seed_hash, uint32_t &cookie);
bool daemon_requires_payment();
bool make_rpc_payment(uint32_t nonce, uint32_t cookie, uint64_t &credits, uint64_t &balance);
@@ -4291,6 +4291,25 @@ namespace tools
return true;
}
//------------------------------------------------------------------------------------------------------------------------------
bool wallet_rpc_server::on_estimate_tx_size_and_weight(const wallet_rpc::COMMAND_RPC_ESTIMATE_TX_SIZE_AND_WEIGHT::request& req, wallet_rpc::COMMAND_RPC_ESTIMATE_TX_SIZE_AND_WEIGHT::response& res, epee::json_rpc::error& er, const connection_context *ctx)
{
if (!m_wallet) return not_open(er);
try
{
size_t extra_size = 34 /* pubkey */ + 10 /* encrypted payment id */; // typical makeup
const std::pair<size_t, uint64_t> sw = m_wallet->estimate_tx_size_and_weight(req.rct, req.n_inputs, req.ring_size, req.n_outputs, extra_size);
res.size = sw.first;
res.weight = sw.second;
}
catch (const std::exception &e)
{
er.code = WALLET_RPC_ERROR_CODE_UNKNOWN_ERROR;
er.message = "Failed to determine size and weight";
return false;
}
return true;
}
//------------------------------------------------------------------------------------------------------------------------------
bool wallet_rpc_server::on_get_version(const wallet_rpc::COMMAND_RPC_GET_VERSION::request& req, wallet_rpc::COMMAND_RPC_GET_VERSION::response& res, epee::json_rpc::error& er, const connection_context *ctx)
{
res.version = WALLET_RPC_VERSION;
@@ -154,6 +154,7 @@ namespace tools
MAP_JON_RPC_WE("set_daemon", on_set_daemon, wallet_rpc::COMMAND_RPC_SET_DAEMON)
MAP_JON_RPC_WE("set_log_level", on_set_log_level, wallet_rpc::COMMAND_RPC_SET_LOG_LEVEL)
MAP_JON_RPC_WE("set_log_categories", on_set_log_categories, wallet_rpc::COMMAND_RPC_SET_LOG_CATEGORIES)
MAP_JON_RPC_WE("estimate_tx_size_and_weight", on_estimate_tx_size_and_weight, wallet_rpc::COMMAND_RPC_ESTIMATE_TX_SIZE_AND_WEIGHT)
MAP_JON_RPC_WE("get_version", on_get_version, wallet_rpc::COMMAND_RPC_GET_VERSION)
END_JSON_RPC_MAP()
END_URI_MAP2()
@@ -240,6 +241,7 @@ namespace tools
bool on_set_daemon(const wallet_rpc::COMMAND_RPC_SET_DAEMON::request& req, wallet_rpc::COMMAND_RPC_SET_DAEMON::response& res, epee::json_rpc::error& er, const connection_context *ctx = NULL);
bool on_set_log_level(const wallet_rpc::COMMAND_RPC_SET_LOG_LEVEL::request& req, wallet_rpc::COMMAND_RPC_SET_LOG_LEVEL::response& res, epee::json_rpc::error& er, const connection_context *ctx = NULL);
bool on_set_log_categories(const wallet_rpc::COMMAND_RPC_SET_LOG_CATEGORIES::request& req, wallet_rpc::COMMAND_RPC_SET_LOG_CATEGORIES::response& res, epee::json_rpc::error& er, const connection_context *ctx = NULL);
bool on_estimate_tx_size_and_weight(const wallet_rpc::COMMAND_RPC_ESTIMATE_TX_SIZE_AND_WEIGHT::request& req, wallet_rpc::COMMAND_RPC_ESTIMATE_TX_SIZE_AND_WEIGHT::response& res, epee::json_rpc::error& er, const connection_context *ctx = NULL);
bool on_get_version(const wallet_rpc::COMMAND_RPC_GET_VERSION::request& req, wallet_rpc::COMMAND_RPC_GET_VERSION::response& res, epee::json_rpc::error& er, const connection_context *ctx = NULL);

//json rpc v2
@@ -2580,5 +2580,36 @@ namespace wallet_rpc
typedef epee::misc_utils::struct_init<response_t> response;
};

struct COMMAND_RPC_ESTIMATE_TX_SIZE_AND_WEIGHT
{
struct request_t
{
uint32_t n_inputs;
uint32_t n_outputs;
uint32_t ring_size;
bool rct;

BEGIN_KV_SERIALIZE_MAP()
KV_SERIALIZE(n_inputs)
KV_SERIALIZE(n_outputs)
KV_SERIALIZE_OPT(ring_size, 0u)
KV_SERIALIZE_OPT(rct, true)
END_KV_SERIALIZE_MAP()
};
typedef epee::misc_utils::struct_init<request_t> request;

struct response_t
{
uint64_t size;
uint64_t weight;

BEGIN_KV_SERIALIZE_MAP()
KV_SERIALIZE(size)
KV_SERIALIZE(weight)
END_KV_SERIALIZE_MAP()
};
typedef epee::misc_utils::struct_init<response_t> response;
};

}
}
@@ -1062,6 +1062,20 @@ def stop_mining(self):
}
return self.rpc.send_json_rpc_request(stop_mining)

def estimate_tx_size_and_weight(self, n_inputs, n_outputs, ring_size = 0, rct = True):
estimate_tx_size_and_weight = {
'method': 'estimate_tx_size_and_weight',
'jsonrpc': '2.0',
'params': {
'n_inputs': n_inputs,
'n_outputs': n_outputs,
'ring_size': ring_size,
'rct': rct,
},
'id': '0'
}
return self.rpc.send_json_rpc_request(estimate_tx_size_and_weight)

def get_version(self):
get_version = {
'method': 'get_version',

0 comments on commit 8694ba5

Please sign in to comment.
You can’t perform that action at this time.