Skip to content

Commit 684124a

Browse files
committed
sim-rs: validate IB headers before propagating them
1 parent c011c7f commit 684124a

File tree

3 files changed

+34
-19
lines changed

3 files changed

+34
-19
lines changed

data/simulation/trace.rust.d.ts

+1
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ type BlockOrTaskType =
2020
| "EBBlock"
2121
| "VTBundle"
2222
| "IBBlock"
23+
| "IBHeader"
2324
| "Transaction";
2425
type Action = "Validated" | "Generated";
2526
type RustCpuTaskType = `${BlockOrTaskType}${Action}`;

data/simulation/trace.rust.schema.json

+2
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,8 @@
151151
"EBBlockValidated",
152152
"IBBlockGenerated",
153153
"IBBlockValidated",
154+
"IBHeaderGenerated",
155+
"IBHeaderValidated",
154156
"RBBlockGenerated",
155157
"RBBlockValidated",
156158
"TransactionGenerated",

sim-rs/sim-core/src/sim/node.rs

+31-19
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,8 @@ enum CpuTask {
4848
RBBlockValidated(NodeId, Arc<Block>),
4949
/// An input block has been generated and is ready to propagate
5050
IBBlockGenerated(InputBlock),
51+
/// An IB header has been received and validated, and is ready to propagate
52+
IBHeaderValidated(NodeId, InputBlockHeader, bool),
5153
/// An input block has been received and validated, and is ready to propagate
5254
IBBlockValidated(NodeId, Arc<InputBlock>),
5355
/// An endorser block has been generated and is ready to propagate
@@ -64,14 +66,15 @@ impl CpuTask {
6466
fn task_type(&self) -> String {
6567
match self {
6668
Self::TransactionValidated(_, _) => "TransactionValidated",
67-
Self::RBBlockGenerated(_) => "PraosBlockGenerated",
68-
Self::RBBlockValidated(_, _) => "PraosBlockValidated",
69-
Self::IBBlockGenerated(_) => "InputBlockGenerated",
70-
Self::IBBlockValidated(_, _) => "InputBlockValidated",
71-
Self::EBBlockGenerated(_) => "EndorserBlockGenerated",
72-
Self::EBBlockValidated(_, _) => "EndorserBlockValidated",
73-
Self::VTBundleGenerated(_) => "VoteBundleGenerated",
74-
Self::VTBundleValidated(_, _) => "VoteBundleValidated",
69+
Self::RBBlockGenerated(_) => "RBBlockGenerated",
70+
Self::RBBlockValidated(_, _) => "RBBlockValidated",
71+
Self::IBBlockGenerated(_) => "IBBlockGenerated",
72+
Self::IBHeaderValidated(_, _, _) => "IBHeaderValidated",
73+
Self::IBBlockValidated(_, _) => "IBBlockValidated",
74+
Self::EBBlockGenerated(_) => "EBBlockGenerated",
75+
Self::EBBlockValidated(_, _) => "EBBlockValidated",
76+
Self::VTBundleGenerated(_) => "VTBundleGenerated",
77+
Self::VTBundleValidated(_, _) => "VTBundleValidated",
7578
}
7679
.to_string()
7780
}
@@ -82,6 +85,7 @@ impl CpuTask {
8285
Self::RBBlockGenerated(_) => "".to_string(),
8386
Self::RBBlockValidated(_, _) => "".to_string(),
8487
Self::IBBlockGenerated(id) => id.header.id.to_string(),
88+
Self::IBHeaderValidated(_, id, _) => id.id.to_string(),
8589
Self::IBBlockValidated(_, id) => id.header.id.to_string(),
8690
Self::EBBlockGenerated(_) => "".to_string(),
8791
Self::EBBlockValidated(_, _) => "".to_string(),
@@ -329,9 +333,9 @@ impl Node {
329333
vec![time]
330334
}
331335
CpuTask::IBBlockGenerated(_) => vec![cpu_times.ib_generation],
336+
CpuTask::IBHeaderValidated(_, _, _) => vec![cpu_times.ib_head_validation],
332337
CpuTask::IBBlockValidated(_, ib) => vec![
333-
cpu_times.ib_head_validation
334-
+ cpu_times.ib_body_validation_constant
338+
cpu_times.ib_body_validation_constant
335339
+ (cpu_times.ib_body_validation_per_byte * ib.bytes() as u32),
336340
],
337341
CpuTask::EBBlockGenerated(_) => vec![cpu_times.eb_generation],
@@ -394,6 +398,7 @@ impl Node {
394398
CpuTask::RBBlockGenerated(block) => self.finish_generating_block(block)?,
395399
CpuTask::RBBlockValidated(from, block) => self.finish_validating_block(from, block)?,
396400
CpuTask::IBBlockGenerated(ib) => self.finish_generating_ib(ib)?,
401+
CpuTask::IBHeaderValidated(from, ib, has_body) => self.finish_validating_ib_header(from, ib, has_body)?,
397402
CpuTask::IBBlockValidated(from, ib) => self.finish_validating_ib(from, ib)?,
398403
CpuTask::EBBlockGenerated(eb) => self.finish_generating_eb(eb)?,
399404
CpuTask::EBBlockValidated(from, eb) => self.finish_validating_eb(from, eb)?,
@@ -440,7 +445,7 @@ impl Node {
440445
self.receive_request_ib_header(from, id)?;
441446
}
442447
SimulationMessage::IBHeader(header, has_body) => {
443-
self.receive_ib_header(from, header, has_body)?;
448+
self.receive_ib_header(from, header, has_body);
444449
}
445450

446451
// IB transmission
@@ -907,22 +912,29 @@ impl Node {
907912
Ok(())
908913
}
909914

910-
fn receive_ib_header(
911-
&mut self,
912-
from: NodeId,
913-
header: InputBlockHeader,
914-
has_body: bool,
915-
) -> Result<()> {
915+
fn receive_ib_header(&mut self, from: NodeId, header: InputBlockHeader, has_body: bool) {
916916
let id = header.id;
917917
if self
918918
.leios
919919
.ibs
920920
.get(&id)
921921
.is_some_and(|ib| ib.header().is_some())
922922
{
923-
return Ok(());
923+
return;
924924
}
925-
self.leios.ibs.insert(id, InputBlockState::Pending(header));
925+
self.leios
926+
.ibs
927+
.insert(id, InputBlockState::Pending(header.clone()));
928+
self.schedule_cpu_task(CpuTask::IBHeaderValidated(from, header, has_body));
929+
}
930+
931+
fn finish_validating_ib_header(
932+
&mut self,
933+
from: NodeId,
934+
header: InputBlockHeader,
935+
has_body: bool,
936+
) -> Result<()> {
937+
let id = header.id;
926938
// We haven't seen this header before, so propagate it to our neighbors
927939
for peer in &self.consumers {
928940
if *peer == from {

0 commit comments

Comments
 (0)