Skip to content

Commit 55f4fbe

Browse files
Shourya742GitGab19
authored andcommitted
port translator to new handlers API
1 parent 130371c commit 55f4fbe

File tree

6 files changed

+73
-60
lines changed

6 files changed

+73
-60
lines changed

roles/translator/src/lib/error.rs

Lines changed: 14 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ use std::{fmt, sync::PoisonError};
1313
use stratum_common::roles_logic_sv2::{
1414
codec_sv2::{self, binary_sv2, framing_sv2},
1515
errors::Error as RolesLogicError,
16-
handlers_sv2::HandlerError,
16+
handlers_sv2::HandlerErrorType,
1717
parsers_sv2::ParserError as RolesParserError,
1818
Error as RolesSv2Error,
1919
};
@@ -30,8 +30,6 @@ pub enum TproxyError {
3030
RolesSv2LogicError(RolesSv2Error),
3131
/// Error from roles logic parser library
3232
ParserError(RolesParserError),
33-
/// Error from roles logic handlers Library
34-
RolesSv2LogicHandlerError(HandlerError),
3533
/// Errors on bad CLI argument input.
3634
BadCliArgs,
3735
/// Errors on bad `serde_json` serialize/deserialize.
@@ -63,7 +61,7 @@ pub enum TproxyError {
6361
/// Error converting SetDifficulty to Message
6462
SetDifficultyToMessage(SetDifficulty),
6563
/// Received an unexpected message type
66-
UnexpectedMessage,
64+
UnexpectedMessage(u8),
6765
/// Job not found during share validation
6866
JobNotFound,
6967
/// Invalid merkle root during share validation
@@ -104,8 +102,11 @@ impl fmt::Display for TproxyError {
104102
SetDifficultyToMessage(ref e) => {
105103
write!(f, "Error converting SetDifficulty to Message: `{e:?}`")
106104
}
107-
UnexpectedMessage => {
108-
write!(f, "Received a message type that was not expected")
105+
UnexpectedMessage(message_type) => {
106+
write!(
107+
f,
108+
"Received a message type that was not expected: {message_type}"
109+
)
109110
}
110111
JobNotFound => write!(f, "Job not found during share validation"),
111112
InvalidMerkleRoot => write!(f, "Invalid merkle root during share validation"),
@@ -118,7 +119,6 @@ impl fmt::Display for TproxyError {
118119
NetworkHelpersError(ref e) => write!(f, "Network helpers error: {e:?}"),
119120
RolesSv2LogicError(ref e) => write!(f, "Roles logic error: {e:?}"),
120121
ParserError(ref e) => write!(f, "Roles logic parser error: {e:?}"),
121-
RolesSv2LogicHandlerError(ref e) => write!(f, "Roles logic handler error: {e:?}"),
122122
}
123123
}
124124
}
@@ -129,12 +129,6 @@ impl From<binary_sv2::Error> for TproxyError {
129129
}
130130
}
131131

132-
impl From<HandlerError> for TproxyError {
133-
fn from(value: HandlerError) -> Self {
134-
TproxyError::RolesSv2LogicHandlerError(value)
135-
}
136-
}
137-
138132
impl From<codec_sv2::noise_sv2::Error> for TproxyError {
139133
fn from(e: codec_sv2::noise_sv2::Error) -> Self {
140134
TproxyError::CodecNoise(e)
@@ -214,8 +208,12 @@ impl From<stratum_translation::error::StratumTranslationError> for TproxyError {
214208
}
215209
}
216210

217-
impl From<TproxyError> for HandlerError {
218-
fn from(value: TproxyError) -> Self {
219-
HandlerError::External(value.into())
211+
impl HandlerErrorType for TproxyError {
212+
fn parse_error(error: RolesParserError) -> Self {
213+
TproxyError::ParserError(error)
214+
}
215+
216+
fn unexpected_message(message_type: u8) -> Self {
217+
TproxyError::UnexpectedMessage(message_type)
220218
}
221219
}

roles/translator/src/lib/sv2/channel_manager/channel_manager.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -210,7 +210,7 @@ impl ChannelManager {
210210
match message {
211211
Message::Mining(_) => {
212212
channel_manager
213-
.handle_mining_message_from_server(message_type, &mut payload)
213+
.handle_mining_message_frame_from_server(message_type, &mut payload)
214214
.await?;
215215
}
216216
_ => {

roles/translator/src/lib/sv2/channel_manager/message_handler.rs

Lines changed: 41 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,7 @@ use crate::{
77
};
88
use stratum_common::roles_logic_sv2::{
99
channels_sv2::client::extended::ExtendedChannel,
10-
handlers_sv2::{
11-
HandleMiningMessagesFromServerAsync, HandlerError as Error, SupportedChannelTypes,
12-
},
10+
handlers_sv2::{HandleMiningMessagesFromServerAsync, SupportedChannelTypes},
1311
mining_sv2::{
1412
CloseChannel, ExtendedExtranonce, Extranonce, NewExtendedMiningJob, NewMiningJob,
1513
OpenExtendedMiningChannelSuccess, OpenMiningChannelError, OpenStandardMiningChannelSuccess,
@@ -26,6 +24,8 @@ use stratum_common::roles_logic_sv2::{
2624
use tracing::{error, info, warn};
2725

2826
impl HandleMiningMessagesFromServerAsync for ChannelManager {
27+
type Error = TproxyError;
28+
2929
fn get_channel_type_for_server(&self) -> SupportedChannelTypes {
3030
SupportedChannelTypes::Extended
3131
}
@@ -37,17 +37,17 @@ impl HandleMiningMessagesFromServerAsync for ChannelManager {
3737
async fn handle_open_standard_mining_channel_success(
3838
&mut self,
3939
m: OpenStandardMiningChannelSuccess<'_>,
40-
) -> Result<(), Error> {
40+
) -> Result<(), Self::Error> {
4141
warn!("Received: {}", m);
42-
Err(Error::UnexpectedMessage(
42+
Err(Self::Error::UnexpectedMessage(
4343
MESSAGE_TYPE_OPEN_STANDARD_MINING_CHANNEL_SUCCESS,
4444
))
4545
}
4646

4747
async fn handle_open_extended_mining_channel_success(
4848
&mut self,
4949
m: OpenExtendedMiningChannelSuccess<'_>,
50-
) -> Result<(), Error> {
50+
) -> Result<(), Self::Error> {
5151
// Check if we have the pending channel data, return error if not
5252
let (user_identity, nominal_hashrate, downstream_extranonce_len) = self
5353
.channel_manager_data
@@ -56,11 +56,11 @@ impl HandleMiningMessagesFromServerAsync for ChannelManager {
5656
})
5757
.map_err(|e| {
5858
error!("Failed to lock channel manager data: {:?}", e);
59-
Error::from(TproxyError::PoisonLock)
59+
TproxyError::PoisonLock
6060
})?
6161
.ok_or_else(|| {
6262
error!("No pending channel found for request_id: {}", m.request_id);
63-
Error::from(TproxyError::PendingChannelNotFound(m.request_id))
63+
TproxyError::PendingChannelNotFound(m.request_id)
6464
})?;
6565

6666
let success = self
@@ -162,7 +162,7 @@ impl HandleMiningMessagesFromServerAsync for ChannelManager {
162162
})
163163
.map_err(|e| {
164164
error!("Failed to lock channel manager data: {:?}", e);
165-
Error::from(TproxyError::PoisonLock)
165+
TproxyError::PoisonLock
166166
})?;
167167

168168
self.channel_state
@@ -171,7 +171,7 @@ impl HandleMiningMessagesFromServerAsync for ChannelManager {
171171
.await
172172
.map_err(|e| {
173173
error!("Failed to send OpenExtendedMiningChannelSuccess: {:?}", e);
174-
Error::from(TproxyError::ChannelErrorSender)
174+
TproxyError::ChannelErrorSender
175175
})?;
176176

177177
Ok(())
@@ -180,20 +180,20 @@ impl HandleMiningMessagesFromServerAsync for ChannelManager {
180180
async fn handle_open_mining_channel_error(
181181
&mut self,
182182
m: OpenMiningChannelError<'_>,
183-
) -> Result<(), Error> {
183+
) -> Result<(), Self::Error> {
184184
warn!("Received: {}", m);
185185
todo!("OpenMiningChannelError not handled yet");
186186
}
187187

188188
async fn handle_update_channel_error(
189189
&mut self,
190190
m: UpdateChannelError<'_>,
191-
) -> Result<(), Error> {
191+
) -> Result<(), Self::Error> {
192192
warn!("Received: {}", m);
193193
Ok(())
194194
}
195195

196-
async fn handle_close_channel(&mut self, m: CloseChannel<'_>) -> Result<(), Error> {
196+
async fn handle_close_channel(&mut self, m: CloseChannel<'_>) -> Result<(), Self::Error> {
197197
info!("Received: {}", m);
198198
_ = self.channel_manager_data.safe_lock(|channel_data_manager| {
199199
if channel_data_manager.mode == ChannelMode::Aggregated {
@@ -210,23 +210,29 @@ impl HandleMiningMessagesFromServerAsync for ChannelManager {
210210
async fn handle_set_extranonce_prefix(
211211
&mut self,
212212
m: SetExtranoncePrefix<'_>,
213-
) -> Result<(), Error> {
213+
) -> Result<(), Self::Error> {
214214
warn!("Received: {}", m);
215215
warn!("⚠️ Cannot process SetExtranoncePrefix since set_extranonce is not supported for majority of sv1 clients. Ignoring.");
216216
Ok(())
217217
}
218218

219-
async fn handle_submit_shares_success(&mut self, m: SubmitSharesSuccess) -> Result<(), Error> {
219+
async fn handle_submit_shares_success(
220+
&mut self,
221+
m: SubmitSharesSuccess,
222+
) -> Result<(), Self::Error> {
220223
info!("Received: {} ✅", m);
221224
Ok(())
222225
}
223226

224-
async fn handle_submit_shares_error(&mut self, m: SubmitSharesError<'_>) -> Result<(), Error> {
227+
async fn handle_submit_shares_error(
228+
&mut self,
229+
m: SubmitSharesError<'_>,
230+
) -> Result<(), Self::Error> {
225231
warn!("Received: {} ❌", m.channel_id);
226232
Ok(())
227233
}
228234

229-
async fn handle_new_mining_job(&mut self, m: NewMiningJob<'_>) -> Result<(), Error> {
235+
async fn handle_new_mining_job(&mut self, m: NewMiningJob<'_>) -> Result<(), Self::Error> {
230236
warn!("Received: {}", m);
231237
warn!("⚠️ Cannot process NewMiningJob since Translator Proxy supports only extended mining jobs. Ignoring.");
232238
Ok(())
@@ -235,7 +241,7 @@ impl HandleMiningMessagesFromServerAsync for ChannelManager {
235241
async fn handle_new_extended_mining_job(
236242
&mut self,
237243
m: NewExtendedMiningJob<'_>,
238-
) -> Result<(), Error> {
244+
) -> Result<(), Self::Error> {
239245
info!("Received: {}", m);
240246
let mut m_static = m.clone().into_static();
241247
_ = self.channel_manager_data.safe_lock(|channel_manage_data| {
@@ -274,13 +280,13 @@ impl HandleMiningMessagesFromServerAsync for ChannelManager {
274280
.await
275281
.map_err(|e| {
276282
error!("Failed to send immediate NewExtendedMiningJob: {:?}", e);
277-
Error::from(TproxyError::ChannelErrorSender)
283+
TproxyError::ChannelErrorSender
278284
})?;
279285
}
280286
Ok(())
281287
}
282288

283-
async fn handle_set_new_prev_hash(&mut self, m: SetNewPrevHash<'_>) -> Result<(), Error> {
289+
async fn handle_set_new_prev_hash(&mut self, m: SetNewPrevHash<'_>) -> Result<(), Self::Error> {
284290
info!("Received: {}", m);
285291
let m_static = m.clone().into_static();
286292
_ = self.channel_manager_data.safe_lock(|channel_manager_data| {
@@ -314,7 +320,7 @@ impl HandleMiningMessagesFromServerAsync for ChannelManager {
314320
.await
315321
.map_err(|e| {
316322
error!("Failed to send SetNewPrevHash: {:?}", e);
317-
Error::from(TproxyError::ChannelErrorSender)
323+
TproxyError::ChannelErrorSender
318324
})?;
319325

320326
let mode = self
@@ -347,7 +353,7 @@ impl HandleMiningMessagesFromServerAsync for ChannelManager {
347353
.await
348354
.map_err(|e| {
349355
error!("Failed to send NewExtendedMiningJob: {:?}", e);
350-
Error::from(TproxyError::ChannelErrorSender)
356+
TproxyError::ChannelErrorSender
351357
})?;
352358
}
353359
Ok(())
@@ -356,26 +362,26 @@ impl HandleMiningMessagesFromServerAsync for ChannelManager {
356362
async fn handle_set_custom_mining_job_success(
357363
&mut self,
358364
m: SetCustomMiningJobSuccess,
359-
) -> Result<(), Error> {
365+
) -> Result<(), Self::Error> {
360366
warn!("Received: {}", m);
361367
warn!("⚠️ Cannot process SetCustomMiningJobSuccess since Translator Proxy does not support custom mining jobs. Ignoring.");
362-
Err(Error::UnexpectedMessage(
368+
Err(Self::Error::UnexpectedMessage(
363369
MESSAGE_TYPE_SET_CUSTOM_MINING_JOB_SUCCESS,
364370
))
365371
}
366372

367373
async fn handle_set_custom_mining_job_error(
368374
&mut self,
369375
m: SetCustomMiningJobError<'_>,
370-
) -> Result<(), Error> {
376+
) -> Result<(), Self::Error> {
371377
warn!("Received: {}", m);
372378
warn!("⚠️ Cannot process SetCustomMiningJobError since Translator Proxy does not support custom mining jobs. Ignoring.");
373-
Err(Error::UnexpectedMessage(
379+
Err(Self::Error::UnexpectedMessage(
374380
MESSAGE_TYPE_SET_CUSTOM_MINING_JOB_ERROR,
375381
))
376382
}
377383

378-
async fn handle_set_target(&mut self, m: SetTarget<'_>) -> Result<(), Error> {
384+
async fn handle_set_target(&mut self, m: SetTarget<'_>) -> Result<(), Self::Error> {
379385
info!("Received: {}", m);
380386

381387
// Update the channel targets in the channel manager
@@ -409,15 +415,20 @@ impl HandleMiningMessagesFromServerAsync for ChannelManager {
409415
.await
410416
.map_err(|e| {
411417
error!("Failed to forward SetTarget message to SV1Server: {:?}", e);
412-
Error::from(TproxyError::ChannelErrorSender)
418+
TproxyError::ChannelErrorSender
413419
})?;
414420

415421
Ok(())
416422
}
417423

418-
async fn handle_set_group_channel(&mut self, m: SetGroupChannel<'_>) -> Result<(), Error> {
424+
async fn handle_set_group_channel(
425+
&mut self,
426+
m: SetGroupChannel<'_>,
427+
) -> Result<(), Self::Error> {
419428
warn!("Received: {}", m);
420429
warn!("⚠️ Cannot process SetGroupChannel since Translator Proxy does not support group channels. Ignoring.");
421-
Err(Error::UnexpectedMessage(MESSAGE_TYPE_SET_GROUP_CHANNEL))
430+
Err(Self::Error::UnexpectedMessage(
431+
MESSAGE_TYPE_SET_GROUP_CHANNEL,
432+
))
422433
}
423434
}

roles/translator/src/lib/sv2/upstream/message_handler.rs

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,40 @@
1-
use crate::sv2::Upstream;
1+
use crate::{error::TproxyError, sv2::Upstream};
22
use stratum_common::roles_logic_sv2::{
33
common_messages_sv2::{
44
ChannelEndpointChanged, Reconnect, SetupConnectionError, SetupConnectionSuccess,
55
},
6-
handlers_sv2::{HandleCommonMessagesFromServerAsync, HandlerError},
6+
handlers_sv2::HandleCommonMessagesFromServerAsync,
77
};
88
use tracing::{error, info};
99

1010
impl HandleCommonMessagesFromServerAsync for Upstream {
11+
type Error = TproxyError;
12+
1113
async fn handle_setup_connection_error(
1214
&mut self,
1315
msg: SetupConnectionError<'_>,
14-
) -> Result<(), HandlerError> {
16+
) -> Result<(), Self::Error> {
1517
error!("Received: {}", msg);
1618
todo!()
1719
}
1820

1921
async fn handle_setup_connection_success(
2022
&mut self,
2123
msg: SetupConnectionSuccess,
22-
) -> Result<(), HandlerError> {
24+
) -> Result<(), Self::Error> {
2325
info!("Received: {}", msg);
2426
Ok(())
2527
}
2628

2729
async fn handle_channel_endpoint_changed(
2830
&mut self,
2931
msg: ChannelEndpointChanged,
30-
) -> Result<(), HandlerError> {
32+
) -> Result<(), Self::Error> {
3133
info!("Received: {}", msg);
3234
todo!()
3335
}
3436

35-
async fn handle_reconnect(&mut self, msg: Reconnect<'_>) -> Result<(), HandlerError> {
37+
async fn handle_reconnect(&mut self, msg: Reconnect<'_>) -> Result<(), Self::Error> {
3638
info!("Received: {}", msg);
3739
todo!()
3840
}

roles/translator/src/lib/sv2/upstream/upstream.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -242,7 +242,7 @@ impl Upstream {
242242

243243
let payload = incoming.payload();
244244

245-
self.handle_common_message_from_server(message_type, payload)
245+
self.handle_common_message_frame_from_server(message_type, payload)
246246
.await?;
247247
debug!("Upstream: handshake completed successfully.");
248248
Ok(())
@@ -273,7 +273,7 @@ impl Upstream {
273273
AnyMessage::Common(_) => {
274274
// Handle common upstream messages
275275
upstream
276-
.handle_common_message_from_server(messsage_type, &mut payload)
276+
.handle_common_message_frame_from_server(messsage_type, &mut payload)
277277
.await?;
278278
}
279279

@@ -292,7 +292,7 @@ impl Upstream {
292292

293293
_ => {
294294
error!("Received unsupported message type from upstream.");
295-
return Err(TproxyError::UnexpectedMessage);
295+
return Err(TproxyError::UnexpectedMessage(0));
296296
}
297297
}
298298
}

0 commit comments

Comments
 (0)