@ -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