|
|
|
@ -153,6 +153,7 @@ namespace cryptonote
|
|
|
|
|
command_line::add_arg(desc, arg_rpc_payment_address);
|
|
|
|
|
command_line::add_arg(desc, arg_rpc_payment_difficulty);
|
|
|
|
|
command_line::add_arg(desc, arg_rpc_payment_credits);
|
|
|
|
|
command_line::add_arg(desc, arg_rpc_payment_allow_free_loopback);
|
|
|
|
|
}
|
|
|
|
|
//------------------------------------------------------------------------------------------------------------------------------
|
|
|
|
|
core_rpc_server::core_rpc_server(
|
|
|
|
@ -163,6 +164,7 @@ namespace cryptonote
|
|
|
|
|
, m_p2p(p2p)
|
|
|
|
|
, m_was_bootstrap_ever_used(false)
|
|
|
|
|
, disable_rpc_ban(false)
|
|
|
|
|
, m_rpc_payment_allow_free_loopback(false)
|
|
|
|
|
{}
|
|
|
|
|
//------------------------------------------------------------------------------------------------------------------------------
|
|
|
|
|
bool core_rpc_server::set_bootstrap_daemon(const std::string &address, const std::string &username_password)
|
|
|
|
@ -280,6 +282,7 @@ namespace cryptonote
|
|
|
|
|
MERROR("Payments difficulty and/or payments credits are 0, but a payment address was given");
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
m_rpc_payment_allow_free_loopback = command_line::get_arg(vm, arg_rpc_payment_allow_free_loopback);
|
|
|
|
|
m_rpc_payment.reset(new rpc_payment(info.address, diff, credits));
|
|
|
|
|
m_rpc_payment->load(command_line::get_arg(vm, cryptonote::arg_data_dir));
|
|
|
|
|
m_p2p.set_rpc_credits_per_hash(RPC_CREDITS_PER_HASH_SCALE * (credits / (float)diff));
|
|
|
|
@ -353,7 +356,7 @@ namespace cryptonote
|
|
|
|
|
#define CHECK_PAYMENT_BASE(req, res, payment, same_ts) do { if (!ctx) break; uint64_t P = (uint64_t)payment; if (P > 0 && !check_payment(req.client, P, tracker.rpc_name(), same_ts, res.status, res.credits, res.top_hash)){return true;} tracker.pay(P); } while(0)
|
|
|
|
|
#define CHECK_PAYMENT(req, res, payment) CHECK_PAYMENT_BASE(req, res, payment, false)
|
|
|
|
|
#define CHECK_PAYMENT_SAME_TS(req, res, payment) CHECK_PAYMENT_BASE(req, res, payment, true)
|
|
|
|
|
#define CHECK_PAYMENT_MIN1(req, res, payment, same_ts) do { if (!ctx) break; uint64_t P = (uint64_t)payment; if (P == 0) P = 1; if(!check_payment(req.client, P, tracker.rpc_name(), same_ts, res.status, res.credits, res.top_hash)){return true;} tracker.pay(P); } while(0)
|
|
|
|
|
#define CHECK_PAYMENT_MIN1(req, res, payment, same_ts) do { if (!ctx || (m_rpc_payment_allow_free_loopback && ctx->m_remote_address.is_loopback())) break; uint64_t P = (uint64_t)payment; if (P == 0) P = 1; if(!check_payment(req.client, P, tracker.rpc_name(), same_ts, res.status, res.credits, res.top_hash)){return true;} tracker.pay(P); } while(0)
|
|
|
|
|
//------------------------------------------------------------------------------------------------------------------------------
|
|
|
|
|
bool core_rpc_server::check_core_ready()
|
|
|
|
|
{
|
|
|
|
@ -3255,4 +3258,10 @@ namespace cryptonote
|
|
|
|
|
, "Restrict RPC to clients sending micropayment, yields that many credits per payment"
|
|
|
|
|
, DEFAULT_PAYMENT_CREDITS_PER_HASH
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const command_line::arg_descriptor<bool> core_rpc_server::arg_rpc_payment_allow_free_loopback = {
|
|
|
|
|
"rpc-payment-allow-free-loopback"
|
|
|
|
|
, "Allow free access from the loopback address (ie, the local host)"
|
|
|
|
|
, false
|
|
|
|
|
};
|
|
|
|
|
} // namespace cryptonote
|
|
|
|
|