-
Notifications
You must be signed in to change notification settings - Fork 102
/
Copy pathutils.rs
127 lines (120 loc) · 4.2 KB
/
utils.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
use crate::{
interfaces::HostResult,
server::api::{v2, v3},
};
use raiko_core::{interfaces::RaikoError, provider::get_task_data};
use raiko_lib::proof_type::ProofType;
use raiko_reqactor::Actor;
use raiko_reqpool::Status;
use raiko_tasks::TaskStatus;
use serde_json::Value;
pub fn to_v2_status(
proof_type: ProofType,
batch_id: Option<u64>,
result: Result<Status, String>,
) -> v2::Status {
match result {
Ok(status) => v2::Status::Ok {
proof_type,
batch_id,
data: {
match status {
Status::Registered => v2::ProofResponse::Status {
status: TaskStatus::Registered,
},
Status::WorkInProgress => v2::ProofResponse::Status {
status: TaskStatus::WorkInProgress,
},
Status::Cancelled => v2::ProofResponse::Status {
status: TaskStatus::Cancelled,
},
Status::Failed { error } => v2::ProofResponse::Status {
status: TaskStatus::AnyhowError(error),
},
Status::Success { proof } => v2::ProofResponse::Proof { proof },
}
},
},
Err(e) => v2::Status::Error {
error: "task_failed".to_string(),
message: e,
},
}
}
pub fn to_v2_cancel_status(result: Result<Status, String>) -> v2::CancelStatus {
match result {
Ok(status) => match status {
Status::Success { .. } | Status::Cancelled | Status::Failed { .. } => {
v2::CancelStatus::Ok
}
_ => v2::CancelStatus::Error {
error: "cancel_failed".to_string(),
message: format!("cancallation response unexpected status {}", status),
},
},
Err(e) => v2::CancelStatus::Error {
error: "cancel_failed".to_string(),
message: e,
},
}
}
// TODO: remove the staled interface
pub fn to_v3_status(
proof_type: ProofType,
batch_id: Option<u64>,
result: Result<Status, String>,
) -> v3::Status {
to_v2_status(proof_type, batch_id, result)
}
pub fn to_v3_cancel_status(result: Result<Status, String>) -> v3::CancelStatus {
to_v2_cancel_status(result)
}
// A zk_any request looks like: { "proof_type": "zk_any", "zk_any": { "aggregation": <bool> } }
pub fn is_zk_any_request(proof_request_opt: &Value) -> bool {
let proof_type = proof_request_opt["proof_type"].as_str();
return proof_type == Some("zk_any");
}
pub async fn draw_for_zk_any_request(
actor: &Actor,
proof_request_opt: &Value,
) -> HostResult<Option<ProofType>> {
let network = proof_request_opt["network"]
.as_str()
.ok_or(RaikoError::InvalidRequestConfig(
"Missing network".to_string(),
))?;
let block_number =
proof_request_opt["block_number"]
.as_u64()
.ok_or(RaikoError::InvalidRequestConfig(
"Missing block number".to_string(),
))?;
let (_, blockhash) = get_task_data(&network, block_number, actor.chain_specs()).await?;
Ok(actor.draw(&blockhash))
}
pub async fn draw_for_zk_any_batch_request(
actor: &Actor,
batch_proof_request_opt: &Value,
) -> HostResult<Option<ProofType>> {
let l1_network =
batch_proof_request_opt["l1_network"]
.as_str()
.ok_or(RaikoError::InvalidRequestConfig(
"Missing network".to_string(),
))?;
let batches =
batch_proof_request_opt["batches"]
.as_array()
.ok_or(RaikoError::InvalidRequestConfig(
"Missing batches".to_string(),
))?;
let first_batch = batches.first().ok_or(RaikoError::InvalidRequestConfig(
"batches is empty".to_string(),
))?;
let l1_inclusion_block_number = first_batch["l1_inclusion_block_number"].as_u64().ok_or(
RaikoError::InvalidRequestConfig("Missing l1_inclusion_block_number".to_string()),
)?;
let (_, blockhash) =
get_task_data(&l1_network, l1_inclusion_block_number, actor.chain_specs()).await?;
Ok(actor.draw(&blockhash))
}