@@ -114,6 +114,13 @@ pub enum SignerEvent<T: SignerEventTrait> {
114
114
/// the time at which this event was received by the signer's event processor
115
115
received_time : SystemTime ,
116
116
} ,
117
+ /// A new processed Nakamoto block was received from the node with the given block hash
118
+ NewNakamotoBlock {
119
+ /// The block header hash for the newly processed stacks block
120
+ block_hash : Sha512Trunc256Sum ,
121
+ /// The block height for the newly processed stacks block
122
+ block_height : u64 ,
123
+ } ,
117
124
}
118
125
119
126
/// Trait to implement a stop-signaler for the event receiver thread.
@@ -311,16 +318,15 @@ impl<T: SignerEventTrait> EventReceiver<T> for SignerEventReceiver<T> {
311
318
} else if request. url ( ) == "/shutdown" {
312
319
event_receiver. stop_signal . store ( true , Ordering :: SeqCst ) ;
313
320
return Err ( EventError :: Terminated ) ;
321
+ } else if request. url ( ) == "/new_block" {
322
+ process_new_block ( request)
314
323
} else {
315
324
let url = request. url ( ) . to_string ( ) ;
316
- // `/new_block` is expected, but not specifically handled. do not log.
317
- if & url != "/new_block" {
318
- debug ! (
319
- "[{:?}] next_event got request with unexpected url {}, return OK so other side doesn't keep sending this" ,
320
- event_receiver. local_addr,
321
- url
322
- ) ;
323
- }
325
+ debug ! (
326
+ "[{:?}] next_event got request with unexpected url {}, return OK so other side doesn't keep sending this" ,
327
+ event_receiver. local_addr,
328
+ url
329
+ ) ;
324
330
ack_dispatcher ( request) ;
325
331
Err ( EventError :: UnrecognizedEvent ( url) )
326
332
}
@@ -475,9 +481,7 @@ fn process_proposal_response<T: SignerEventTrait>(
475
481
if let Err ( e) = request. as_reader ( ) . read_to_string ( & mut body) {
476
482
error ! ( "Failed to read body: {:?}" , & e) ;
477
483
478
- if let Err ( e) = request. respond ( HttpResponse :: empty ( 200u16 ) ) {
479
- error ! ( "Failed to respond to request: {:?}" , & e) ;
480
- }
484
+ ack_dispatcher ( request) ;
481
485
return Err ( EventError :: MalformedRequest ( format ! (
482
486
"Failed to read body: {:?}" ,
483
487
& e
@@ -487,10 +491,7 @@ fn process_proposal_response<T: SignerEventTrait>(
487
491
let event: BlockValidateResponse = serde_json:: from_slice ( body. as_bytes ( ) )
488
492
. map_err ( |e| EventError :: Deserialize ( format ! ( "Could not decode body to JSON: {:?}" , & e) ) ) ?;
489
493
490
- if let Err ( e) = request. respond ( HttpResponse :: empty ( 200u16 ) ) {
491
- error ! ( "Failed to respond to request: {:?}" , & e) ;
492
- }
493
-
494
+ ack_dispatcher ( request) ;
494
495
Ok ( SignerEvent :: BlockValidationResponse ( event) )
495
496
}
496
497
@@ -503,9 +504,7 @@ fn process_new_burn_block_event<T: SignerEventTrait>(
503
504
if let Err ( e) = request. as_reader ( ) . read_to_string ( & mut body) {
504
505
error ! ( "Failed to read body: {:?}" , & e) ;
505
506
506
- if let Err ( e) = request. respond ( HttpResponse :: empty ( 200u16 ) ) {
507
- error ! ( "Failed to respond to request: {:?}" , & e) ;
508
- }
507
+ ack_dispatcher ( request) ;
509
508
return Err ( EventError :: MalformedRequest ( format ! (
510
509
"Failed to read body: {:?}" ,
511
510
& e
@@ -534,9 +533,46 @@ fn process_new_burn_block_event<T: SignerEventTrait>(
534
533
received_time : SystemTime :: now ( ) ,
535
534
burn_header_hash,
536
535
} ;
537
- if let Err ( e) = request. respond ( HttpResponse :: empty ( 200u16 ) ) {
538
- error ! ( "Failed to respond to request: {:?}" , & e) ;
536
+ ack_dispatcher ( request) ;
537
+ Ok ( event)
538
+ }
539
+
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) ;
548
+
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 ,
539
559
}
560
+
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 :: NewNakamotoBlock {
572
+ block_hash,
573
+ block_height : temp. block_height ,
574
+ } ;
575
+ ack_dispatcher ( request) ;
540
576
Ok ( event)
541
577
}
542
578
0 commit comments