Skip to content

Commit f96a33f

Browse files
committed
Implement process_event function for SignerEvent<T>
Signed-off-by: Jacinta Ferrant <[email protected]>
1 parent 5c1ae90 commit f96a33f

File tree

1 file changed

+68
-124
lines changed

1 file changed

+68
-124
lines changed

libsigner/src/events.rs

Lines changed: 68 additions & 124 deletions
Original file line numberDiff line numberDiff line change
@@ -305,21 +305,18 @@ impl<T: SignerEventTrait> EventReceiver<T> for SignerEventReceiver<T> {
305305
&request.method(),
306306
)));
307307
}
308+
debug!("Processing {} event", request.url());
308309
if request.url() == "/stackerdb_chunks" {
309-
process_stackerdb_event(event_receiver.local_addr, request)
310-
.map_err(|e| {
311-
error!("Error processing stackerdb_chunks message"; "err" => ?e);
312-
e
313-
})
310+
process_event::<T, StackerDBChunksEvent>(request)
314311
} else if request.url() == "/proposal_response" {
315-
process_proposal_response(request)
312+
process_event::<T, BlockValidateResponse>(request)
316313
} else if request.url() == "/new_burn_block" {
317-
process_new_burn_block_event(request)
314+
process_event::<T, BurnBlockEvent>(request)
318315
} else if request.url() == "/shutdown" {
319316
event_receiver.stop_signal.store(true, Ordering::SeqCst);
320-
return Err(EventError::Terminated);
317+
Err(EventError::Terminated)
321318
} else if request.url() == "/new_block" {
322-
process_new_block(request)
319+
process_event::<T, BlockEvent>(request)
323320
} else {
324321
let url = request.url().to_string();
325322
debug!(
@@ -391,12 +388,13 @@ fn ack_dispatcher(request: HttpRequest) {
391388

392389
// TODO: add tests from mutation testing results #4835
393390
#[cfg_attr(test, mutants::skip)]
394-
/// Process a stackerdb event from the node
395-
fn process_stackerdb_event<T: SignerEventTrait>(
396-
local_addr: Option<SocketAddr>,
397-
mut request: HttpRequest,
398-
) -> Result<SignerEvent<T>, EventError> {
391+
fn process_event<T, E>(mut request: HttpRequest) -> Result<SignerEvent<T>, EventError>
392+
where
393+
T: SignerEventTrait,
394+
E: serde::de::DeserializeOwned + TryInto<SignerEvent<T>, Error = EventError>,
395+
{
399396
let mut body = String::new();
397+
400398
if let Err(e) = request.as_reader().read_to_string(&mut body) {
401399
error!("Failed to read body: {:?}", &e);
402400
ack_dispatcher(request);
@@ -405,27 +403,12 @@ fn process_stackerdb_event<T: SignerEventTrait>(
405403
&e
406404
)));
407405
}
408-
409-
debug!("Got stackerdb_chunks event"; "chunks_event_body" => %body);
410-
let event: StackerDBChunksEvent = serde_json::from_slice(body.as_bytes())
406+
// Regardless of whether we successfully deserialize, we should ack the dispatcher so they don't keep resending it
407+
ack_dispatcher(request);
408+
let json_event: E = serde_json::from_slice(body.as_bytes())
411409
.map_err(|e| EventError::Deserialize(format!("Could not decode body to JSON: {:?}", &e)))?;
412410

413-
let event_contract_id = event.contract_id.clone();
414-
415-
let signer_event = match SignerEvent::try_from(event) {
416-
Err(e) => {
417-
info!(
418-
"[{:?}] next_event got event from an unexpected contract id {}, return OK so other side doesn't keep sending this",
419-
local_addr,
420-
event_contract_id
421-
);
422-
ack_dispatcher(request);
423-
return Err(e);
424-
}
425-
Ok(x) => x,
426-
};
427-
428-
ack_dispatcher(request);
411+
let signer_event: SignerEvent<T> = json_event.try_into()?;
429412

430413
Ok(signer_event)
431414
}
@@ -472,108 +455,69 @@ impl<T: SignerEventTrait> TryFrom<StackerDBChunksEvent> for SignerEvent<T> {
472455
}
473456
}
474457

475-
/// Process a proposal response from the node
476-
fn process_proposal_response<T: SignerEventTrait>(
477-
mut request: HttpRequest,
478-
) -> Result<SignerEvent<T>, EventError> {
479-
debug!("Got proposal_response event");
480-
let mut body = String::new();
481-
if let Err(e) = request.as_reader().read_to_string(&mut body) {
482-
error!("Failed to read body: {:?}", &e);
458+
impl<T: SignerEventTrait> TryFrom<BlockValidateResponse> for SignerEvent<T> {
459+
type Error = EventError;
483460

484-
ack_dispatcher(request);
485-
return Err(EventError::MalformedRequest(format!(
486-
"Failed to read body: {:?}",
487-
&e
488-
)));
461+
fn try_from(block_validate_response: BlockValidateResponse) -> Result<Self, Self::Error> {
462+
Ok(SignerEvent::BlockValidationResponse(
463+
block_validate_response,
464+
))
489465
}
466+
}
490467

491-
let event: BlockValidateResponse = serde_json::from_slice(body.as_bytes())
492-
.map_err(|e| EventError::Deserialize(format!("Could not decode body to JSON: {:?}", &e)))?;
493-
494-
ack_dispatcher(request);
495-
Ok(SignerEvent::BlockValidationResponse(event))
468+
#[derive(Debug, Deserialize)]
469+
struct BurnBlockEvent {
470+
burn_block_hash: String,
471+
burn_block_height: u64,
472+
reward_recipients: Vec<serde_json::Value>,
473+
reward_slot_holders: Vec<String>,
474+
burn_amount: u64,
496475
}
497476

498-
/// Process a new burn block event from the node
499-
fn process_new_burn_block_event<T: SignerEventTrait>(
500-
mut request: HttpRequest,
501-
) -> Result<SignerEvent<T>, EventError> {
502-
debug!("Got burn_block event");
503-
let mut body = String::new();
504-
if let Err(e) = request.as_reader().read_to_string(&mut body) {
505-
error!("Failed to read body: {:?}", &e);
477+
impl<T: SignerEventTrait> TryFrom<BurnBlockEvent> for SignerEvent<T> {
478+
type Error = EventError;
506479

507-
ack_dispatcher(request);
508-
return Err(EventError::MalformedRequest(format!(
509-
"Failed to read body: {:?}",
510-
&e
511-
)));
512-
}
513-
#[derive(Debug, Deserialize)]
514-
struct TempBurnBlockEvent {
515-
burn_block_hash: String,
516-
burn_block_height: u64,
517-
reward_recipients: Vec<serde_json::Value>,
518-
reward_slot_holders: Vec<String>,
519-
burn_amount: u64,
480+
fn try_from(burn_block_event: BurnBlockEvent) -> Result<Self, Self::Error> {
481+
let burn_header_hash = burn_block_event
482+
.burn_block_hash
483+
.get(2..)
484+
.ok_or_else(|| EventError::Deserialize("Hex string should be 0x prefixed".into()))
485+
.and_then(|hex| {
486+
BurnchainHeaderHash::from_hex(hex)
487+
.map_err(|e| EventError::Deserialize(format!("Invalid hex string: {e}")))
488+
})?;
489+
490+
Ok(SignerEvent::NewBurnBlock {
491+
burn_height: burn_block_event.burn_block_height,
492+
received_time: SystemTime::now(),
493+
burn_header_hash,
494+
})
520495
}
521-
let temp: TempBurnBlockEvent = serde_json::from_slice(body.as_bytes())
522-
.map_err(|e| EventError::Deserialize(format!("Could not decode body to JSON: {:?}", &e)))?;
523-
let burn_header_hash = temp
524-
.burn_block_hash
525-
.get(2..)
526-
.ok_or_else(|| EventError::Deserialize("Hex string should be 0x prefixed".into()))
527-
.and_then(|hex| {
528-
BurnchainHeaderHash::from_hex(hex)
529-
.map_err(|e| EventError::Deserialize(format!("Invalid hex string: {e}")))
530-
})?;
531-
let event = SignerEvent::NewBurnBlock {
532-
burn_height: temp.burn_block_height,
533-
received_time: SystemTime::now(),
534-
burn_header_hash,
535-
};
536-
ack_dispatcher(request);
537-
Ok(event)
538496
}
539497

540-
/// Process a new burn block event from the node
541-
fn process_new_block<T: SignerEventTrait>(
542-
mut request: HttpRequest,
543-
) -> Result<SignerEvent<T>, EventError> {
544-
debug!("Got new_block event");
545-
let mut body = String::new();
546-
if let Err(e) = request.as_reader().read_to_string(&mut body) {
547-
error!("Failed to read body: {:?}", &e);
498+
#[derive(Debug, Deserialize)]
499+
struct BlockEvent {
500+
block_hash: String,
501+
block_height: u64,
502+
}
548503

549-
ack_dispatcher(request);
550-
return Err(EventError::MalformedRequest(format!(
551-
"Failed to read body: {:?}",
552-
&e
553-
)));
554-
}
555-
#[derive(Debug, Deserialize)]
556-
struct TempBlockEvent {
557-
block_hash: String,
558-
block_height: u64,
559-
}
504+
impl<T: SignerEventTrait> TryFrom<BlockEvent> for SignerEvent<T> {
505+
type Error = EventError;
560506

561-
let temp: TempBlockEvent = serde_json::from_slice(body.as_bytes())
562-
.map_err(|e| EventError::Deserialize(format!("Could not decode body to JSON: {:?}", &e)))?;
563-
let block_hash: Sha512Trunc256Sum = temp
564-
.block_hash
565-
.get(2..)
566-
.ok_or_else(|| EventError::Deserialize("Hex string should be 0x prefixed".into()))
567-
.and_then(|hex| {
568-
Sha512Trunc256Sum::from_hex(hex)
569-
.map_err(|e| EventError::Deserialize(format!("Invalid hex string: {e}")))
570-
})?;
571-
let event = SignerEvent::NewBlock {
572-
block_hash,
573-
block_height: temp.block_height,
574-
};
575-
ack_dispatcher(request);
576-
Ok(event)
507+
fn try_from(block_event: BlockEvent) -> Result<Self, Self::Error> {
508+
let block_hash: Sha512Trunc256Sum = block_event
509+
.block_hash
510+
.get(2..)
511+
.ok_or_else(|| EventError::Deserialize("Hex string should be 0x prefixed".into()))
512+
.and_then(|hex| {
513+
Sha512Trunc256Sum::from_hex(hex)
514+
.map_err(|e| EventError::Deserialize(format!("Invalid hex string: {e}")))
515+
})?;
516+
Ok(SignerEvent::NewBlock {
517+
block_hash,
518+
block_height: block_event.block_height,
519+
})
520+
}
577521
}
578522

579523
pub fn get_signers_db_signer_set_message_id(name: &str) -> Option<(u32, u32)> {

0 commit comments

Comments
 (0)