Skip to content

Commit 80b4bbd

Browse files
committed
CRC: just send the update messages after processing an event
Signed-off-by: Jacinta Ferrant <[email protected]>
1 parent 49bbb64 commit 80b4bbd

File tree

5 files changed

+33
-56
lines changed

5 files changed

+33
-56
lines changed

stacks-signer/src/v0/signer.rs

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,7 @@ impl std::fmt::Display for Signer {
129129
impl SignerTrait<SignerMessage> for Signer {
130130
/// Create a new signer from the given configuration
131131
fn new(stacks_client: &StacksClient, signer_config: SignerConfig) -> Self {
132-
let mut stackerdb = StackerDB::from(&signer_config);
132+
let stackerdb = StackerDB::from(&signer_config);
133133
let mode = match signer_config.signer_mode {
134134
SignerConfigMode::DryRun => SignerMode::DryRun,
135135
SignerConfigMode::Normal { signer_id, .. } => SignerMode::Normal { signer_id },
@@ -141,12 +141,11 @@ impl SignerTrait<SignerMessage> for Signer {
141141
SignerDb::new(&signer_config.db_path).expect("Failed to connect to signer Db");
142142
let proposal_config = ProposalEvalConfig::from(&signer_config);
143143

144-
let signer_state =
145-
LocalStateMachine::new(&signer_db, &mut stackerdb, stacks_client, &proposal_config)
146-
.unwrap_or_else(|e| {
147-
warn!("Failed to initialize local state machine for signer: {e:?}");
148-
LocalStateMachine::Uninitialized
149-
});
144+
let signer_state = LocalStateMachine::new(&signer_db, stacks_client, &proposal_config)
145+
.unwrap_or_else(|e| {
146+
warn!("Failed to initialize local state machine for signer: {e:?}");
147+
LocalStateMachine::Uninitialized
148+
});
150149
Self {
151150
private_key: signer_config.stacks_private_key,
152151
stackerdb,
@@ -213,8 +212,9 @@ impl SignerTrait<SignerMessage> for Signer {
213212
return;
214213
}
215214

215+
let prior_state = self.local_state_machine.clone();
216216
if self.reward_cycle <= current_reward_cycle {
217-
self.local_state_machine.handle_pending_update(&self.signer_db, &mut self.stackerdb, stacks_client, &self.proposal_config)
217+
self.local_state_machine.handle_pending_update(&self.signer_db, stacks_client, &self.proposal_config)
218218
.unwrap_or_else(|e| error!("{self}: failed to update local state machine for pending update"; "err" => ?e));
219219
}
220220

@@ -338,7 +338,7 @@ impl SignerTrait<SignerMessage> for Signer {
338338
panic!("{self} Failed to write burn block event to signerdb: {e}");
339339
});
340340
self.local_state_machine
341-
.bitcoin_block_arrival(&self.signer_db, &mut self.stackerdb, stacks_client, &self.proposal_config, Some(*burn_height))
341+
.bitcoin_block_arrival(&self.signer_db, stacks_client, &self.proposal_config, Some(*burn_height))
342342
.unwrap_or_else(|e| error!("{self}: failed to update local state machine for latest bitcoin block arrival"; "err" => ?e));
343343
*sortition_state = None;
344344
}
@@ -360,7 +360,7 @@ impl SignerTrait<SignerMessage> for Signer {
360360
"block_height" => block_height
361361
);
362362
self.local_state_machine
363-
.stacks_block_arrival(&mut self.stackerdb, consensus_hash, *block_height, block_id)
363+
.stacks_block_arrival(consensus_hash, *block_height, block_id)
364364
.unwrap_or_else(|e| error!("{self}: failed to update local state machine for latest stacks block arrival"; "err" => ?e));
365365

366366
if let Ok(Some(mut block_info)) = self
@@ -382,6 +382,10 @@ impl SignerTrait<SignerMessage> for Signer {
382382
}
383383
}
384384
}
385+
if prior_state != self.local_state_machine {
386+
self.local_state_machine
387+
.send_signer_update_message(&mut self.stackerdb);
388+
}
385389
}
386390

387391
fn has_unprocessed_blocks(&self) -> bool {

stacks-signer/src/v0/signer_state.rs

Lines changed: 6 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -144,12 +144,11 @@ impl LocalStateMachine {
144144
/// and signerdb for the current sortition information
145145
pub fn new(
146146
db: &SignerDb,
147-
stackerdb: &mut StackerDB<MessageSlotID>,
148147
client: &StacksClient,
149148
proposal_config: &ProposalEvalConfig,
150149
) -> Result<Self, SignerChainstateError> {
151150
let mut instance = Self::Uninitialized;
152-
instance.bitcoin_block_arrival(db, stackerdb, client, proposal_config, None)?;
151+
instance.bitcoin_block_arrival(db, client, proposal_config, None)?;
153152

154153
Ok(instance)
155154
}
@@ -163,7 +162,7 @@ impl LocalStateMachine {
163162
}
164163
}
165164

166-
/// Send the local tate machine as an signer update message to stackerdb
165+
/// Send the local state machine as a signer update message to stackerdb
167166
pub fn send_signer_update_message(&self, stackerdb: &mut StackerDB<MessageSlotID>) {
168167
let update: Result<StateMachineUpdateMessage, _> = self.try_into();
169168
match update {
@@ -182,21 +181,16 @@ impl LocalStateMachine {
182181
pub fn handle_pending_update(
183182
&mut self,
184183
db: &SignerDb,
185-
stackerdb: &mut StackerDB<MessageSlotID>,
186184
client: &StacksClient,
187185
proposal_config: &ProposalEvalConfig,
188186
) -> Result<(), SignerChainstateError> {
189187
let LocalStateMachine::Pending { update, .. } = self else {
190-
return self.check_miner_inactivity(db, stackerdb, client, proposal_config);
188+
return self.check_miner_inactivity(db, client, proposal_config);
191189
};
192190
match update.clone() {
193-
StateMachineUpdate::BurnBlock(expected_burn_height) => self.bitcoin_block_arrival(
194-
db,
195-
stackerdb,
196-
client,
197-
proposal_config,
198-
Some(expected_burn_height),
199-
),
191+
StateMachineUpdate::BurnBlock(expected_burn_height) => {
192+
self.bitcoin_block_arrival(db, client, proposal_config, Some(expected_burn_height))
193+
}
200194
}
201195
}
202196

@@ -237,7 +231,6 @@ impl LocalStateMachine {
237231
fn check_miner_inactivity(
238232
&mut self,
239233
db: &SignerDb,
240-
stackerdb: &mut StackerDB<MessageSlotID>,
241234
client: &StacksClient,
242235
proposal_config: &ProposalEvalConfig,
243236
) -> Result<(), SignerChainstateError> {
@@ -278,8 +271,6 @@ impl LocalStateMachine {
278271
"inactive_tenure_ch" => %inactive_tenure_ch,
279272
"new_active_tenure_ch" => %new_active_tenure_ch
280273
);
281-
// We have updated our state, so let other signers know.
282-
self.send_signer_update_message(stackerdb);
283274
Ok(())
284275
} else {
285276
warn!("Current miner timed out due to inactivity, but prior miner is not valid. Allowing current miner to continue");
@@ -347,7 +338,6 @@ impl LocalStateMachine {
347338
/// Handle a new stacks block arrival
348339
pub fn stacks_block_arrival(
349340
&mut self,
350-
stackerdb: &mut StackerDB<MessageSlotID>,
351341
ch: &ConsensusHash,
352342
height: u64,
353343
block_id: &StacksBlockId,
@@ -403,8 +393,6 @@ impl LocalStateMachine {
403393
*parent_tenure_last_block = *block_id;
404394
*parent_tenure_last_block_height = height;
405395
*self = LocalStateMachine::Initialized(prior_state_machine);
406-
// We updated the block id and/or the height. Let other signers know our view has changed
407-
self.send_signer_update_message(stackerdb);
408396
Ok(())
409397
}
410398

@@ -452,7 +440,6 @@ impl LocalStateMachine {
452440
pub fn bitcoin_block_arrival(
453441
&mut self,
454442
db: &SignerDb,
455-
stackerdb: &mut StackerDB<MessageSlotID>,
456443
client: &StacksClient,
457444
proposal_config: &ProposalEvalConfig,
458445
mut expected_burn_height: Option<u64>,
@@ -538,11 +525,6 @@ impl LocalStateMachine {
538525
current_miner: miner_state,
539526
active_signer_protocol_version: prior_state_machine.active_signer_protocol_version,
540527
});
541-
542-
if prior_state != *self {
543-
self.send_signer_update_message(stackerdb);
544-
}
545-
546528
Ok(())
547529
}
548530
}

testnet/stacks-node/src/tests/epoch_205.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,7 @@ use stacks::chainstate::stacks::{
1414
};
1515
use stacks::config::{EventKeyType, InitialBalance};
1616
use stacks::core::test_util::{
17-
make_contract_call, make_contract_call_mblock_only, make_contract_publish,
18-
make_contract_publish_microblock_only, to_addr,
17+
make_contract_call, make_contract_call_mblock_only, make_contract_publish, to_addr,
1918
};
2019
use stacks::core::{
2120
self, EpochList, StacksEpoch, StacksEpochId, PEER_VERSION_EPOCH_1_0, PEER_VERSION_EPOCH_2_0,

testnet/stacks-node/src/tests/signer/mod.rs

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1220,13 +1220,6 @@ impl<S: Signer<T> + Send + 'static, T: SignerEventTrait + 'static> SignerTest<Sp
12201220
.send_message_with_retry::<SignerMessage>(accepted.into())
12211221
.expect("Failed to send accept signature");
12221222
}
1223-
1224-
pub fn signer_public_keys(&self) -> Vec<StacksPublicKey> {
1225-
self.signer_stacks_private_keys
1226-
.iter()
1227-
.map(StacksPublicKey::from_private)
1228-
.collect()
1229-
}
12301223
}
12311224

12321225
fn setup_stx_btc_node<G: FnMut(&mut NeonConfig)>(

testnet/stacks-node/src/tests/signer/v0.rs

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -771,7 +771,6 @@ impl MultipleMinerTest {
771771
contract_src: &str,
772772
) -> String {
773773
let http_origin = self.node_http();
774-
let sender_addr = tests::to_addr(&self.sender_sk);
775774
let contract_tx = make_contract_publish(
776775
&self.sender_sk,
777776
sender_nonce,
@@ -6095,7 +6094,7 @@ fn reorg_locally_accepted_blocks_across_tenures_succeeds() {
60956094
None,
60966095
None,
60976096
);
6098-
let all_signers = signer_test.signer_public_keys();
6097+
let all_signers = signer_test.signer_test_pks();
60996098
let http_origin = format!("http://{}", &signer_test.running_nodes.conf.node.rpc_bind);
61006099

61016100
let miner_sk = signer_test.running_nodes.conf.miner.mining_key.unwrap();
@@ -6265,7 +6264,7 @@ fn reorg_locally_accepted_blocks_across_tenures_fails() {
62656264
None,
62666265
None,
62676266
);
6268-
let all_signers = signer_test.signer_public_keys();
6267+
let all_signers = signer_test.signer_test_pks();
62696268
let http_origin = format!("http://{}", &signer_test.running_nodes.conf.node.rpc_bind);
62706269

62716270
let miner_sk = signer_test.running_nodes.conf.miner.mining_key.unwrap();
@@ -6485,7 +6484,7 @@ fn miner_recovers_when_broadcast_block_delay_across_tenures_occurs() {
64856484
info!("Submitted tx {tx} in to attempt to mine block N+1");
64866485
let block_n_1 = wait_for_block_proposal(30, info_before.stacks_tip_height + 1, &miner_pk)
64876486
.expect("Timed out waiting for block N+1 to be proposed");
6488-
let all_signers = signer_test.signer_public_keys();
6487+
let all_signers = signer_test.signer_test_pks();
64896488
wait_for_block_global_acceptance_from_signers(
64906489
30,
64916490
&block_n_1.header.signer_signature_hash(),
@@ -6642,7 +6641,7 @@ fn continue_after_fast_block_no_sortition() {
66426641
let burnchain = conf_1.get_burnchain();
66436642
let sortdb = burnchain.open_sortition_db(true).unwrap();
66446643

6645-
let all_signers = miners.signer_test.signer_public_keys();
6644+
let all_signers = miners.signer_test.signer_test_pks();
66466645
let get_burn_height = || {
66476646
SortitionDB::get_canonical_burn_chain_tip(sortdb.conn())
66486647
.unwrap()
@@ -6930,7 +6929,7 @@ fn signing_in_0th_tenure_of_reward_cycle() {
69306929
info!("------------------------- Test Setup -------------------------");
69316930
let num_signers = 5;
69326931
let mut signer_test: SignerTest<SpawnedSigner> = SignerTest::new(num_signers, vec![]);
6933-
let signer_public_keys = signer_test.signer_public_keys();
6932+
let signer_public_keys = signer_test.signer_test_pks();
69346933
let long_timeout = Duration::from_secs(200);
69356934
signer_test.boot_to_epoch_3();
69366935
let curr_reward_cycle = signer_test.get_current_reward_cycle();
@@ -7198,7 +7197,7 @@ fn block_commit_delay() {
71987197
.expect("Timed out waiting for block commit after new Stacks block");
71997198

72007199
// Prevent a block from being mined by making signers reject it.
7201-
let all_signers = signer_test.signer_public_keys();
7200+
let all_signers = signer_test.signer_test_pks();
72027201
TEST_REJECT_ALL_BLOCK_PROPOSAL.set(all_signers);
72037202

72047203
info!("------------------------- Test Mine Burn Block -------------------------");
@@ -7464,7 +7463,7 @@ fn block_validation_check_rejection_timeout_heuristic() {
74647463
);
74657464
let miner_sk = signer_test.running_nodes.conf.miner.mining_key.unwrap();
74667465
let miner_pk = StacksPublicKey::from_private(&miner_sk);
7467-
let all_signers = signer_test.signer_public_keys();
7466+
let all_signers = signer_test.signer_test_pks();
74687467

74697468
signer_test.boot_to_epoch_3();
74707469

@@ -7682,7 +7681,7 @@ fn block_validation_pending_table() {
76827681
.expect("Timed out waiting for pending block validation to be removed");
76837682

76847683
// for test cleanup we need to wait for block rejections
7685-
let signer_keys = signer_test.signer_public_keys();
7684+
let signer_keys = signer_test.signer_test_pks();
76867685
wait_for_block_rejections_from_signers(30, &block.header.signer_signature_hash(), &signer_keys)
76877686
.expect("Timed out waiting for block rejections");
76887687

@@ -8411,7 +8410,7 @@ fn global_acceptance_depends_on_block_announcement() {
84118410
None,
84128411
);
84138412

8414-
let all_signers = signer_test.signer_public_keys();
8413+
let all_signers = signer_test.signer_test_pks();
84158414
let miner_sk = signer_test.running_nodes.conf.miner.mining_key.unwrap();
84168415
let miner_pk = StacksPublicKey::from_private(&miner_sk);
84178416
let http_origin = format!("http://{}", &signer_test.running_nodes.conf.node.rpc_bind);
@@ -8914,7 +8913,7 @@ fn incoming_signers_ignore_block_proposals() {
89148913
info!("------------------------- Test Attempt to Mine Invalid Block {signer_signature_hash_1} -------------------------");
89158914

89168915
let short_timeout = Duration::from_secs(30);
8917-
let all_signers = signer_test.signer_public_keys();
8916+
let all_signers = signer_test.signer_test_pks();
89188917
test_observer::clear();
89198918

89208919
// Propose a block to the signers that passes initial checks but will be rejected by the stacks node
@@ -10711,7 +10710,7 @@ fn interrupt_miner_on_new_stacks_tip() {
1071110710
let (miner_pk_1, miner_pk_2) = miners.get_miner_public_keys();
1071210711
let (miner_pkh_1, miner_pkh_2) = miners.get_miner_public_key_hashes();
1071310712

10714-
let all_signers = miners.signer_test.signer_public_keys();
10713+
let all_signers = miners.signer_test.signer_test_pks();
1071510714

1071610715
// Pause Miner 2's commits to ensure Miner 1 wins the first sortition.
1071710716
skip_commit_op_rl2.set(true);
@@ -11936,7 +11935,7 @@ fn mark_miner_as_invalid_if_reorg_is_rejected() {
1193611935
config.miner.block_commit_delay = Duration::from_secs(0);
1193711936
},
1193811937
);
11939-
let all_signers = miners.signer_test.signer_public_keys();
11938+
let all_signers = miners.signer_test.signer_test_pks();
1194011939
let mut approving_signers = vec![];
1194111940
let mut rejecting_signers = vec![];
1194211941
for (i, signer_config) in miners.signer_test.signer_configs.iter().enumerate() {

0 commit comments

Comments
 (0)