From 03e691cce8a8a5c694046eb536ab0fd841171f96 Mon Sep 17 00:00:00 2001 From: Jacinta Ferrant Date: Fri, 18 Apr 2025 12:22:29 -0700 Subject: [PATCH 1/3] Reconsider blocks that were rejected with an InvalidParentBlock Signed-off-by: Jacinta Ferrant --- stacks-signer/src/v0/signer.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/stacks-signer/src/v0/signer.rs b/stacks-signer/src/v0/signer.rs index 1fffc10323..8cc069c54f 100644 --- a/stacks-signer/src/v0/signer.rs +++ b/stacks-signer/src/v0/signer.rs @@ -1541,7 +1541,8 @@ fn should_reevaluate_block(block_info: &BlockInfo) -> bool { | RejectReason::TestingDirective | RejectReason::InvalidTenureExtend | RejectReason::NotRejected - | RejectReason::Unknown(_) => true, + | RejectReason::Unknown(_) + | RejectReason::InvalidParentBlock => true, RejectReason::ValidationFailed(_) | RejectReason::RejectedInPriorRound | RejectReason::SortitionViewMismatch @@ -1550,7 +1551,6 @@ fn should_reevaluate_block(block_info: &BlockInfo) -> bool { | RejectReason::PubkeyHashMismatch | RejectReason::InvalidMiner | RejectReason::NotLatestSortitionWinner - | RejectReason::InvalidParentBlock | RejectReason::DuplicateBlockFound => { // No need to re-validate these types of rejections. false From 9a19b379d2f63cacca9c82b91fe0836e553200c5 Mon Sep 17 00:00:00 2001 From: Jacinta Ferrant Date: Mon, 21 Apr 2025 10:43:18 -0700 Subject: [PATCH 2/3] Add new ValidateRejectCodes that are more descriptive and update failure to find a parent block id as an UnknownParent error code Signed-off-by: Jacinta Ferrant --- stacks-signer/src/v0/signer.rs | 4 ++-- stackslib/src/net/api/postblock_proposal.rs | 17 ++++++++++------- .../src/net/api/tests/postblock_proposal.rs | 4 ++-- .../src/tests/nakamoto_integrations.rs | 2 +- testnet/stacks-node/src/tests/signer/v0.rs | 4 ++-- 5 files changed, 17 insertions(+), 14 deletions(-) diff --git a/stacks-signer/src/v0/signer.rs b/stacks-signer/src/v0/signer.rs index 8cc069c54f..1fffc10323 100644 --- a/stacks-signer/src/v0/signer.rs +++ b/stacks-signer/src/v0/signer.rs @@ -1541,8 +1541,7 @@ fn should_reevaluate_block(block_info: &BlockInfo) -> bool { | RejectReason::TestingDirective | RejectReason::InvalidTenureExtend | RejectReason::NotRejected - | RejectReason::Unknown(_) - | RejectReason::InvalidParentBlock => true, + | RejectReason::Unknown(_) => true, RejectReason::ValidationFailed(_) | RejectReason::RejectedInPriorRound | RejectReason::SortitionViewMismatch @@ -1551,6 +1550,7 @@ fn should_reevaluate_block(block_info: &BlockInfo) -> bool { | RejectReason::PubkeyHashMismatch | RejectReason::InvalidMiner | RejectReason::NotLatestSortitionWinner + | RejectReason::InvalidParentBlock | RejectReason::DuplicateBlockFound => { // No need to re-validate these types of rejections. false diff --git a/stackslib/src/net/api/postblock_proposal.rs b/stackslib/src/net/api/postblock_proposal.rs index 0ba13f2f8f..7e2a2f6d81 100644 --- a/stackslib/src/net/api/postblock_proposal.rs +++ b/stackslib/src/net/api/postblock_proposal.rs @@ -87,7 +87,10 @@ define_u8_enum![ValidateRejectCode { ChainstateError = 3, UnknownParent = 4, NonCanonicalTenure = 5, - NoSuchTenure = 6 + NoSuchTenure = 6, + InvalidParentBlock = 7, + InvalidTimestamp = 8, + NetworkChainMismatch = 9 }]; pub static TOO_MANY_REQUESTS_STATUS: u16 = 429; @@ -287,7 +290,7 @@ impl NakamotoBlockProposal { "highest_header.height" => highest_header.anchored_header.height(), ); return Err(BlockValidateRejectReason { - reason_code: ValidateRejectCode::InvalidBlock, + reason_code: ValidateRejectCode::InvalidParentBlock, reason: "Block is not higher than the highest block in its tenure".into(), }); } @@ -405,7 +408,7 @@ impl NakamotoBlockProposal { "received_mainnet" => mainnet, ); return Err(BlockValidateRejectReason { - reason_code: ValidateRejectCode::InvalidBlock, + reason_code: ValidateRejectCode::NetworkChainMismatch, reason: "Wrong network/chain_id".into(), }); } @@ -428,8 +431,8 @@ impl NakamotoBlockProposal { &self.block.header.parent_block_id, )? .ok_or_else(|| BlockValidateRejectReason { - reason_code: ValidateRejectCode::InvalidBlock, - reason: "Invalid parent block".into(), + reason_code: ValidateRejectCode::UnknownParent, + reason: "Unknown parent block".into(), })?; let burn_view_consensus_hash = @@ -494,7 +497,7 @@ impl NakamotoBlockProposal { "parent_block_timestamp" => parent_nakamoto_header.timestamp, ); return Err(BlockValidateRejectReason { - reason_code: ValidateRejectCode::InvalidBlock, + reason_code: ValidateRejectCode::InvalidTimestamp, reason: "Block timestamp is not greater than parent block".into(), }); } @@ -507,7 +510,7 @@ impl NakamotoBlockProposal { "current_time" => get_epoch_time_secs(), ); return Err(BlockValidateRejectReason { - reason_code: ValidateRejectCode::InvalidBlock, + reason_code: ValidateRejectCode::InvalidTimestamp, reason: "Block timestamp is too far into the future".into(), }); } diff --git a/stackslib/src/net/api/tests/postblock_proposal.rs b/stackslib/src/net/api/tests/postblock_proposal.rs index f561567d3c..003287d4d2 100644 --- a/stackslib/src/net/api/tests/postblock_proposal.rs +++ b/stackslib/src/net/api/tests/postblock_proposal.rs @@ -473,7 +473,7 @@ fn test_try_make_response() { reason, .. }) => { - assert_eq!(reason_code, ValidateRejectCode::InvalidBlock); + assert_eq!(reason_code, ValidateRejectCode::InvalidTimestamp); assert_eq!(reason, "Block timestamp is not greater than parent block"); } } @@ -486,7 +486,7 @@ fn test_try_make_response() { reason, .. }) => { - assert_eq!(reason_code, ValidateRejectCode::InvalidBlock); + assert_eq!(reason_code, ValidateRejectCode::InvalidTimestamp); assert_eq!(reason, "Block timestamp is too far into the future"); } } diff --git a/testnet/stacks-node/src/tests/nakamoto_integrations.rs b/testnet/stacks-node/src/tests/nakamoto_integrations.rs index b3472fad66..d35e8a6fd1 100644 --- a/testnet/stacks-node/src/tests/nakamoto_integrations.rs +++ b/testnet/stacks-node/src/tests/nakamoto_integrations.rs @@ -3133,7 +3133,7 @@ fn block_proposal_api_endpoint() { sign(&p) }, HTTP_ACCEPTED, - Some(Err(ValidateRejectCode::InvalidBlock)), + Some(Err(ValidateRejectCode::NetworkChainMismatch)), ), ( "Invalid `miner_signature`", diff --git a/testnet/stacks-node/src/tests/signer/v0.rs b/testnet/stacks-node/src/tests/signer/v0.rs index 350705be2f..227bea2625 100644 --- a/testnet/stacks-node/src/tests/signer/v0.rs +++ b/testnet/stacks-node/src/tests/signer/v0.rs @@ -1511,7 +1511,7 @@ fn block_proposal_rejection() { signer_test.wait_for_validate_reject_response(short_timeout, block_signer_signature_hash_2); assert!(matches!( reject.reason_code, - ValidateRejectCode::InvalidBlock + ValidateRejectCode::UnknownParent )); let start_polling = Instant::now(); @@ -1541,7 +1541,7 @@ fn block_proposal_rejection() { found_signer_signature_hash_2 = true; assert!(matches!( reason_code, - RejectCode::ValidationFailed(ValidateRejectCode::InvalidBlock) + RejectCode::ValidationFailed(ValidateRejectCode::UnknownParent) )); } else { continue; From aaabb900cb3ac11732e9729eac13ae87fc5ac5c3 Mon Sep 17 00:00:00 2001 From: Jacinta Ferrant Date: Tue, 22 Apr 2025 15:42:36 -0700 Subject: [PATCH 3/3] Update changelog Signed-off-by: Jacinta Ferrant --- CHANGELOG.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9c1fbc3a7a..22bb98fdc8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,9 +7,12 @@ and this project adheres to the versioning scheme outlined in the [README.md](RE ## [Unreleased] -### Changed +### Added - Added new `ValidateRejectCode` values to the `/v3/block_proposal` endpoint + +### Changed + - Reduce the default `block_rejection_timeout_steps` configuration so that miners will retry faster when blocks fail to reach 70% approved or 30% rejected. ## [3.1.0.0.8]