@@ -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 ;
@@ -201,7 +202,7 @@ impl<const N: usize> RecentlyProcessedBlocks<N> {
201
202
impl SignerTrait < SignerMessage > for Signer {
202
203
/// Create a new signer from the given configuration
203
204
fn new ( stacks_client : & StacksClient , signer_config : SignerConfig ) -> Self {
204
- let stackerdb = StackerDB :: from ( & signer_config) ;
205
+ let mut stackerdb = StackerDB :: from ( & signer_config) ;
205
206
let mode = match signer_config. signer_mode {
206
207
SignerConfigMode :: DryRun => SignerMode :: DryRun ,
207
208
SignerConfigMode :: Normal { signer_id, .. } => SignerMode :: Normal { signer_id } ,
@@ -218,12 +219,58 @@ impl SignerTrait<SignerMessage> for Signer {
218
219
& StacksPublicKey :: from_private ( & signer_config. stacks_private_key ) ,
219
220
) ;
220
221
222
+ let session = stackerdb
223
+ . get_session_mut ( & MessageSlotID :: StateMachineUpdate )
224
+ . expect ( "Invalid stackerdb session" ) ;
225
+ let signer_slot_ids: Vec < _ > = signer_config
226
+ . signer_entries
227
+ . signer_id_to_addr
228
+ . keys ( )
229
+ . copied ( )
230
+ . collect ( ) ;
231
+ for ( chunk_opt, slot_id) in session
232
+ . get_latest_chunks ( & signer_slot_ids)
233
+ . inspect_err ( |e| {
234
+ warn ! ( "Error retrieving state machine updates from stacker DB: {e}" ) ;
235
+ } )
236
+ . unwrap_or_default ( )
237
+ . into_iter ( )
238
+ . zip ( signer_slot_ids. iter ( ) )
239
+ {
240
+ let Some ( chunk) = chunk_opt else {
241
+ continue ;
242
+ } ;
243
+
244
+ let Ok ( SignerMessage :: StateMachineUpdate ( update) ) =
245
+ read_next :: < SignerMessage , _ > ( & mut & chunk[ ..] )
246
+ else {
247
+ continue ;
248
+ } ;
249
+
250
+ let Some ( signer_addr) = signer_config. signer_entries . signer_id_to_addr . get ( slot_id)
251
+ else {
252
+ continue ;
253
+ } ;
254
+
255
+ // This might update the received time/cause a discrepency between when we receive it at our event queue, but it
256
+ // allows signers to potentially evaluate blocks immediately regardless of its nodes event queue state on startup
257
+ if let Err ( e) = signer_db. insert_state_machine_update (
258
+ signer_config. reward_cycle ,
259
+ signer_addr,
260
+ & update,
261
+ & SystemTime :: now ( ) ,
262
+ ) {
263
+ warn ! ( "Error submitting state machine update to signer DB: {e}" ) ;
264
+ } ;
265
+ }
266
+
221
267
let updates = signer_db
222
268
. get_signer_state_machine_updates ( signer_config. reward_cycle )
223
269
. inspect_err ( |e| {
224
270
warn ! ( "An error occurred retrieving state machine updates from the db: {e}" )
225
271
} )
226
272
. unwrap_or_default ( ) ;
273
+
227
274
let global_state_evaluator = GlobalStateEvaluator :: new (
228
275
updates,
229
276
signer_config. signer_entries . signer_addr_to_weight . clone ( ) ,
0 commit comments