@@ -25,6 +25,7 @@ use blockstack_lib::net::api::postblock_proposal::{
25
25
TOO_MANY_REQUESTS_STATUS ,
26
26
} ;
27
27
use blockstack_lib:: util_lib:: db:: Error as DBError ;
28
+ use clarity:: codec:: read_next;
28
29
use clarity:: types:: chainstate:: { StacksBlockId , StacksPrivateKey } ;
29
30
use clarity:: types:: { PrivateKey , StacksEpochId } ;
30
31
use clarity:: util:: hash:: { MerkleHashFunc , Sha512Trunc256Sum } ;
@@ -38,7 +39,7 @@ use libsigner::v0::messages::{
38
39
RejectReason , RejectReasonPrefix , SignerMessage , StateMachineUpdate ,
39
40
} ;
40
41
use libsigner:: v0:: signer_state:: GlobalStateEvaluator ;
41
- use libsigner:: { BlockProposal , SignerEvent } ;
42
+ use libsigner:: { BlockProposal , SignerEvent , SignerSession } ;
42
43
use stacks_common:: types:: chainstate:: { StacksAddress , StacksPublicKey } ;
43
44
use stacks_common:: util:: get_epoch_time_secs;
44
45
use stacks_common:: util:: secp256k1:: MessageSignature ;
@@ -199,7 +200,7 @@ impl<const N: usize> RecentlyProcessedBlocks<N> {
199
200
impl SignerTrait < SignerMessage > for Signer {
200
201
/// Create a new signer from the given configuration
201
202
fn new ( stacks_client : & StacksClient , signer_config : SignerConfig ) -> Self {
202
- let stackerdb = StackerDB :: from ( & signer_config) ;
203
+ let mut stackerdb = StackerDB :: from ( & signer_config) ;
203
204
let mode = match signer_config. signer_mode {
204
205
SignerConfigMode :: DryRun => SignerMode :: DryRun ,
205
206
SignerConfigMode :: Normal { signer_id, .. } => SignerMode :: Normal { signer_id } ,
@@ -216,12 +217,58 @@ impl SignerTrait<SignerMessage> for Signer {
216
217
& StacksPublicKey :: from_private ( & signer_config. stacks_private_key ) ,
217
218
) ;
218
219
220
+ let session = stackerdb
221
+ . get_session_mut ( & MessageSlotID :: StateMachineUpdate )
222
+ . expect ( "Invalid stackerdb session" ) ;
223
+ let signer_slot_ids: Vec < _ > = signer_config
224
+ . signer_entries
225
+ . signer_id_to_addr
226
+ . keys ( )
227
+ . copied ( )
228
+ . collect ( ) ;
229
+ for ( chunk_opt, slot_id) in session
230
+ . get_latest_chunks ( & signer_slot_ids)
231
+ . inspect_err ( |e| {
232
+ warn ! ( "Error retrieving state machine updates from stacker DB: {e}" ) ;
233
+ } )
234
+ . unwrap_or_default ( )
235
+ . into_iter ( )
236
+ . zip ( signer_slot_ids. iter ( ) )
237
+ {
238
+ let Some ( chunk) = chunk_opt else {
239
+ continue ;
240
+ } ;
241
+
242
+ let Ok ( SignerMessage :: StateMachineUpdate ( update) ) =
243
+ read_next :: < SignerMessage , _ > ( & mut & chunk[ ..] )
244
+ else {
245
+ continue ;
246
+ } ;
247
+
248
+ let Some ( signer_addr) = signer_config. signer_entries . signer_id_to_addr . get ( slot_id)
249
+ else {
250
+ continue ;
251
+ } ;
252
+
253
+ // This might update the received time/cause a discrepency between when we receive it at our event queue, but it
254
+ // allows signers to potentially evaluate blocks immediately regardless of its nodes event queue state on startup
255
+ if let Err ( e) = signer_db. insert_state_machine_update (
256
+ signer_config. reward_cycle ,
257
+ signer_addr,
258
+ & update,
259
+ & SystemTime :: now ( ) ,
260
+ ) {
261
+ warn ! ( "Error submitting state machine update to signer DB: {e}" ) ;
262
+ } ;
263
+ }
264
+
219
265
let updates = signer_db
220
266
. get_signer_state_machine_updates ( signer_config. reward_cycle )
221
267
. inspect_err ( |e| {
222
268
warn ! ( "An error occurred retrieving state machine updates from the db: {e}" )
223
269
} )
224
270
. unwrap_or_default ( ) ;
271
+
225
272
let global_state_evaluator = GlobalStateEvaluator :: new (
226
273
updates,
227
274
signer_config. signer_entries . signer_addr_to_weight . clone ( ) ,
0 commit comments