Skip to content

Commit 4d299ed

Browse files
committed
fix: signer runloop calculates miner pk with block header instead of signerdb chunks (#5858)
1 parent 5655256 commit 4d299ed

File tree

3 files changed

+16
-12
lines changed

3 files changed

+16
-12
lines changed

libsigner/src/events.rs

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -188,8 +188,7 @@ impl StacksMessageCodec for BlockProposalData {
188188
pub enum SignerEvent<T: SignerEventTrait> {
189189
/// A miner sent a message over .miners
190190
/// The `Vec<T>` will contain any signer messages made by the miner.
191-
/// The `StacksPublicKey` is the message sender's public key.
192-
MinerMessages(Vec<T>, StacksPublicKey),
191+
MinerMessages(Vec<T>),
193192
/// The signer messages for other signers and miners to observe
194193
/// The u32 is the signer set to which the message belongs (either 0 or 1)
195194
SignerMessages(u32, Vec<T>),
@@ -513,20 +512,13 @@ impl<T: SignerEventTrait> TryFrom<StackerDBChunksEvent> for SignerEvent<T> {
513512
&& event.contract_id.is_boot()
514513
{
515514
let mut messages = vec![];
516-
let mut miner_pk = None;
517515
for chunk in event.modified_slots {
518516
let Ok(msg) = T::consensus_deserialize(&mut chunk.data.as_slice()) else {
519517
continue;
520518
};
521-
522-
miner_pk = Some(chunk.recover_pk().map_err(|e| {
523-
EventError::MalformedRequest(format!(
524-
"Failed to recover PK from StackerDB chunk: {e}"
525-
))
526-
})?);
527519
messages.push(msg);
528520
}
529-
SignerEvent::MinerMessages(messages, miner_pk.ok_or(EventError::EmptyChunksEvent)?)
521+
SignerEvent::MinerMessages(messages)
530522
} else if event.contract_id.name.starts_with(SIGNERS_NAME) && event.contract_id.is_boot() {
531523
let Some((signer_set, _)) =
532524
get_signers_db_signer_set_message_id(event.contract_id.name.as_str())

stacks-signer/CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,10 @@ and this project adheres to the versioning scheme outlined in the [README.md](RE
2020
- Add new reject codes to the signer response for better visibility into why a block was rejected.
2121
- When allowing a reorg within the `reorg_attempts_activity_timeout_ms`, the signer will now watch the responses from other signers and if >30% of them reject this reorg attempt, then the signer will mark the miner as invalid, reject further attempts to reorg and allow the previous miner to extend their tenure.
2222

23+
### Fixed
24+
25+
- The signer runloop no longer relies on pubkey reports from the SignerDB event system. This previously led to improper proposal rejections via #5858.
26+
2327
## [3.1.0.0.5.0]
2428

2529
### Added

stacks-signer/src/v0/signer.rs

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -184,7 +184,7 @@ impl SignerTrait<SignerMessage> for Signer {
184184
self.handle_block_response(stacks_client, block_response, sortition_state);
185185
}
186186
}
187-
SignerEvent::MinerMessages(messages, miner_pubkey) => {
187+
SignerEvent::MinerMessages(messages) => {
188188
debug!(
189189
"{self}: Received {} messages from the miner",
190190
messages.len();
@@ -196,11 +196,19 @@ impl SignerTrait<SignerMessage> for Signer {
196196
if self.test_ignore_all_block_proposals(block_proposal) {
197197
continue;
198198
}
199+
let Some(miner_pubkey) = block_proposal.block.header.recover_miner_pk()
200+
else {
201+
warn!("{self}: Failed to recover miner pubkey";
202+
"signer_sighash" => %block_proposal.block.header.signer_signature_hash(),
203+
"consensus_hash" => %block_proposal.block.header.consensus_hash);
204+
continue;
205+
};
206+
199207
self.handle_block_proposal(
200208
stacks_client,
201209
sortition_state,
202210
block_proposal,
203-
miner_pubkey,
211+
&miner_pubkey,
204212
);
205213
}
206214
SignerMessage::BlockPushed(b) => {

0 commit comments

Comments
 (0)