Skip to content

Commit 592f638

Browse files
committed
Read stackerdb signer updates on signer startup
Signed-off-by: Jacinta Ferrant <[email protected]>
1 parent d185f2d commit 592f638

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;
@@ -199,7 +200,7 @@ impl<const N: usize> RecentlyProcessedBlocks<N> {
199200
impl SignerTrait<SignerMessage> for Signer {
200201
/// Create a new signer from the given configuration
201202
fn new(stacks_client: &StacksClient, signer_config: SignerConfig) -> Self {
202-
let stackerdb = StackerDB::from(&signer_config);
203+
let mut stackerdb = StackerDB::from(&signer_config);
203204
let mode = match signer_config.signer_mode {
204205
SignerConfigMode::DryRun => SignerMode::DryRun,
205206
SignerConfigMode::Normal { signer_id, .. } => SignerMode::Normal { signer_id },
@@ -216,12 +217,58 @@ impl SignerTrait<SignerMessage> for Signer {
216217
&StacksPublicKey::from_private(&signer_config.stacks_private_key),
217218
);
218219

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

0 commit comments

Comments
 (0)