Update Stratum Server to use rust Result for returning errors (#1178)

This commit is contained in:
Blade Doyle 2018-06-20 02:34:39 -07:00 committed by Yeastplume
parent 0e969849c4
commit 179ad5983f

View file

@ -306,11 +306,9 @@ impl StratumServer {
stratum_stats.worker_stats[worker_stats_id].last_seen = SystemTime::now(); stratum_stats.worker_stats[worker_stats_id].last_seen = SystemTime::now();
// Call the handler function for requested method // Call the handler function for requested method
let (response, err) = match request.method.as_str() { let response = match request.method.as_str() {
"login" => { "login" => {
let (response, err) = self.handle_login(request.params, &mut workers_l[num])
self.handle_login(request.params, &mut workers_l[num]);
(response, err)
} }
"submit" => { "submit" => {
let res = self.handle_submit( let res = self.handle_submit(
@ -329,7 +327,7 @@ impl StratumServer {
code: -32701, code: -32701,
message: "Node is syncing - Please wait".to_string(), message: "Node is syncing - Please wait".to_string(),
}; };
(serde_json::to_value(e).unwrap(), true) Err(serde_json::to_value(e).unwrap())
} else { } else {
let b = self.current_block.header.clone(); let b = self.current_block.header.clone();
self.handle_getjobtemplate(b) self.handle_getjobtemplate(b)
@ -344,13 +342,14 @@ impl StratumServer {
code: -32601, code: -32601,
message: "Method not found".to_string(), message: "Method not found".to_string(),
}; };
(serde_json::to_value(e).unwrap(), true) Err(serde_json::to_value(e).unwrap())
} }
}; };
// Package the reply as RpcResponse json // Package the reply as RpcResponse json
let rpc_response: String; let rpc_response: String;
if err == true { match response {
Err(response) => {
let resp = RpcResponse { let resp = RpcResponse {
id: request.id, id: request.id,
jsonrpc: String::from("2.0"), jsonrpc: String::from("2.0"),
@ -359,7 +358,8 @@ impl StratumServer {
error: Some(response), error: Some(response),
}; };
rpc_response = serde_json::to_string(&resp).unwrap(); rpc_response = serde_json::to_string(&resp).unwrap();
} else { }
Ok(response) => {
let resp = RpcResponse { let resp = RpcResponse {
id: request.id, id: request.id,
jsonrpc: String::from("2.0"), jsonrpc: String::from("2.0"),
@ -369,6 +369,7 @@ impl StratumServer {
}; };
rpc_response = serde_json::to_string(&resp).unwrap(); rpc_response = serde_json::to_string(&resp).unwrap();
} }
}
// Send the reply // Send the reply
workers_l[num].write_message(rpc_response); workers_l[num].write_message(rpc_response);
@ -379,7 +380,7 @@ impl StratumServer {
} }
// Handle STATUS message // Handle STATUS message
fn handle_status(&self, worker_stats: &WorkerStats) -> (Value, bool) { fn handle_status(&self, worker_stats: &WorkerStats) -> Result<Value, Value> {
// Return worker status in json for use by a dashboard or healthcheck. // Return worker status in json for use by a dashboard or healthcheck.
let status = WorkerStatus { let status = WorkerStatus {
id: worker_stats.id.clone(), id: worker_stats.id.clone(),
@ -390,24 +391,24 @@ impl StratumServer {
stale: worker_stats.num_stale, stale: worker_stats.num_stale,
}; };
let response = serde_json::to_value(&status).unwrap(); let response = serde_json::to_value(&status).unwrap();
return (response, false); return Ok(response);
} }
// Handle GETJOBTEMPLATE message // Handle GETJOBTEMPLATE message
fn handle_getjobtemplate(&self, bh: BlockHeader) -> (Value, bool) { fn handle_getjobtemplate(&self, bh: BlockHeader) -> Result<Value, Value> {
// Build a JobTemplate from a BlockHeader and return JSON // Build a JobTemplate from a BlockHeader and return JSON
let job_template = self.build_block_template(bh); let job_template = self.build_block_template(bh);
let response = serde_json::to_value(&job_template).unwrap(); let response = serde_json::to_value(&job_template).unwrap();
return (response, false); return Ok(response);
} }
// Handle KEEPALIVE message // Handle KEEPALIVE message
fn handle_keepalive(&self) -> (Value, bool) { fn handle_keepalive(&self) -> Result<Value, Value> {
return (serde_json::to_value("ok".to_string()).unwrap(), false); return Ok(serde_json::to_value("ok".to_string()).unwrap());
} }
// Handle LOGIN message // Handle LOGIN message
fn handle_login(&self, params: Option<Value>, worker: &mut Worker) -> (Value, bool) { fn handle_login(&self, params: Option<Value>, worker: &mut Worker) -> Result<Value, Value> {
let params: LoginParams = match params { let params: LoginParams = match params {
Some(val) => serde_json::from_value(val).unwrap(), Some(val) => serde_json::from_value(val).unwrap(),
None => { None => {
@ -415,14 +416,14 @@ impl StratumServer {
code: -32600, code: -32600,
message: "Invalid Request".to_string(), message: "Invalid Request".to_string(),
}; };
return (serde_json::to_value(e).unwrap(), true); return Err(serde_json::to_value(e).unwrap());
} }
}; };
worker.login = Some(params.login); worker.login = Some(params.login);
// XXX TODO Future - Validate password? // XXX TODO Future - Validate password?
worker.agent = params.agent; worker.agent = params.agent;
worker.authenticated = true; worker.authenticated = true;
return (serde_json::to_value("ok".to_string()).unwrap(), false); return Ok(serde_json::to_value("ok".to_string()).unwrap());
} }
// Handle SUBMIT message // Handle SUBMIT message
@ -435,7 +436,7 @@ impl StratumServer {
params: Option<Value>, params: Option<Value>,
worker: &mut Worker, worker: &mut Worker,
worker_stats: &mut WorkerStats, worker_stats: &mut WorkerStats,
) -> (Value, bool) { ) -> Result<Value, Value> {
// Validate parameters // Validate parameters
let params: SubmitParams = match params { let params: SubmitParams = match params {
Some(val) => serde_json::from_value(val).unwrap(), Some(val) => serde_json::from_value(val).unwrap(),
@ -444,7 +445,7 @@ impl StratumServer {
code: -32600, code: -32600,
message: "Invalid Request".to_string(), message: "Invalid Request".to_string(),
}; };
return (serde_json::to_value(e).unwrap(), true); return Err(serde_json::to_value(e).unwrap());
} }
}; };
@ -472,7 +473,7 @@ impl StratumServer {
code: -32501, code: -32501,
message: "Share rejected due to low difficulty".to_string(), message: "Share rejected due to low difficulty".to_string(),
}; };
return (serde_json::to_value(e).unwrap(), true); return Err(serde_json::to_value(e).unwrap());
} }
// If the difficulty is high enough, submit it (which also validates it) // If the difficulty is high enough, submit it (which also validates it)
if share_difficulty >= self.current_difficulty { if share_difficulty >= self.current_difficulty {
@ -491,7 +492,7 @@ impl StratumServer {
code: -32502, code: -32502,
message: "Failed to validate solution".to_string(), message: "Failed to validate solution".to_string(),
}; };
return (serde_json::to_value(e).unwrap(), true); return Err(serde_json::to_value(e).unwrap());
} }
// Success case falls through to be logged // Success case falls through to be logged
} else { } else {
@ -511,7 +512,7 @@ impl StratumServer {
code: -32502, code: -32502,
message: "Failed to validate solution".to_string(), message: "Failed to validate solution".to_string(),
}; };
return (serde_json::to_value(e).unwrap(), true); return Err(serde_json::to_value(e).unwrap());
} }
} }
} else { } else {
@ -525,7 +526,7 @@ impl StratumServer {
code: -32503, code: -32503,
message: "Solution submitted too late".to_string(), message: "Solution submitted too late".to_string(),
}; };
return (serde_json::to_value(e).unwrap(), true); return Err(serde_json::to_value(e).unwrap());
} }
// Log this as a valid share // Log this as a valid share
let submitted_by = match worker.login.clone() { let submitted_by = match worker.login.clone() {
@ -544,7 +545,7 @@ impl StratumServer {
submitted_by, submitted_by,
); );
worker_stats.num_accepted += 1; worker_stats.num_accepted += 1;
return (serde_json::to_value("ok".to_string()).unwrap(), false); return Ok(serde_json::to_value("ok".to_string()).unwrap());
} // handle submit a solution } // handle submit a solution
// Purge dead/sick workers - remove all workers marked in error state // Purge dead/sick workers - remove all workers marked in error state