Skip to content

Commit ac5b257

Browse files
authored
Merge pull request #6289 from jferrant/cleanup/retrieve-latest-updates-on-signer-startup
Read stackerdb signer updates on signer startup
2 parents fd2deae + 592f638 commit ac5b257

File tree

1 file changed

+49
-2
lines changed

1 file changed

+49
-2
lines changed

stacks-signer/src/v0/signer.rs

Lines changed: 49 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ use blockstack_lib::net::api::postblock_proposal::{
2525
TOO_MANY_REQUESTS_STATUS,
2626
};
2727
use blockstack_lib::util_lib::db::Error as DBError;
28+
use clarity::codec::read_next;
2829
use clarity::types::chainstate::{StacksBlockId, StacksPrivateKey};
2930
use clarity::types::{PrivateKey, StacksEpochId};
3031
use clarity::util::hash::{MerkleHashFunc, Sha512Trunc256Sum};
@@ -38,7 +39,7 @@ use libsigner::v0::messages::{
3839
RejectReason, RejectReasonPrefix, SignerMessage, StateMachineUpdate,
3940
};
4041
use libsigner::v0::signer_state::GlobalStateEvaluator;
41-
use libsigner::{BlockProposal, SignerEvent};
42+
use libsigner::{BlockProposal, SignerEvent, SignerSession};
4243
use stacks_common::types::chainstate::{StacksAddress, StacksPublicKey};
4344
use stacks_common::util::get_epoch_time_secs;
4445
use stacks_common::util::secp256k1::MessageSignature;
@@ -201,7 +202,7 @@ impl<const N: usize> RecentlyProcessedBlocks<N> {
201202
impl SignerTrait<SignerMessage> for Signer {
202203
/// Create a new signer from the given configuration
203204
fn new(stacks_client: &StacksClient, signer_config: SignerConfig) -> Self {
204-
let stackerdb = StackerDB::from(&signer_config);
205+
let mut stackerdb = StackerDB::from(&signer_config);
205206
let mode = match signer_config.signer_mode {
206207
SignerConfigMode::DryRun => SignerMode::DryRun,
207208
SignerConfigMode::Normal { signer_id, .. } => SignerMode::Normal { signer_id },
@@ -218,12 +219,58 @@ impl SignerTrait<SignerMessage> for Signer {
218219
&StacksPublicKey::from_private(&signer_config.stacks_private_key),
219220
);
220221

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+
221267
let updates = signer_db
222268
.get_signer_state_machine_updates(signer_config.reward_cycle)
223269
.inspect_err(|e| {
224270
warn!("An error occurred retrieving state machine updates from the db: {e}")
225271
})
226272
.unwrap_or_default();
273+
227274
let global_state_evaluator = GlobalStateEvaluator::new(
228275
updates,
229276
signer_config.signer_entries.signer_addr_to_weight.clone(),

0 commit comments

Comments
 (0)