Enhance login and submit logging (#1055)

* Enhance login handler to support parameters.  Also report worker login string when reporting found blocks

* report worker id if no login
This commit is contained in:
Blade Doyle 2018-05-09 02:10:47 -07:00 committed by Yeastplume
parent dd861c8d8c
commit 982fdea636

View file

@ -149,6 +149,7 @@ fn accept_workers(
pub struct Worker { pub struct Worker {
id: String, id: String,
login: Option<String>,
stream: BufStream<TcpStream>, stream: BufStream<TcpStream>,
error: bool, error: bool,
authenticated: bool, authenticated: bool,
@ -159,6 +160,7 @@ impl Worker {
pub fn new(id: String, stream: BufStream<TcpStream>) -> Worker { pub fn new(id: String, stream: BufStream<TcpStream>) -> Worker {
Worker { Worker {
id: id, id: id,
login: None,
stream: stream, stream: stream,
error: false, error: false,
authenticated: false, authenticated: false,
@ -299,15 +301,12 @@ impl StratumServer {
// Call the handler function for requested method // Call the handler function for requested method
let (response, err) = match request.method.as_str() { let (response, err) = match request.method.as_str() {
"login" => { "login" => {
let (response, err) = self.handle_login(request.params); let (response, err) = self.handle_login(request.params, &mut workers_l[num]);
// XXX TODO Future? - Validate username and password
if err == false {
workers_l[num].authenticated = true;
}
(response, err) (response, err)
} }
"submit" => self.handle_submit( "submit" => self.handle_submit(
request.params, request.params,
&mut workers_l[num],
&mut stratum_stats.worker_stats[worker_stats_id], &mut stratum_stats.worker_stats[worker_stats_id],
), ),
"keepalive" => self.handle_keepalive(), "keepalive" => self.handle_keepalive(),
@ -392,19 +391,22 @@ impl StratumServer {
} }
// Handle LOGIN message // Handle LOGIN message
fn handle_login(&self, params: Option<String>) -> (String, bool) { fn handle_login(&self, params: Option<String>, worker: &mut Worker) -> (String, bool) {
// Extract the params string into a LoginParams struct // Extract the params string into a LoginParams struct
let params_str = match params { let params_str = match params {
Some(val) => val, Some(val) => val,
None => String::from("{}"), None => String::from("{}"),
}; };
let _login_params: LoginParams = match serde_json::from_str(&params_str) { let login_params: LoginParams = match serde_json::from_str(&params_str) {
Ok(val) => val, Ok(val) => val,
Err(_e) => { Err(_e) => {
let r = r#"{"code": -32600, "message": "Invalid Request"}"#; let r = r#"{"code": -32600, "message": "Invalid Request"}"#;
return (String::from(r), true); return (String::from(r), true);
} }
}; };
worker.login = Some(login_params.login);
// XXX TODO Future? - Validate login and password
worker.authenticated = true;
return (String::from("ok"), false); return (String::from("ok"), false);
} }
@ -414,6 +416,7 @@ impl StratumServer {
fn handle_submit( fn handle_submit(
&self, &self,
params: Option<String>, params: Option<String>,
worker: &mut Worker,
worker_stats: &mut WorkerStats, worker_stats: &mut WorkerStats,
) -> (String, bool) { ) -> (String, bool) {
// Extract the params string into a SubmitParams struct // Extract the params string into a SubmitParams struct
@ -436,13 +439,6 @@ impl StratumServer {
b.header.nonce = submit_params.nonce; b.header.nonce = submit_params.nonce;
b.header.pow.proof_size = submit_params.pow.len(); b.header.pow.proof_size = submit_params.pow.len();
b.header.pow.nonces = submit_params.pow; b.header.pow.nonces = submit_params.pow;
info!(
LOGGER,
"(Server ID: {}) Found proof of work, adding block {}",
self.id,
b.hash()
);
// Submit the block to grin server (known here as "self.miner")
let res = self.chain.process_block(b.clone(), chain::Options::MINE); let res = self.chain.process_block(b.clone(), chain::Options::MINE);
if let Err(e) = res { if let Err(e) = res {
error!( error!(
@ -466,6 +462,19 @@ impl StratumServer {
let err = e.to_string(); let err = e.to_string();
return (err, true); return (err, true);
} }
let submitted_by = match worker.login.clone() {
None => worker.id.to_string(),
Some(login) => login.clone()
};
info!(
LOGGER,
"(Server ID: {}) Found POW for block with hash {} at height {} using nonce {} submitted by worker {}",
self.id,
b.hash(),
b.header.height,
b.header.nonce,
submitted_by,
);
worker_stats.num_accepted += 1; worker_stats.num_accepted += 1;
return (String::from("ok"), false); return (String::from("ok"), false);
} // handle submit a solution } // handle submit a solution