mirror of
https://github.com/mimblewimble/grin.git
synced 2025-02-01 17:01:09 +03:00
Update Stratum Server to use rust Result for returning errors (#1178)
This commit is contained in:
parent
0e969849c4
commit
179ad5983f
1 changed files with 41 additions and 40 deletions
|
@ -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
|
||||||
|
|
Loading…
Reference in a new issue