diff --git a/CHANGELOG.md b/CHANGELOG.md index 93f3549ed1..22bb98fdc8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,10 @@ and this project adheres to the versioning scheme outlined in the [README.md](RE ## [Unreleased] +### 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. diff --git a/stackslib/src/net/api/postblock_proposal.rs b/stackslib/src/net/api/postblock_proposal.rs index ec65278f9f..eaec726d8b 100644 --- a/stackslib/src/net/api/postblock_proposal.rs +++ b/stackslib/src/net/api/postblock_proposal.rs @@ -98,7 +98,10 @@ define_u8_enum![ValidateRejectCode { UnknownParent = 4, NonCanonicalTenure = 5, NoSuchTenure = 6, - InvalidTransactionReplay = 7 + InvalidTransactionReplay = 7, + InvalidParentBlock = 8, + InvalidTimestamp = 9, + NetworkChainMismatch = 10 }]; pub static TOO_MANY_REQUESTS_STATUS: u16 = 429; @@ -300,7 +303,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(), }); } @@ -423,7 +426,7 @@ impl NakamotoBlockProposal { "received_mainnet" => mainnet, ); return Err(BlockValidateRejectReason { - reason_code: ValidateRejectCode::InvalidBlock, + reason_code: ValidateRejectCode::NetworkChainMismatch, reason: "Wrong network/chain_id".into(), }); } @@ -446,8 +449,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 = @@ -512,7 +515,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(), }); } @@ -525,7 +528,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 953ffdcdb3..f44aa54e3f 100644 --- a/stackslib/src/net/api/tests/postblock_proposal.rs +++ b/stackslib/src/net/api/tests/postblock_proposal.rs @@ -456,7 +456,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"); } } @@ -469,7 +469,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 b399ce51b3..08b3fa5cc1 100644 --- a/testnet/stacks-node/src/tests/nakamoto_integrations.rs +++ b/testnet/stacks-node/src/tests/nakamoto_integrations.rs @@ -3135,7 +3135,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 76691ad1cb..e6da7ea164 100644 --- a/testnet/stacks-node/src/tests/signer/v0.rs +++ b/testnet/stacks-node/src/tests/signer/v0.rs @@ -1512,7 +1512,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(); @@ -1542,7 +1542,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;