Skip to content

Commit 0902921

Browse files
committed
Add descriptive block validation errors
1 parent 2af32f9 commit 0902921

File tree

18 files changed

+498
-235
lines changed

18 files changed

+498
-235
lines changed

Cargo.lock

Lines changed: 2 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

monad-consensus-state/src/lib.rs

Lines changed: 5 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ use monad_consensus_types::{
3535
block::{
3636
BlockPolicy, BlockRange, ConsensusBlockHeader, ConsensusFullBlock, OptimisticPolicyCommit,
3737
},
38-
block_validator::{BlockValidationError, BlockValidator},
38+
block_validator::BlockValidator,
3939
checkpoint::{Checkpoint, LockedEpoch, RootInfo},
4040
metrics::Metrics,
4141
no_endorsement::{FreshProposalCertificate, NoEndorsement},
@@ -583,74 +583,16 @@ where
583583
body,
584584
Some(author_pubkey),
585585
&self.config.chain_config,
586+
self.metrics,
586587
) {
587588
Ok(block) => block,
588-
Err(BlockValidationError::SystemTxnError) => {
589-
warn!(
590-
?block_round,
591-
?block_author,
592-
?seq_num,
593-
"dropping proposal, system transaction validation failed"
594-
);
595-
self.metrics.consensus_events.failed_txn_validation += 1;
596-
return None;
597-
}
598-
Err(BlockValidationError::TxnError) => {
599-
warn!(
600-
?block_round,
601-
?block_author,
602-
?seq_num,
603-
"dropping proposal, transaction validation failed"
604-
);
605-
self.metrics.consensus_events.failed_txn_validation += 1;
606-
return None;
607-
}
608-
Err(BlockValidationError::RandaoError) => {
609-
warn!(
610-
?block_round,
611-
?block_author,
612-
?seq_num,
613-
"dropping proposal, randao validation failed"
614-
);
615-
self.metrics
616-
.consensus_events
617-
.failed_verify_randao_reveal_sig += 1;
618-
return None;
619-
}
620-
Err(BlockValidationError::HeaderPayloadMismatchError) => {
621-
// TODO: this is malicious behaviour?
622-
warn!(
623-
?block_round,
624-
?block_author,
625-
?seq_num,
626-
"dropping proposal, header payload mismatch"
627-
);
628-
return None;
629-
}
630-
Err(BlockValidationError::PayloadError) => {
631-
warn!(
632-
?block_round,
633-
?block_author,
634-
?seq_num,
635-
"dropping proposal, payload validation failed"
636-
);
637-
return None;
638-
}
639-
Err(BlockValidationError::HeaderError) => {
640-
warn!(
641-
?block_round,
642-
?block_author,
643-
?seq_num,
644-
"dropping proposal, header validation failed"
645-
);
646-
return None;
647-
}
648-
Err(BlockValidationError::TimestampError) => {
589+
Err(err) => {
649590
warn!(
650591
?block_round,
651592
?block_author,
652593
?seq_num,
653-
"dropping proposal, timestamp validation failed"
594+
?err,
595+
"dropping proposal, block validation failed"
654596
);
655597
return None;
656598
}

monad-consensus-types/src/block.rs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,6 @@ use monad_validator::signature_collection::SignatureCollection;
3636
use serde::Serialize;
3737

3838
use crate::{
39-
block_validator::BlockValidationError,
4039
checkpoint::RootInfo,
4140
payload::{ConsensusBlockBody, ConsensusBlockBodyId, RoundSignature},
4241
quorum_certificate::QuorumCertificate,
@@ -533,6 +532,11 @@ where
533532
{
534533
}
535534

535+
#[derive(Debug)]
536+
pub enum ConsensusFullBlockError {
537+
HeaderPayloadMismatch,
538+
}
539+
536540
impl<ST, SCT, EPT> ConsensusFullBlock<ST, SCT, EPT>
537541
where
538542
ST: CertificateSignatureRecoverable,
@@ -542,9 +546,9 @@ where
542546
pub fn new(
543547
header: ConsensusBlockHeader<ST, SCT, EPT>,
544548
body: ConsensusBlockBody<EPT>,
545-
) -> Result<Self, BlockValidationError> {
549+
) -> Result<Self, ConsensusFullBlockError> {
546550
if body.get_id() != header.block_body_id {
547-
return Err(BlockValidationError::HeaderPayloadMismatchError);
551+
return Err(ConsensusFullBlockError::HeaderPayloadMismatch);
548552
}
549553
Ok(Self { header, body })
550554
}

monad-consensus-types/src/block_validator.rs

Lines changed: 24 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -29,25 +29,13 @@ use monad_validator::signature_collection::{SignatureCollection, SignatureCollec
2929

3030
use crate::{
3131
block::{
32-
BlockPolicy, ConsensusBlockHeader, ConsensusFullBlock, PassthruBlockPolicy,
33-
PassthruWrappedBlock,
32+
BlockPolicy, ConsensusBlockHeader, ConsensusFullBlock, ConsensusFullBlockError,
33+
PassthruBlockPolicy, PassthruWrappedBlock,
3434
},
35+
metrics::Metrics,
3536
payload::ConsensusBlockBody,
3637
};
3738

38-
// TODO these are eth-specific types... we could make these an associated type of BlockValidator if
39-
// we care enough
40-
#[derive(Debug)]
41-
pub enum BlockValidationError {
42-
SystemTxnError,
43-
TxnError,
44-
RandaoError,
45-
HeaderError,
46-
PayloadError,
47-
HeaderPayloadMismatchError,
48-
TimestampError,
49-
}
50-
5139
#[auto_impl(Box)]
5240
pub trait BlockValidator<ST, SCT, EPT, BPT, SBT, CCT, CRT>
5341
where
@@ -59,6 +47,8 @@ where
5947
CCT: ChainConfig<CRT>,
6048
CRT: ChainRevision,
6149
{
50+
type BlockValidationError: Debug;
51+
6252
// TODO it would be less jank if the BLS pubkey was included in the block payload.
6353
//
6454
// It's weird that we need to pass in the expected author's BLS pubkey just to validate the
@@ -75,12 +65,26 @@ where
7565
body: ConsensusBlockBody<EPT>,
7666
author_pubkey: Option<&SignatureCollectionPubKeyType<SCT>>,
7767
chain_config: &CCT,
78-
) -> Result<BPT::ValidatedBlock, BlockValidationError>;
68+
metrics: &mut Metrics,
69+
) -> Result<BPT::ValidatedBlock, Self::BlockValidationError>;
7970
}
8071

8172
#[derive(Copy, Clone, Default, Debug, PartialEq, Eq)]
8273
pub struct MockValidator;
8374

75+
#[derive(Debug)]
76+
pub enum MockBlockValidationError {
77+
HeaderPayloadMismatch,
78+
}
79+
80+
impl From<ConsensusFullBlockError> for MockBlockValidationError {
81+
fn from(value: ConsensusFullBlockError) -> Self {
82+
match value {
83+
ConsensusFullBlockError::HeaderPayloadMismatch => Self::HeaderPayloadMismatch,
84+
}
85+
}
86+
}
87+
8488
impl<ST, SCT, EPT>
8589
BlockValidator<
8690
ST,
@@ -96,12 +100,15 @@ where
96100
SCT: SignatureCollection<NodeIdPubKey = CertificateSignaturePubKey<ST>>,
97101
EPT: ExecutionProtocol,
98102
{
103+
type BlockValidationError = MockBlockValidationError;
104+
99105
fn validate(
100106
&self,
101107
header: ConsensusBlockHeader<ST, SCT, EPT>,
102108
body: ConsensusBlockBody<EPT>,
103109
_author_pubkey: Option<&SignatureCollectionPubKeyType<SCT>>,
104110
_chain_config: &MockChainConfig,
111+
_metrics: &mut Metrics,
105112
) -> Result<
106113
<PassthruBlockPolicy as BlockPolicy<
107114
ST,
@@ -111,7 +118,7 @@ where
111118
MockChainConfig,
112119
MockChainRevision,
113120
>>::ValidatedBlock,
114-
BlockValidationError,
121+
Self::BlockValidationError,
115122
> {
116123
let full_block = ConsensusFullBlock::new(header, body)?;
117124
Ok(PassthruWrappedBlock(full_block))

monad-eth-block-policy/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ bench = false
1212
monad-chain-config = { workspace = true }
1313
monad-consensus-types = { workspace = true }
1414
monad-crypto = { workspace = true }
15-
monad-eth-txpool-types = { workspace = true }
1615
monad-eth-types = { workspace = true }
1716
monad-state-backend = { workspace = true }
1817
monad-system-calls = { workspace = true }
@@ -24,6 +23,7 @@ alloy-consensus = { workspace = true }
2423
alloy-eips = { workspace = true }
2524
alloy-primitives = { workspace = true }
2625
itertools = { workspace = true }
26+
serde = { workspace = true }
2727
sorted_vector_map = { workspace = true }
2828
tracing = { workspace = true }
2929

0 commit comments

Comments
 (0)